{"cells":[{"metadata":{},"cell_type":"markdown","source":"# I’m Something of a Painter Myself - Visualization and Augmentation\n\nThis notebook demonstrates different approaches to exploratory data analysis for the image data.   \nIn this solution, you will also see how you can visualize images using matplotlib and what graphs you can build for these images"},{"metadata":{},"cell_type":"markdown","source":"![](https://storage.googleapis.com/kaggle-competitions/kaggle/21755/logos/header.png)"},{"metadata":{},"cell_type":"markdown","source":"<a id=\"top\"></a>\n\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h3 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:purple; border:0' role=\"tab\" aria-controls=\"home\"><center>Quick Navigation</center></h3>\n\n* [1. Data Preparations](#1)\n* [2. Show Batches - Monet Paintings](#2)\n* [3. Show Batches - Photos](#3)\n* [4. Color Channel Histograms](#4)\n* [5. Individual Channels Visualization](#5)\n* [6. Grayscale Visualization](#6)\n    \n\n* [Augmentation - Blur](#100)\n* [Augmentation - CLAHE](#101)\n* [Augmentation - CenterCrop](#102)\n* [Augmentation - ChannelDropout](#103)\n* [Augmentation - ChannelShuffle](#104)\n* [Augmentation - Crop](#105)\n* [Augmentation - RandomCrop](#106)\n* [Augmentation - CutOut](#107)\n* [Augmentation - Downscale](#108)\n* [Augmentation - Equalize](#109)\n* [Augmentation - HorizontalFlip](#110)\n* [Augmentation - VerticalFlip](#111)\n* [Augmentation - Flip](#112)\n* [Augmentation - GaussNoise](#113)\n* [Augmentation - GridDistortion](#114)    \n* [Augmentation - HueSaturationValue](#115) \n* [Augmentation - ISONoise](#116)\n* [Augmentation - ImageCompression](#117)\n* [Augmentation - InvertImg](#118)\n* [Augmentation - JpegCompression](#119)\n* [Augmentation - MotionBlur](#120)\n* [Augmentation - MultiplicativeNoise](#121)"},{"metadata":{},"cell_type":"markdown","source":"<a id=\"1\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Data Preparations<center><h2>"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os\nimport math\nimport random\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport cv2\nimport albumentations as A","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def set_seed(seed):\n    random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    np.random.seed(seed)\n    \n    \nSEED = 42\nset_seed(SEED)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"BASE_PATH = \"../input/gan-getting-started/\"\nMONET_PATH = os.path.join(BASE_PATH, \"monet_jpg\")\nPHOTO_PATH = os.path.join(BASE_PATH, \"photo_jpg\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def print_folder_statistics(path):\n    d_image_sizes = {}\n    for image_name in os.listdir(path):\n        image = cv2.imread(os.path.join(path, image_name))\n        d_image_sizes[image.shape] = d_image_sizes.get(image.shape, 0) + 1\n        \n    for size, count in d_image_sizes.items():\n        print(f\"shape: {size}\\tcount: {count}\")\n\n\nprint(f\"Monet images:\")\nprint_folder_statistics(MONET_PATH)\nprint(\"-\" * 10)\nprint(f\"Photo images:\")\nprint_folder_statistics(PHOTO_PATH)\nprint(\"-\" * 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def batch_visualization(path, n_images, is_random=True, figsize=(16, 16)):\n    plt.figure(figsize=figsize)\n    \n    w = int(n_images ** .5)\n    h = math.ceil(n_images / w)\n    \n    all_names = os.listdir(path)\n    \n    image_names = all_names[:n_images]\n    if is_random:\n        image_names = random.sample(all_names, n_images)\n    \n    for ind, image_name in enumerate(image_names):\n        img = cv2.imread(os.path.join(path, image_name))\n        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) \n        plt.subplot(h, w, ind + 1)\n        plt.imshow(img)\n        plt.axis(\"off\")\n    \n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"2\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Show Batches - Monet Paintings<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_visualization(MONET_PATH, 1, is_random=True, figsize=(5, 5))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_visualization(MONET_PATH, 4, is_random=True, figsize=(10, 10))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_visualization(MONET_PATH, 9, is_random=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_visualization(MONET_PATH, 16, is_random=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_visualization(MONET_PATH, 300, is_random=False)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"3\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Show Batches - Photos<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_visualization(PHOTO_PATH, 16, is_random=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"4\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Color Channel Histograms<center><h2>\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"def color_hist_visualization(image_path, figsize=(16, 4)):\n    plt.figure(figsize=figsize)\n    \n    img = cv2.imread(image_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) \n    plt.subplot(1, 4, 1)\n    plt.imshow(img)\n    plt.axis(\"off\")\n    \n    colors = [\"red\", \"green\", \"blue\"]\n    for i in range(len(colors)):\n        plt.subplot(1, 4, i + 2)\n        plt.hist(\n            img[:, :, i].reshape(-1),\n            bins=25,\n            alpha=0.5,\n            color=colors[i],\n            density=True\n        )\n        plt.xlim(0, 255)\n        plt.xticks([])\n        plt.yticks([])\n    \n    \n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_path = '../input/gan-getting-started/monet_jpg/000c1e3bff.jpg'\ncolor_hist_visualization(img_path)\n\nimg_path = '../input/gan-getting-started/monet_jpg/05144e306f.jpg'\ncolor_hist_visualization(img_path)\n\nimg_path = '../input/gan-getting-started/monet_jpg/16dabe418c.jpg'\ncolor_hist_visualization(img_path)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"5\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Individual Channels Visualization<center><h2>\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"def channels_visualization(image_path, figsize=(16, 4)):\n    plt.figure(figsize=figsize)\n    \n    img = cv2.imread(image_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) \n    plt.subplot(1, 4, 1)\n    plt.imshow(np.mean(img, axis=2), cmap=\"gray\")\n    plt.axis('off')\n    \n    for i in range(3):\n        plt.subplot(1, 4, i + 2)\n        tmp_img = np.full_like(img, 0)\n        tmp_img[:, :, i] = img[:, :, i]\n        plt.imshow(tmp_img)\n        plt.xlim(0, 255)\n        plt.xticks([])\n        plt.yticks([])\n    \n    \n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_path = '../input/gan-getting-started/monet_jpg/51db3fc011.jpg'\ncolor_hist_visualization(img_path)\nchannels_visualization(img_path)\n\nimg_path = '../input/gan-getting-started/monet_jpg/1814cc6632.jpg'\ncolor_hist_visualization(img_path)\nchannels_visualization(img_path)\n\nimg_path = '../input/gan-getting-started/monet_jpg/4995c04b1a.jpg'\ncolor_hist_visualization(img_path)\nchannels_visualization(img_path)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"6\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Grayscale Visualization<center><h2>\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"def grayscale_visualization(image_path, figsize=(8, 4)):\n    plt.figure(figsize=figsize)\n    \n    img = cv2.imread(image_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) \n    plt.subplot(1, 2, 1)\n    plt.imshow(img)\n    plt.axis('off')\n    \n    plt.subplot(1, 2, 2)\n    tmp_img = np.full_like(img, 0)\n    for i in range(3):\n        tmp_img[:, :, i] = img.mean(axis=-1)\n    plt.imshow(tmp_img)\n    plt.axis('off')\n    \n    \n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_path = '../input/gan-getting-started/monet_jpg/5c79cfe0b3.jpg'\ngrayscale_visualization(img_path)\n\nimg_path = '../input/gan-getting-started/monet_jpg/990ed28f62.jpg'\ngrayscale_visualization(img_path)\n\nimg_path = '../input/gan-getting-started/monet_jpg/fd63a333f1.jpg'\ngrayscale_visualization(img_path)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"<a id=\"100\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - Blur<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_simple_augmentation(image_path, transform):\n    img = cv2.imread(image_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) \n    \n    plt.figure(figsize=(10, 5))\n    \n    plt.subplot(1, 2, 1)\n    plt.imshow(img)\n    plt.axis(\"off\")\n    \n    plt.subplot(1, 2, 2)\n    x = transform(image=img)[\"image\"]\n    plt.imshow(x)\n    plt.axis(\"off\")\n\n    plt.show()\n    \ndef plot_multiple_augmentation(image_path, transform):\n    img = cv2.imread(image_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) \n    \n    plt.figure(figsize=(10, 10))\n    \n    plt.subplot(2, 2, 1)\n    plt.imshow(img)\n    plt.axis(\"off\")\n    \n    plt.subplot(2, 2, 2)\n    x = transform(image=img)[\"image\"]\n    plt.imshow(x)\n    plt.axis(\"off\")\n    \n    plt.subplot(2, 2, 3)\n    x = transform(image=img)[\"image\"]\n    plt.imshow(x)\n    plt.axis(\"off\")\n    \n    plt.subplot(2, 2, 4)\n    x = transform(image=img)[\"image\"]\n    plt.imshow(x)\n    plt.axis(\"off\")\n\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.Compose(\n    [\n        A.Blur(p=1.0, blur_limit=(5, 5)),\n    ]\n)\n\nplot_simple_augmentation(\"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\", transform)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"101\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - CLAHE<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.CLAHE(p=1.0, clip_limit=(10, 10), tile_grid_size=(3, 3))\n\nplot_simple_augmentation(\"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\", transform)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"102\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - CenterCrop<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.CenterCrop(p=1.0, height=100, width=150)\n\nplot_simple_augmentation(\"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\", transform)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"103\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - ChannelDropout<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.ChannelDropout(p=1.0, channel_drop_range=(1, 2), fill_value=0)\n\nplot_multiple_augmentation(\"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\", transform)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"104\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - ChannelShuffle<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.ChannelShuffle(p=1.0)\n\nplot_multiple_augmentation(\"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\", transform)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"105\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - Crop<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.Crop(p=1.0, x_min=0, y_min=0, x_max=150, y_max=150)\n\nplot_simple_augmentation(\"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\", transform)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"106\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - RandomCrop<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.RandomCrop(p=1.0, height=100, width=100)\n\nplot_multiple_augmentation(\"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\", transform)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"107\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - CutOut<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.Cutout(p=1.0, num_holes=8, max_h_size=15, max_w_size=15)\n\nplot_multiple_augmentation(\"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\", transform)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"108\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - Downscale<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.Downscale(\n    p=1.0, scale_min=0.01, scale_max=0.20, interpolation=0,\n)\n\nplot_multiple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"109\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - Equalize<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.Equalize(\n    p=1.0, mode='cv', by_channels=True,\n)\n\nplot_simple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"110\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - HorizontalFlip<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.HorizontalFlip(\n    p=1.0,\n)\n\nplot_simple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"111\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - VerticalFlip<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.VerticalFlip(\n    p=1.0,\n)\n\nplot_simple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"112\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - Flip<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.Flip(\n    p=1.0,\n)\n\nplot_multiple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"113\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - GaussNoise<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.GaussNoise(\n    p=1.0, var_limit=(500.0, 500.0),\n)\n\nplot_simple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"114\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - GridDistortion<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.GridDistortion(\n    p=1.0, num_steps=15, distort_limit=(-2., 2.), \n    interpolation=0, border_mode=0, value=(0, 0, 0), mask_value=None,\n)\n\nplot_multiple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"115\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - HueSaturationValue<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.HueSaturationValue(\n    p=1.0, \n    hue_shift_limit=(-100, 100), \n    sat_shift_limit=(-100, 100), \n    val_shift_limit=(-100, 100),\n)\n\nplot_multiple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"116\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - ISONoise<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.ISONoise(\n    p=1.0, intensity=(0.0, 2.0), color_shift=(0.0, 1.0)\n)\n\nplot_multiple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"117\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - ImageCompression<center><h2>\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.ImageCompression(\n    p=1.0, quality_lower=0, quality_upper=10, compression_type=0,\n)\n\nplot_multiple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"118\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - InvertImg<center><h2>\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.InvertImg(\n    p=1.0,\n)\n\nplot_simple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"119\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - JpegCompression<center><h2>\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.JpegCompression(\n    p=1.0, quality_lower=0, quality_upper=10,\n)\n\nplot_multiple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"120\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - MotionBlur<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.MotionBlur(\n    p=1.0, blur_limit=(3, 50),\n)\n\nplot_multiple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"121\"></a>\n<h2 style='background:purple; border:0; color:white'><center>Augmentation - MultiplicativeNoise<center><h2>"},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = A.MultiplicativeNoise(\n    p=1.0, multiplier=(0.1, 5.0), per_channel=True, elementwise=False,\n)\n\nplot_multiple_augmentation(\n    \"../input/gan-getting-started/monet_jpg/990ed28f62.jpg\",\n    transform,\n)\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}