{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport keras\nfrom keras.applications.vgg19 import VGG19\nfrom keras.applications.resnet50 import ResNet50\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import ModelCheckpoint\nfrom keras.models import Model\nfrom keras.layers import Dense, Dropout, Flatten,  Conv2D, MaxPooling2D, GlobalAveragePooling2D\nfrom keras import backend as K\nfrom keras.layers.normalization import BatchNormalization\nfrom keras.preprocessing.image import load_img\n#from keras.applications.vgg16 import preprocess_input\nfrom keras.applications.resnet50 import preprocess_input\nfrom keras.preprocessing.image import img_to_array\nimport os\nfrom tqdm import tqdm\nfrom sklearn import preprocessing\nfrom sklearn.model_selection import train_test_split\nimport cv2\nimport sys\nimport bcolz\nimport random\n\nfrom subprocess import check_output\nprint(check_output([\"ls\", \"../input\"]).decode(\"utf8\"))\n\n%matplotlib inline\nimport matplotlib.pyplot as plt\nfrom glob import glob\nfrom mpl_toolkits.axes_grid1 import ImageGrid\nimport re","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### <u>BCOLZ array</u>"},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"im_size     = 300\ntrain_files = glob('../input/dog-breed-identification/train/*.jpg')\nINPUT_LOC   = '../input/dog-breed-identification/train/'\n\n## Initialize Bcolz array \nbc_img_arr = bcolz.zeros((0,im_size,im_size,3),np.float32)\n\n## Build Bcolz Array  - TRAIN \nfor img in tqdm(train_files):\n    file_name_jpg = re.search(\"(\\w+.jpg)\", img)\n    if file_name_jpg:\n        file_name = file_name_jpg.group(0)\n        image = load_img(INPUT_LOC + file_name, target_size=(im_size, im_size))\n        image = img_to_array(image)\n        bc_img_arr.append(image)\n    else:\n        print(\"file Not found\")\n\nprint(\"Number of Training Images\".ljust(40) + \":\" + str(len(train_files)))\nprint(\"Length of Bcolz Array\".ljust(40) + \":\" + str(len(bc_img_arr)))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### **<u>Helper Functions</u>**"},{"metadata":{"trusted":true},"cell_type":"code","source":"\n######### CROP FUNCTION #########\ndef crop_by_position(ORIGINAL_IMG, RESIZE_FACTOR, POSITION = \"Top_Left\"):\n    \n    height, width, z      = ORIGINAL_IMG.shape\n    new_height, new_width = int(height * RESIZE_FACTOR), int(width * RESIZE_FACTOR)\n    if new_height > height or new_width > width: print(\"Crop cannot be performed, New size bigger than original\")\n    \n    if POSITION == \"Original\":\n        return ORIGINAL_IMG/255\n    if POSITION == \"Top_Left\":\n        return ORIGINAL_IMG[:new_height            , :new_width         , : ]/255.\n    elif POSITION == \"Top_Right\":\n        return ORIGINAL_IMG[:new_height            , (width-new_width): , : ]/255.\n    elif POSITION == \"Bottom_Left\":\n        return ORIGINAL_IMG[(height - new_height): , :new_width         , : ]/255.\n    elif POSITION == \"Bottom_Right\":\n        return ORIGINAL_IMG[(height - new_height): , (width-new_width): , : ]/255.\n    elif POSITION == \"Center\":\n        startx, starty = width//2-(new_width//2), height//2-(new_height//2)\n        return ORIGINAL_IMG[starty:starty+new_height,startx:startx+new_width]/255\n    else:\n        return False\n\n######### IMAGE AUGMENTATION #########    \ndef Apply_Image_Augementation(BATCH, RESIZE_FACTOR=0.8):\n    pos_lst       = [\"Original\", \"Top_Left\", \"Top_Right\", \"Bottom_Left\", \"Bottom_Right\", \"Center\", \"Flip_Vertical\", \"Flip_Horizontal\"]\n    RNO           = random.randint(1,101)\n    RESIZE_FACTOR = 0.7\n    \n    ## Operate on a batch\n    for pic in BATCH:\n\n        ## Display all transformations ##\n        f, ax = plt.subplots(1, 8, figsize=(15,15)) \n        for ax_, pos in zip(ax, pos_lst): \n            if   pos == \"Flip_Vertical\"   : img = ImageDataGenerator().apply_transform(pic,{'flip_vertical':True})/255\n            elif pos == \"Flip_Horizontal\" : img = ImageDataGenerator().apply_transform(pic,{'flip_horizontal':True})/255\n            else                          : img = crop_by_position(pic, RESIZE_FACTOR, pos)\n\n            ax_.imshow(img)\n            ax_.set_title(pos)\n            ax_.axis(\"off\")\n            \n        ## Display transformations by given probability ##\n        f, ax = plt.subplots(1, 2, figsize=(4,4)) \n        img_selected = crop_by_position(pic, RESIZE_FACTOR, \"Top_Left\")                           if RNO < 20                else pic\n        img_selected = crop_by_position(img_selected, RESIZE_FACTOR, \"Top_Right\")                 if RNO >= 20 and RNO < 40  else img_selected\n        img_selected = crop_by_position(img_selected, RESIZE_FACTOR, \"Bottom_Left\")               if RNO >= 40 and RNO < 60  else img_selected\n        img_selected = crop_by_position(img_selected, RESIZE_FACTOR, \"Bottom_Right\")              if RNO >= 60 and RNO < 80  else img_selected\n        img_selected = crop_by_position(img_selected, RESIZE_FACTOR, \"Center\")                    if RNO >= 80               else img_selected\n        img_selected = ImageDataGenerator().apply_transform(img_selected,{'flip_vertical':True})  if RNO < 50                else img_selected\n        img_selected = ImageDataGenerator().apply_transform(img_selected,{'flip_vertical':True})  if RNO >= 50               else img_selected\n\n        ax[0].imshow(pic/255.)\n        ax[0].axis(\"off\")\n        ax[0].set_title(\"-- ORIGINAL --\")\n        ax[1].imshow(img_selected)\n        ax[1].axis(\"off\")\n        ax[1].set_title(\"-- AUGMENTED  --\")\n        \n\ndef Get_Batches(IMAGE_ARR, BATCH_SIZE):\n    ## Initialize ImageDataGenerator & divide them for batches\n    datagen = ImageDataGenerator()\n    \n    ## Create Batches\n    batches = datagen.flow(bc_img_arr, shuffle=True, batch_size=2)\n    print(\"Total Batches : \" + str(len(batches)), \"\\n\")\n    \n    ## Generator to work on batches\n    for batch in batches:\n        yield batch    \n        ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### <br>"},{"metadata":{},"cell_type":"markdown","source":"### <u>Augment Images  in Batches</u>"},{"metadata":{"trusted":true},"cell_type":"code","source":"## Create BAtches from BCOLZ Array\nbatches = Get_Batches(IMAGE_ARR=bc_img_arr, BATCH_SIZE=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## How many batches to examine - This is used to control the number of iterations\nbatch_id = 1\n\n## Iterate through batches, with each batch containing \"BATCH_SIZE\" number of images\nfor idx, batch in enumerate(batches):\n    \n    # Print\n    print(\"Batch Number : \", idx + 1)\n    \n    ## Augment Images in batch number\n    Apply_Image_Augementation(batch)\n    \n    ## Exit condition\n    if idx+1 == batch_id: break\n        \n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"### <br>"}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}