Skip to content

Instantly share code, notes, and snippets.

@rsomani95
Last active January 23, 2022 18:37
Show Gist options
  • Save rsomani95/de0045c45f76b4f2ceb3a8a40fb186a4 to your computer and use it in GitHub Desktop.
Save rsomani95/de0045c45f76b4f2ceb3a8a40fb186a4 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "8a21f105",
"metadata": {},
"outputs": [],
"source": [
"# Display all outputs\n",
"from IPython.core.interactiveshell import InteractiveShell\n",
"InteractiveShell.ast_node_interactivity = \"all\""
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "9e9e1606",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"torch : 1.10.0a0+3fd9dcf\n",
"torchvision : 0.11.0a0\n",
"nvidia.dali : 1.5.0\n",
"numpy : 1.21.2\n",
"cv2 : 4.5.4-dev\n",
"PIL : 7.0.0.post3\n"
]
}
],
"source": [
"import os\n",
"import shutil\n",
"import sys\n",
"from pathlib import Path\n",
"\n",
"import cv2\n",
"import numpy as np\n",
"import nvidia.dali.fn as fn\n",
"import nvidia.dali.types as types\n",
"import torch, torchvision, nvidia.dali, numpy, cv2, PIL\n",
"\n",
"ver = lambda x: f\"{x.__name__.ljust(14)}: {x.__version__.rjust(3)}\"\n",
"print(\"\\n\".join(list(map(ver, [torch, torchvision, nvidia.dali, numpy, cv2, PIL]))))\n",
"\n",
"from nvidia.dali import pipeline_def\n",
"from PIL import Image\n",
"from PIL.ImageDraw import ImageDraw\n",
"from torchvision.transforms.functional import InterpolationMode\n",
"from torchvision.transforms.functional import resize as torch_resize\n",
"from torchvision.transforms.functional import to_pil_image, to_tensor\n",
"\n",
"mkdir = lambda x: Path(x).mkdir()\n",
"\n",
"\n",
"def create_test_img(size=(128, 128), outline_width: int = 3):\n",
" assert size[0] == size[1], f\"Square image dimensions expected\"\n",
"\n",
" im = Image.new(\"RGB\", size, color=(255, 255, 255))\n",
" d = ImageDraw(im)\n",
" qtr = int(size[0] / 4)\n",
" pad = int(0.015625 * size[0])\n",
" d.ellipse((qtr, qtr, qtr * 3, qtr * 3), fill=None, outline=0, width=outline_width)\n",
" d.rectangle(\n",
" ((pad, pad), (size[0] - pad, size[1] - pad)), fill=None, outline=0, width=outline_width\n",
" )\n",
"\n",
" return im\n",
"\n",
"\n",
"def resize_opencv(img: Image.Image, size=(128, 128), interpolation=cv2.INTER_LINEAR):\n",
" # im = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2RGB)\n",
" im = np.array(img)\n",
" im = cv2.resize(im, size, interpolation)\n",
" return Image.fromarray(im)\n",
"\n",
"\n",
"def resize_torch(\n",
" img: Image.Image,\n",
" size=(128, 128),\n",
" interpolation=InterpolationMode.BICUBIC,\n",
" antialias: bool = None,\n",
"):\n",
" im = torch_resize(to_tensor(img), size, interpolation, antialias=antialias)\n",
" # return im\n",
" return to_pil_image(im)\n",
"\n",
"\n",
"def resize_dali(img: str, size=(128, 128), interpolation=types.INTERP_LINEAR, device=\"gpu\"):\n",
" # Setup directory structure for DALI\n",
" if Path(\"tmp-test\").exists():\n",
" shutil.rmtree(\"tmp-test\")\n",
" mkdir(\"tmp-test\")\n",
" mkdir(\"tmp-test/0\")\n",
" img.save(\"tmp-test/0/test-img.png\", quality=100)\n",
"\n",
" # Define pipeline\n",
" @pipeline_def\n",
" def test():\n",
" imgs, _ = fn.readers.file(file_root=\"tmp-test\")\n",
" imgs = fn.decoders.image(imgs, device=\"mixed\" if device == \"gpu\" else \"cpu\")\n",
" imgs = fn.resize(\n",
" imgs,\n",
" device=\"gpu\",\n",
" resize_x=size[0],\n",
" resize_y=size[0],\n",
" mode=\"stretch\",\n",
" interp_type=interpolation,\n",
" )\n",
" return imgs, _\n",
"\n",
" # Build Pipeline\n",
" pipe = test(batch_size=1, num_threads=1, device_id=0)\n",
" pipe.build()\n",
"\n",
" # Run Pipeline and get outputs\n",
" img = pipe.run()[0]\n",
" img = img.as_cpu().as_array()[0] # 0th element of the batch\n",
" assert img.ndim == 3\n",
"\n",
" return Image.fromarray(img)\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "e8b321fa",
"metadata": {},
"outputs": [],
"source": [
"import fastcore.all as fastcore\n",
"import operator\n",
"from functools import reduce\n",
"from typing import List\n",
"\n",
"@fastcore.patch\n",
"def __or__(self: Image.Image, other: Image.Image):\n",
" \"Horizontally stack two PIL Images\"\n",
" assert isinstance(other, Image.Image)\n",
" widths, heights = zip(*(i.size for i in [self, other]))\n",
" \n",
" new_img = Image.new(\"RGB\", (sum(widths), max(heights)))\n",
" x_offset = 0\n",
" for img in [self, other]:\n",
" new_img.paste(img, (x_offset, 0))\n",
" x_offset += img.size[0]\n",
" return new_img\n",
"\n",
"def view_as_row(imgs: List[Image.Image]):\n",
" assert isinstance(imgs, list)\n",
" return reduce(operator.or_, imgs)"
]
},
{
"cell_type": "markdown",
"id": "29bf2053",
"metadata": {},
"source": [
"### Create Test Image"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "da5e8995",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAACAAAAAgACAIAAAA9xURnAABZuUlEQVR4nOzd25LbNhaG0eZU3v+VORedsjtNieIBIIAfa126amJN4sMWvg1yWdf1CwAAAAAAyPK/1h8AAAAAAAAoTwAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAECgf2r/BMuy1P4pAAAAAABgROu61vuHuwEAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQ6J/nf8qqLzUGAAAAAIA+Lcvy5E/nBgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAAAAAgkAAAAAAAAACBBAAAAAAAAAgkAAAAAAAAQCABAAAAAAAAAgkAAAAAAAAQSAAAAAAAAIBAAgAAAAAAAAQSAAAAAAAAIJAAAAAAAAAAgQQAAAAAAAAIJAAAAAAAAEAgAQAAAAAAAAIJAAAAAAAAEEgAAAAAAACAQAIAAAAAAAAEEgAAAAAAACCQAAAAAAAAAIEEAAAAAAAACCQAAAAAAABAIAEAAAAAAAACCQAAAAAAABBIAAAAAAAAgEACAAAAAAAABBIAAAAA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AAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACCBAAAAAAAAAgSAAAAAAAAIEgAAAAAAACAIAEAAAAAAACC/jn+X/nr16/j/6UAAAAAAHApTgAAAAAAAECQAAAAAAAAAEECAAAAAAAABAkAAAAAAAAQJAAAAAAAAEDQr/v9fvbPAAAAAAAAbMwJAAAAAAAACBIAAAAAAAAgSAAAAAAAAIAgAQAAAAAAAIIEAAAAAAAACBIAAAAAAAAgSAAAAAAAAIAgAQAAAAAAAIIEAAAAAAAACBIAAAAAAAAgSAAAAAAAAIAgAQAAAAAAAIIEAAAAAAAACBIAAAAAAAAgSAAAAAAAAIAgAQAAAAAAAIIEAAAAAAAACBIAAAAAAAAgSAAAAAAAAIAgAQAAAAAAAIIEAAAAAAAACBIAAAAAAAAgSAAAAAAAAIAgAQAAAAAAAIIEAAAAAAAACBIAAAAAAAAgSAAAAAAAAIAgAQAAAAAAAIIEAAAAAAAACBIAAAAAAAAg6L/WQLkacC4uIgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=2048x2048 at 0x7F4864347520>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img = create_test_img((2048, 2048), outline_width=6)\n",
"size = (224, 224) # Output size\n",
"img"
]
},
{
"cell_type": "markdown",
"id": "717813bb",
"metadata": {},
"source": [
"### DALI"
]
},
{
"cell_type": "markdown",
"id": "342b17e5",
"metadata": {},
"source": [
"#### Correct Outputs"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "1ab0d799",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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r16dPXs2BkatDVl9f+6551iW/fe//00iX+yiWo7FYmFZdu/evdeuXXvrrbfIY3JiFwX/g2GYiRMnMgyzd+9eB7wB5Xn+0KFDd+/enTFjhpwap6ySQKFQzJ079+jRow74HpqcnJytW7e+/vrrcmqdcqJQKARBeOedd44cOZKUlMSyrIMMlUi6Z2Zmbtq0iZzdK5vhkcyo1eonn3zy0qVLaWlpDrVTRBCEU6dOpaenJyYm6nQ6scuxJ1kFPEVRarX6jTfe+OGHH06ePCl2LS0nLy/v448/fuedd5ydncWuBX6fLdU2bty4ffv2n376SaVSyT7jSbrn5OS8//77X375JUVRPM8j4FstvV4/Z86ckydPHjlyxHHmQc+dO7d37945c+Z4enqKXYudyS3gKYrSarVLlizZtm1bVlaWI7TRK1eufPTRR2+88YY8tn3KGE3TZGC0cePGL7744vDhwyqVSsZz9STdL1y4sHz58o8++og8NIj1o1bOYDA89dRTR44cOX78uOzH8YIgnDt3bvfu3QkJCZI+kvaPyPPD5ubm9uabb27dujUjI0PGGS8IQm5u7j//+c/Fixf7+vqKXQ78OYZhyLPgGzdu3LhxY0pKCsuyssx4ku6nT59+++23//nPf5LXveNMG0nw8/N76qmnDh48eOjQIRmvx/M8f+rUqV27ds2YMSMoKEjscpqFPAOeoihXV9elS5fu2bNn3759srwPFQQhIyNjw4YNy5Yt8/HxEbscaChyTD3Lsl988cW333775ZdfsizL87xsWqkgCOQX3Ldv38qVKzdv3uzh4cFxHLbNS4ifn99zzz2XmZm5d+9eWd6AWq3W9PT0ffv2PfPMM3JNd0rGAU9RlFarffPNN8kMtswWOzmO27p164EDB5YvX46ZeclRKBQkzjds2HDlypW///3vDMOQo23FLq2prFYrTdMKhWL16tX79u3bsmULmZlHukuOwWB47rnnbt++/fnnn1dXV4tdjj3V19d//fXXZ8+enTt3rixn5m3kHPAURanV6ueff97b2/vdd981Go1il2MftbW1q1evrq6uXrhwocz2fDoOhmEEQRAEYenSpT4+PnPnziWPhkt6tGQ7WH7hwoVVVVWrVq2iKIrneczMS5Rer09MTHR1df3kk0/u3Lkjdjn2UVZW9umnn9bX1z/zzDMeHh5il9O8ZB7wFEUpFIrHHnts0qRJCxYsyM7OlvSSvCAI+fn5r732Wp8+fZ555hk8ESdpZDO51WqdO3fuk08+OX369OPHj7MsS6a4xa7u4ZAlBpZlL168OG3atEGDBv3tb3/jeV4QBOyqkzS1Wh0fH9+/f/9169ZlZGRIrmXej+f57Ozs1atXd+3adebMmY4wOnKIeTOapnv06PH2229/8MEHoaGhjz/+uBTPabdYLLt37/7pp58WLlzYvn17scsBOyCz2RaLJTo6ev369QsXLjxy5MiCBQvIN5VKpSSeKCP76SiK+te//nXw4MHly5cHBQXZvglSp1AooqKifHx8tm7dmpeXN3HiRCm+RLWmpiY5Ofn8+fNTp04NCQmRxCer6Rzo5trHx2f58uWenp4LFy68cuWKtIbyN2/eXLJkSW1t7Ycffoh0lxlyzp2np+enn37q5eWVmJh4/vx5lmXJOfZiV/cgpDyWZQsLC2fPnl1bW7tly5agoCCO45DuckLTdGBg4CuvvOLi4rJmzZpz585JaE+oIAiXL19es2aNyWSaP39+aGiog6Q75SAjeBuWZceNGxceHr5mzZpOnTrFx8e3/lvRmpqapKSkY8eOzZs3LygoyHGapkMhb5kTBCExMTE2Nnb58uXt27d/4YUXnJ2dBUFohcvYZDMd2UD38ccfnzlzhnSdZGMBttTJklarnThxYrdu3b799tszZ86MGjXK19e3lfdIpaWlP/7449WrVydMmBAWFuZoC0aO9dsS/v7+b7/9dmBg4Pz583/44YdWu8Ge47i0tLSXXnpJo9H83//9X3BwcCv/LEFTMAyjUCg4jmvbtu369es7deo0e/bszz77jEzjU78Ml0VntVrJi18ZhtmxY8cTTzyh0+k+/fTT0NBQi8VC07Sj9aEOhabpTp06vfjii35+fmvXrv3+++9b7Qb7urq6ffv2ffjhh2q1+sUXX3zkkUccsGU66I02y7JDhw7t06fPnj17Fi9ePGHChIiICI1GI3Zd/2E2m8+fP799+/YuXbq8//77BoNB7IqghdheGD958uRx48b961//eumll4YMGTJ+/HgyLCZvWW35ropso1MqleRuY//+/fv27fP39//4449dXV3JwB3T8g5Cq9WOGjUqIiIiNTV13bp14eHhERERrq6urWQEUlVVde7cuePHj3t7e7/wwgt+fn6tpLCW56ABTzg7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\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=672x224 at 0x7F4671E4F4C0>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# -- DALI\n",
"# --- Correct outputs\n",
"results = [\n",
" resize_dali(img, size, interpolation=types.INTERP_GAUSSIAN),\n",
" resize_dali(img, size, interpolation=types.INTERP_LANCZOS3),\n",
" resize_dali(img, size, interpolation=types.INTERP_TRIANGULAR),\n",
"]\n",
"view_as_row(results)"
]
},
{
"cell_type": "markdown",
"id": "d9832a07",
"metadata": {},
"source": [
"#### Wrong Outputs"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9cc85cf6",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAqAAAADgCAIAAABTmUPXAAAPtUlEQVR4nO3dz28U5R8H8JlKDKYFkiIcDDdu0ODNouEAB8EQSUgwXPBkwoG/QD1ZLv74CyCReIKLaCIYjcGDPaBpORLAi9wkxh80AdsEjOx8DyP73UBLt+12n3k+83qdgJTdT595d94zs7PbsqqqAgCIZST1AADA4Cl4AAhoQ/dP09PT09PT6SaB/zx8+PCjjz564h/lk+aYmpp64l/KskwxCCyi+8p72f3T1NTU06mF4SvL8ulbQ+SThlg0n4v+IwxfbxRdogeAgBQ8AASk4AEgIAUPAAEpeAAISMEDQEAKHgACUvAAEJCCB4CAFDwABKTgASAgBQ8AASl4AAhIwQNAQAoeAAJS8AAQkIIHgIAUPAAEpOABICAFDwABKXgACEjBA0BACh4AAlLwABCQggeAgBQ8AASk4AEgIAUPAAEpeAAISMEDQEAKHgACUvAAEJCCB4CAFDwABKTgASAgBQ8AASl4AAhIwQNAQAoeAAJS8AAQkIIHgIAUPAAEpOABICAFDwABKXgACEjBA0BACh4AAlLwABCQggeAgBQ8AASk4AEgIAW/SgsLC2XfFhYWUs9Lu8zNzfWfz7m5udTz0jr95zP1pBlT8P2qo/biiy/+9NNPRVGMjo5WfRsdHa0fZM+ePSLLeqhztWPHju+++64oivHx8f7zOT4+Xj/I3r175ZP18HRb95/PZzwIz6bgn+X7778vy/Lo0aPF4zj+9ddfr7322qof8Pr1693IvvXWW2VZTkxMDGpa2ubChQtlWR4/frx4nM9ff/31jTfeWPUDzszMdPP59ttvl2W5b9++gY1L+3T7+Om2XoXeB1H2/VDwi3jw4EFZllNTU6+//npVVV999dV6PMsXX3xRVdWNGzdmZmbKsnz33XfX41mI586dO2VZnj59+sSJE1VVff755+vxLOfPn6+q6urVq9PT0/XTrcezEFK3d9de6kt5uuzX41lytyH1AM3Se7A5tCfdu3dvN6b1sw/tqclLknzu37+/frpNmzbNz8/LJ0tJks/i8T7T/vNpzuD/U5blzz//PPxo9qqf/dGjR2VZiim9yrKcnZ1Nm8+///67qqr5+XlnSzwhVbX36j2hTzVD0ziDL+o2bU6hPvfcc92YNmcqUmlaPsfGxuSTrqbls+g5oW/UVEm0+gy+4Zd06h8bR6Ot1fx8Fs6WWkw+m6+lZ/Dbtm3bsmVLY6PZ1T0IdTTaKhMTE90T5Yarqur+/ftZ/DQxKA2v9l4t33+2seBz3NhVVY2MjNQvz6eehfWVXT43b95cX2rKa2xWJ8cN3dp8tqvgDx069Oqrr2a6mTudzuzsbPeWe+I5duzYnj17Mt2+VVVNT08fOHAg0/lZVgNfbu9fO0/lW1TwZVl2Op2sz4AnJydbeygaXoDNWr+hLsA3wtNibNa25bMtN9nVGzXrdu9qW0bbINIGDfODRpd8ZqoVBR8pnbWqqv7888/UUzAYIfN5+/bt1FMwGCHzmXqEIQle8IcPHy6Cbs7t27cXrX8TSO66HyOfepDB27lzZyGfmcvobvnVCZ/PyAX/zjvvfPPNN6mnWF+tutwUzMmTJ9fpY+SbQz7zFe/E/Wnh8xn2JrsAt9T1qX4HXafTST0IK9CGvWfNLSM5as8mi53PmGfw7Wn3WqfTGRmJuSlDCrxDWVT486Rg5DOMgK1w+PDhVrV7rYXfcqaOHz/eqr1nLfA+NJi2tXstaj4DFvy3334bclMtq6qqycnJ1FOwjPCvuy+lqqqDBw+mnoJltLDdayE7PlrBx9tCK/L111+39uczCy3P55kzZ1KPwLO0PJ/xdp6hCr6dF5d6bd++3YvxjSWfO3fubHmFNJl8FuEOceKUgXTWQl5oCkA+a/LZTPJZC5bPIAV/6NAh7xPrCpbRAI4dO2bv2SWfTaPde0XKZ5CC//3338NskoGYmZlJPQL/Nzc3l3qEZvnhhx9Sj8D/afcnhFmQCB904/DzaZOTkz79piHk82n79++3LA1hQywqxrJkfwa/bdu2AJthPXhnfBNMTEzI56IiXQjNV4waWw8x8pl9wW/atCn1CM3lRze5jRs3ph6hue7du5d6BFhSgP1n3pfoHX4uyxIlZPGfbfPmzZYoIYu/rNyXKO8z+KyXfji8DJ+QfC7LEiVk8ZeV+xJlXPABXiAZgrIsLVQSlr1PFioJy96nrBcq44LP/dhqaCxUEpa9TxYqCcvep6wXKteCz/qoavgs15BZ8BWxXENmwVck3+XKteBv3bqVeoScZH0QmiMfNLQi8jlkFnxF8l2uLO+iz/3OxiQs2tBY6lWwaENjqVch00XL9Qyelbp8+XLqEWBJ58+fTz0CLCnHdi9yLPgHDx5kutZpHTly5NSpU6mniO/OnTvyuQonTpw4efJk6ilaQT7bI7+Cf+GFF1KPkKuzZ8+mHiG+HTt2pB4hV+fOnUs9Qnz53i+WXI5Ll1/Bf/zxx6lHyFVVVQ7e19vU1FTqEXIlnENgkVctx6XL7Ca7iYmJGzdupJ4iYyMjIznGNBf79u27evVq6ikylumtTLmwvGuU3QJmdgZ/8+bN1CPAkn788cfUIwD8J7OCZ42OHDmSegRY0okTJ1KPAHFkVvB5XR5poMuXL/uMoPUjn2t0/vz52dnZ1FOEJZ9rlN0C5lTwOd7E2EC7d+9OPUJM8jkQe/fuTT1CTPI5EHktY04FDwD0ScG3zq5du1KPAEuanJxMPQIEkVPBa6aB8E6EdaKZBsLv6aHJ8noZPqeC10yDsrCwkHqEgDTToMzNzaUeIaC8momByKbgddIAjY2NpR4hGp00QFu3bk09Aiwpo/vssil4nUST6SSaLKNOYoCyKXgAoH8KHgACUvAAEJCCB4CAFHwbjY6Oph4BljQ+Pp56BIhAwQNAQAoeAAJS8AAQkIJvo3///Tf1CLCkf/75J/UIEIGCb6OHDx+mHgGWND8/n3oEiEDBA0BACh4AAlLwABBQNgXvZTma7O7du6lHgCX5ZfDtlE3B+/C1AXK0NHA+fG2AHC3RZBkdLWVT8EVRvPTSS6lHCMLR0nrYu3dv6hGCcLS0HvxK+BbKqeB/++231CNEsHv37tQjxDQ7O5t6hAgcJ9FkeR0n5VTwDMStW7dSjwBLcpwEg6LgASCgnAo+o1sbmuzmzZupR4hJPgdiZmYm9QgxyedA5LWMORV8URRHjx5NPUL2du3alXqEsI4fP556hLzNz89PTk6mniKsvF4/Zu0yK/hLly6lHiFvfsLX1cWLF1OPkLdNmzalHgGWlN3+M7OCZ42yCygAq5NZwVdV9d5776WeImOdTif1CJFVVXX69OnUU2Qsrxc4s2N51yi7Bcys4Iui+OSTT1KPkCun70MwNTWVeoRcyecQWORVy3Hp8iv4999/P/UIsCQFDzREfgX/4Ycf5ngkldylS5eyu76Uow8++MCdYqtw8eJF+RyCqqrsP1cnx3zmV/CsjncYDo3f5bMK3mFIk2V6VJRlwVdV9ejRo9RTZCbHw89MVVWl41dKPofGUq9CpouWZcEXRbFhw4bUI+Qk08PPfLlKvyLyOWQWfEXyXa5cC97bvVYk08PPfFnwFbFcQ2bBVyTf5cq14MuyzPeoasgsVBKWvU8WKgnL3qesFyrXgi+KoqqqfA+shskqJWHZ+2ShkrDsfcp6oTIu+KIoRkbynn8Isj78zJ3FX5YlSsjiLyv3Jcq7ILM+thoOS5RQVVX3799PPUWjyWdCFn9ZuS9R3gVf5H+Eta4sTnJbtmxJPUJzyWdyNsEzBFic7AveBzMtpSzL3A8/A5DPpchnE8jnUmLkM/uCL4qi0+lcv3499RSNEyCdMVRVNT09nXqKxpHPhrAhFhVjWSIUfFmWL7/8cuopmsXth41y4MCB1CM0i7PGRrE5nhBmQYLUgAtNvcqy9EFAjSKfvWJc/IxEPntFymeQgi9k9LFI6YxEPmtbtmyRzwaSz1qw/Wecgi+KotPp/PHHH6mnSCxSOoOpqur27dupp0ipqqp79+6lnoLF2XUU4RYhVMGXZfnmm2+mniIlx+ANd+rUqdQjpPT888+nHoFnafkOJN63H+13sl27di3YNZb+tfYbz8iVK1dau5la+41npL5Q387NFPIbD3UGX2vni0kh0xmSfNJk8hlJwIIviqKqqla9TyxqOqNq2z5UPvMin2GEbcFOp9OSjI6MjERNZ2Dt2YcG3nsGJp8xhC34oh0Z9Zb3fLUkn4H3nrHJZwCRC74oiqqqXnnllajvndu4cWPsdIZXVdXBgwdDvneuqqqtW7fKZ9Zid3z4di/CF3xRFNeuXdu2bVuwmP7yyy9FUTx48CD1IKzVlStXdu7cGeyXzs3OzpZleffu3dSDsFZ1BQbbf9bCt3sR721yi6qP1MIcr4X5Rui6d+9emM0a5huhy/4zU/HP4LtiXG5yS11UMfLZqr1nq8hnjlpU8MXjazKZvoOu/ulyS11gWV8Orcdu1d6zbeQzO1lW3Rrl+A66th14tlmOp0ry2R7ymZE2FnzRcyja/K3ezgPPlsvoVEk+W0g+c9HSgq/Vh6KNjWnLo0nDd6Py2XLy2XytLvhaA2MqmnTJJ00mn02m4P9TVVV9Qv/ll1+mmuHSpUuiyaK6u9ELFy6kmuHixYvyyaIaUvPy+YRWvA++T92X5E+dOnX27NlhpqR+81ttaE9Kdup4nDx58ty5c8OMSne/KZ88QzceQ769ST6X4gx+EWfOnOkekK7rMWn9+FVVdTod0aRPn376aW8+5+fn1+mJuvm362RFhrn/LORzaQr+Wbq5uXHjxsjISFmWn3322VoerXgcylu3bhU9rwsMamBapc7P2NhY/dGwZVmeO3dujY9ZP87s7Gxhv8na9OZnUGXf+zjyuSyX6PsyMTHR+wkzCwsLY2NjvV8wOjr6xH9ZWFjo/ev8/Hz9NRLJwE1OTvbmam5ubuvWrb1fMD4+/sR/mZub6/3r3bt366+RT9bDE7laadl3/7t8roiCX43R0VE5o7HGx8flkyaTz+FwiR4AAlLwABCQggeAgBQ8AASk4AEgIAUPAAEpeAAISMEDQEAKHgACUvAAEJCCB4CAFDwABKTgASAgBQ8AASl4AAhIwQNAQAoeAAJS8AAQkIIHgIAUPAAEpOABICAFDwABKXgACEjBA0BACh4AAlLwABCQggeAgBQ8AASk4AEgIAUPAAEpeAAISMEDQEAKHgACUvAAEJCCB4CAFDwABKTgASAgBQ8AASl4AAhIwQNAQAoeAAJS8AAQkIIHgIAUPAAEpOABICAFDwABKXgACEjBA0BACh4AAlLwABCQggeAgDZ0//Tw4cOyLBOOAs8mnzSZfNI0ZVVVqWcAAAbMJXoACEjBA0BA/wP4Ql8XOy2NgQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=672x224 at 0x7F4671E4FBB0>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# --- Wrong outputs\n",
"results = [\n",
" resize_dali(img, size, interpolation=types.INTERP_CUBIC),\n",
" resize_dali(img, size, interpolation=types.INTERP_LINEAR),\n",
" resize_dali(img, size, interpolation=types.INTERP_NN),\n",
"]\n",
"view_as_row(results)"
]
},
{
"cell_type": "markdown",
"id": "3d036360",
"metadata": {},
"source": [
"### PIL"
]
},
{
"cell_type": "markdown",
"id": "faebe5df",
"metadata": {},
"source": [
"#### Correct Outputs"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "f29d99d4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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FRUWFnLHJ1errKysmjVr1qpVq/bt29cOgaIpwespKSm5dOnSxYsXc3JyJBKJs7NzUFBQeHi4q6urqanpv/51lUr1+PHjrKysgwcPZmVl1dTU2NnZBQcHh4SEcA0K4LUxDPP06dObN28mJSVlZWVxN58BAQE+Pj5WVlbcGPtf5x5zI0sikUitVldVVZWWlubm5p48efLx48e5ubnOzs6BgYH+/v4uLi4SCSrAi+DT+Rssy5aXl6elpV25ciU/P9/c3LxVq1a9evVydHS0sLB4yWswd+SZmZnZ29vXfpFhGKVSmZeXl5mZeebMmQMHDtja2gYGBrZq1cra2hpNCV5STU3N9evX4+Pjnz17Zm5u3q5du8jISFdXV4VC8ZI/gaIoqVRqY2PDPZt//idnZ2ffvXv3t99+i46OtrW1feONNwIDA83MzOrnVwGB0Gq1YrGYOz2q1epLly4lJCQUFhYqFIo2bdpERER4enr+0/FZe0XncNd7qVRqb2///PlTJBLV1NRkZmbeuXPn6NGjP//8s7W1dZcuXTp37lz7k7VaLR6Rwr96+vRpdHT0/fv3TU1Nw8LCpk6d+np9RiaTeXp6enp6hoWFcV8pKSlJTExcsWJFYWGhp6fnqFGjPDw89JodBE6j0Tx48ODgwYNpaWmOjo49e/acPHmyra3tS/aZ2r7ErfKwtrZu1qxZx44duZ9cWlp679696OjozMxMNze3yMjIli1b4kno30JB+n9qamoyMjIuX76cnp7u7OzcoUOHFi1aWFtb6+vBpFgstrCwsLCwaN68ec+ePUtLSx88eHD16tWYmBg3N7fg4GAvL6+Xv8cFI3T79u24uLibN2+6ubl169atdevWFhYWevz5crmcu97379+/srLy7t27Z86c2bVrV4sWLXr27Nm2bVvUePgTrpNwteTGjRunT5++e/euq6trt27d2rZta2VlVfudteuRai/htf/3b48r7pufr09yudzb29vb2zsyMlKpVKampiYkJOzZs6d58+Y9evQICgriYqAmwd96+vTpgQMHbty40axZs8jISF9fX73/E9bW1v379+/fv79IJHrw4MGvv/6alpbGHbFoSvACDMPk5uYePXr09OnTbdu2ffvtt93d3fVbXSQSiZ2dXefOnTt37qxWq7Ozs2NiYpYtWxYcHPz222+7uLjgtPk8FCSdsrKyq1evXrlyhaKoDh069O/f387Orl4nbFAUZW1t3b59+3bt2pWUlHA3vr/99ltgYGDHjh1tbGzq758G3lGr1adOnYqLi6Npunv37mPGjHn+vrOeKBSKgICAgIAApVKZlJR04MCB6Ojorl279unTBzUeRM9VI61WGxMTEx8fL5FIQkNDx48fb21tXfs9IpGI263uVc+oz5eoWtzWdiKRyMzMLCQkJCQkpLKy8ty5cwcPHoyOju7cuXNERAQ3OQo1CWqdPHly3759VlZWo0aN+uCDDxrmH/Xw8Jg9e7ZIJEpPT9+xY8fDhw8jIyP79++PwxKep9FokpOTf/75Z5lMNmTIkNGjR5uYmNT3PyqVSt3d3adPnz558uR79+5t27YtPz9/+PDhISEhcrm8vv91XkBBEpWXl1+4cOHs2bOurq7Dhg1r2rRpA5+8KIqysbHp0qVLp06dcnJyTp06tWrVquDg4K5du9ra2jZkEjBANTU1x44d++2335o3bz5t2rSmTZs2fAYzM7Nu3bp169YtLy9v7969U6dODQ8PHzhwoLm5ecOHAUPAMIxYLKZpWq1WHzhw4OjRo56entOnT699Rs4tCqIoSu+n0+d/JjckpVAoevfu3bt375ycnJ07d7733ns9evQYOnQod3yiJhm52NjYrVu3hoWFbdy4kdRUIi8vryVLlmi12j179gwaNCgqKmrIkCFEkoBB0Wg058+f/+6774KCghYvXkzkybhMJmvTpk2bNm3Ky8v379+/ZcuWUaNGhYeHoyYZdUHiqtH169dbtGgxdepUR0dHsmt8xWKxs7PzmDFjCgoKLl++vHXrVh8fnzfeeAOjScZJo9H89ttv586da9269RdffGEIS34bN248bdq0kpKS2NjYRYsWBQQEvP322y+zlBkEgxvA4SrH7t27z58/7+fnt2rVKkdHR9Fz40UN00lqz9hcU3Jycpo9e3ZxcfHhw4fnzp3brl27UaNGyeVyhmGw460RSkhI2LVrV3h4+N69ew2hJNM0HRUVFRUV9fvvv0+cOLFfv35vvfUW6VBAhkajSUxM3LdvX48ePbZs2WIITxstLCzeeeed4cOHnz17dubMmf369QsPDzfm5UlGuucPt4Z49erVT548GT9+fGRkZJMmTQxkBySKoho1atS/f//JkydXVVV9+eWX8fHx1dXVpHNBg0pMTJw6dWpmZubC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AAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACADgoSAAAAAACAjoR0AAAAIWCfQzoLGB3uqMOxBwCgFyhIwBs0TZOOAMbunw5CsVisUCgoisJRCkRQFCUSiRQKBY5AAIC6+19BYhjm0aNHNjY2BNMAPHz4UKPR/PXrarX6wYMHOD6BrMzMzOrq6r9+vbKy8ubNmxYWFgzDiMWYugwNjWVZiqLS09NLS0tJZwF4ZcXFxfn5+aRTgFErLCx8fhD+fwWpZcuWFy5cuH37NolUADoajaZVq1bc09DndejQ4fTp01evXiWSCoDDMEzHjh2f/wpXh7p27RobG3v79m2GYQhFA2MnFos1Gk1oaKjovwNKtQICAj7//HNCuQD+p2vXrn/9oq+v748//ohHS0AWy7Lt27ev/SNV25YwdR4MBEVRfy1IAAAAAAANgEIpAgCoI4ZhcC4FQ0BRFJ7EAwDUEQoSAAAAAACAzv8B9qqxCOWycZIAAAAASUVORK5CYII=\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=1120x224 at 0x7F4672E7E820>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# -- PIL\n",
"# --- Correct outputs\n",
"results = [\n",
" img.resize(size, Image.BILINEAR),\n",
" img.resize(size, Image.BICUBIC),\n",
" img.resize(size, Image.LANCZOS),\n",
" img.resize(size, Image.BOX),\n",
" img.resize(size, Image.HAMMING),\n",
"]\n",
"view_as_row(results)"
]
},
{
"cell_type": "markdown",
"id": "5e202d56",
"metadata": {},
"source": [
"#### Wrong Outputs"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "edb06241",
"metadata": {},
"outputs": [],
"source": [
"# --- Wrong outputs\n",
"# None!"
]
},
{
"cell_type": "markdown",
"id": "e73067d1",
"metadata": {},
"source": [
"### Torch"
]
},
{
"cell_type": "markdown",
"id": "6f131562",
"metadata": {},
"source": [
"#### Correct Outputs"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "896214b1",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=224x224 at 0x7F4671E61400>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# -- Torch\n",
"# --- Correct outputs\n",
"resize_torch(img, size, interpolation=InterpolationMode.BILINEAR, antialias=True)"
]
},
{
"cell_type": "markdown",
"id": "9b92dc93",
"metadata": {},
"source": [
"#### Wrong Outputs"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "7c815132",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=672x224 at 0x7F4671E4F670>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# --- Wrong outputs\n",
"results = [\n",
" resize_torch(img, size, interpolation=InterpolationMode.BILINEAR),\n",
" resize_torch(img, size, interpolation=InterpolationMode.BICUBIC),\n",
" resize_torch(img, size, interpolation=InterpolationMode.BICUBIC, antialias=True),\n",
"]\n",
"view_as_row(results)"
]
},
{
"cell_type": "markdown",
"id": "53891668",
"metadata": {},
"source": [
"### OpenCV"
]
},
{
"cell_type": "markdown",
"id": "f714e078",
"metadata": {},
"source": [
"#### Correct Outputs"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "2afaf41e",
"metadata": {},
"outputs": [],
"source": [
"# -- OpenCV\n",
"# --- Correct outputs\n",
"# None!"
]
},
{
"cell_type": "markdown",
"id": "6b8e10f4",
"metadata": {},
"source": [
"#### Wrong Outputs"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "7c315411",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=1120x224 at 0x7F4671E4F820>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# --- Wrong outputs\n",
"results = [\n",
" resize_opencv(img, size, cv2.INTER_NEAREST),\n",
" resize_opencv(img, size, cv2.INTER_LINEAR),\n",
" resize_opencv(img, size, cv2.INTER_AREA),\n",
" resize_opencv(img, size, cv2.INTER_CUBIC),\n",
" resize_opencv(img, size, cv2.INTER_LANCZOS4),\n",
"]\n",
"view_as_row(results)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9bbb9fd2",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
import os
import shutil
import sys
from pathlib import Path
import cv2
import numpy as np
import nvidia.dali.fn as fn
import nvidia.dali.types as types
import torch, torchvision, nvidia.dali, numpy, cv2
ver = lambda x: f"{x.__name__.ljust(14)}: {x.__version__.rjust(3)}"
print("\n".join(list(map(ver, [torch, torchvision, nvidia.dali, numpy, cv2]))))
from nvidia.dali import pipeline_def
from PIL import Image
from PIL.ImageDraw import ImageDraw
from torchvision.transforms.functional import InterpolationMode
from torchvision.transforms.functional import resize as torch_resize
from torchvision.transforms.functional import to_pil_image, to_tensor
mkdir = lambda x: Path(x).mkdir()
def create_test_img(size=(128, 128), outline_width: int = 3):
assert size[0] == size[1], f"Square image dimensions expected"
im = Image.new("RGB", size, color=(255, 255, 255))
d = ImageDraw(im)
qtr = int(size[0] / 4)
pad = int(0.015625 * size[0])
d.ellipse((qtr, qtr, qtr * 3, qtr * 3), fill=None, outline=0, width=outline_width)
d.rectangle(
((pad, pad), (size[0] - pad, size[1] - pad)), fill=None, outline=0, width=outline_width
)
return im
def resize_opencv(img: Image.Image, size=(128, 128), interpolation=cv2.INTER_LINEAR):
# im = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2RGB)
im = np.array(img)
im = cv2.resize(im, size, interpolation)
return Image.fromarray(im)
def resize_torch(
img: Image.Image,
size=(128, 128),
interpolation=InterpolationMode.BICUBIC,
antialias: bool = None,
):
im = torch_resize(to_tensor(img), size, interpolation, antialias=antialias)
# return im
return to_pil_image(im)
def resize_dali(img: str, size=(128, 128), interpolation=types.INTERP_LINEAR, device="gpu"):
# Setup directory structure for DALI
if Path("tmp-test").exists():
shutil.rmtree("tmp-test")
mkdir("tmp-test")
mkdir("tmp-test/0")
img.save("tmp-test/0/test-img.png", quality=100)
# Define pipeline
@pipeline_def
def test():
imgs, _ = fn.readers.file(file_root="tmp-test")
imgs = fn.decoders.image(imgs, device="mixed" if device == "gpu" else "cpu")
imgs = fn.resize(
imgs,
device="gpu",
resize_x=size[0],
resize_y=size[0],
mode="stretch",
interp_type=interpolation,
)
return imgs, _
# Build Pipeline
pipe = test(batch_size=1, num_threads=1, device_id=0)
pipe.build()
# Run Pipeline and get outputs
img = pipe.run()[0]
img = img.as_cpu().as_array()[0] # 0th element of the batch
assert img.ndim == 3
return Image.fromarray(img)
img = create_test_img((2048, 2048), outline_width=6)
size = (128, 128) # Output size
# -- DALI
# --- Correct outputs
resize_dali(img, size, interpolation=types.INTERP_GAUSSIAN)
resize_dali(img, size, interpolation=types.INTERP_LANCZOS3)
resize_dali(img, size, interpolation=types.INTERP_TRIANGULAR)
# --- Wrong outputs
resize_dali(img, size, interpolation=types.INTERP_CUBIC)
resize_dali(img, size, interpolation=types.INTERP_LINEAR)
resize_dali(img, size, interpolation=types.INTERP_NN)
# -- PIL
# --- Correct outputs
img.resize(size, Image.BILINEAR)
img.resize(size, Image.BICUBIC)
img.resize(size, Image.LANCZOS)
img.resize(size, Image.BOX)
img.resize(size, Image.HAMMING)
# --- Wrong outputs
# None!
# -- Torch
# --- Correct outputs
resize_torch(img, size, interpolation=InterpolationMode.BILINEAR, antialias=True)
# --- Wrong outputs
resize_torch(img, size, interpolation=InterpolationMode.BILINEAR)
resize_torch(img, size, interpolation=InterpolationMode.BICUBIC)
resize_torch(img, size, interpolation=InterpolationMode.BICUBIC, antialias=True)
# -- OpenCV
# --- Correct outputs
# None!
# --- Wrong outputs
resize_opencv(img, size, cv2.INTER_NEAREST)
resize_opencv(img, size, cv2.INTER_LINEAR)
resize_opencv(img, size, cv2.INTER_AREA)
resize_opencv(img, size, cv2.INTER_CUBIC)
resize_opencv(img, size, cv2.INTER_LANCZOS4)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment