{"cells":[{"metadata":{"_uuid":"3a87bbb692a2c9f594f3e788a5bcb77494af473e"},"cell_type":"markdown","source":"This kernel has implementation of different data augmentation techniques in Python(skimage, OpenCV), TensorFlow, Keras, ImgAug for Digit Recognizer.\n\n* Rotate\n* Flip\n* Add Noise\n* Scale\n* Translate"},{"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 \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nimport skimage\nfrom skimage import transform\nfrom skimage import util\nimport cv2\nimport tensorflow as tf\nfrom math import pi\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\nimport warnings\nimport os\nprint(os.listdir(\"../input\"))\nwarnings.filterwarnings(\"ignore\")\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c6ce97abc0e7338aa0d7718e720a9f48248a1340"},"cell_type":"markdown","source":"   # Load data"},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"df_train = pd.read_csv('../input/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"faf620dc0eb41c4099dacc4003b6747d8c7d582e"},"cell_type":"code","source":"df_train.head()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"cc94c4b93129b50f4815f58119b5494d95d6f174"},"cell_type":"markdown","source":"# Split train to X and Y"},{"metadata":{"trusted":true,"_uuid":"fd51f6fd9d97c571b183192ba4def30a9ca300c4"},"cell_type":"code","source":"X_train = df_train.iloc[:, 1:]\nY_train = df_train.iloc[:, 0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ddf025b1aef9dbfa6f47783fff7385c56410825c"},"cell_type":"code","source":"X_train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e73f8f2845aae4523c29c91b0029b57109f5ac37"},"cell_type":"code","source":"Y_train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"997671b9e14ac3056c76fbffb48a105943de12ce"},"cell_type":"code","source":"X_train = np.array(X_train)\nY_train = np.array(Y_train)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"88ce264d9815f8d3d049616c4a87c2ca70ab7625"},"cell_type":"markdown","source":"# Plot Digits"},{"metadata":{"trusted":true,"_uuid":"a62095256122d2a107ebf181611c9483d76c16ce"},"cell_type":"code","source":"def plot_digits(X, Y, shape):\n    for i in range(9):\n        plt.subplot(3, 3, i+1)\n        plt.tight_layout()\n        plt.imshow(X[i].reshape((28,28)), interpolation='none', cmap='gray')\n        plt.title('Digit:{}'.format(Y[i]))\n        plt.xticks([])\n        plt.yticks([])\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"09cbc80970d814aa9e6f8f469571f36cb6cc6851"},"cell_type":"code","source":"plot_digits(X_train, Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"601352c53ff8fe3b81d69b6062f03f3c7423b884"},"cell_type":"markdown","source":"# Rotate image"},{"metadata":{"trusted":true,"_uuid":"3597443569d62c655048ecc15186f4a061c4df81"},"cell_type":"code","source":"def rotate_image(X, degrees):\n    X_flip = []\n    for i in range(9):\n        img = X[i].reshape((28, 28))\n        img = skimage.transform.rotate(img, degrees)\n        X_flip.append(img.reshape((784)))\n    X_trfr = np.array(X_flip)\n    X = np.concatenate((X, X_flip))\n    return X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"69642fea242d74250ab8e9197149f5a1a27c7ed7"},"cell_type":"code","source":"X_rot = rotate_image(X_train, -30)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f5eedff8b31d55fce5bf7ce18d2d303a08730887"},"cell_type":"code","source":"plot_digits(X_rot[42000:], Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"612506b17a9ecb0b37bda56341406b179043d701"},"cell_type":"markdown","source":"# Flip Image"},{"metadata":{"trusted":true,"_uuid":"0245478f9e5411a8f59188136a3a21154f309ed7"},"cell_type":"code","source":"def flip_digits(X):\n    X_flip = []\n    for i in range(9):\n        img = X[i].reshape((28, 28))\n        img = np.fliplr(img)\n        X_flip.append(img.reshape((784)))\n    X_trfr = np.array(X_flip)\n    X = np.concatenate((X, X_flip))\n    return X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b0302be07d4ab11d498c5de28a136f117d0df566"},"cell_type":"code","source":"X_flip = flip_digits(X_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8f25d5084a3ae9cdb11f1d39c8bccb00ed4ea877"},"cell_type":"code","source":"plot_digits(X_flip[42000:], Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"cf6ff534b126b9f9f93af466500eba4fbe33d283"},"cell_type":"markdown","source":"# Add noise"},{"metadata":{"trusted":true,"_uuid":"efc771c116dfe2ff12e7e3f193654ed056a6c354"},"cell_type":"code","source":"def noise_image(X):\n    X_flip = []\n    for i in range(9):\n        img = X[i].reshape((28, 28))\n        img = skimage.util.random_noise(img, mode='pepper')\n        X_flip.append(img.reshape((784)))\n    X_trfr = np.array(X_flip)\n    X = np.concatenate((X, X_flip))\n    return X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8f978c0e0375f0e8259bf5766804381afbef22f9"},"cell_type":"code","source":"X_noise = noise_image(X_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7960576b00ee2ee5ce982fd07309e1e734d74d50"},"cell_type":"code","source":"plot_digits(X_noise[42000:], Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9aa1902ecf4f2092e325640caebf481a66262256"},"cell_type":"markdown","source":"# Scale image"},{"metadata":{"trusted":true,"_uuid":"5e82d3b9f108d85a77ad44d461f9372abdd33b93"},"cell_type":"code","source":"def scale_up_image(X, scale):\n    X_flip = []\n    for i in range(9):\n        img = X[i].reshape((28, 28))\n        img = skimage.transform.rescale(img, scale, clip=True)\n        img = skimage.util.crop(img, ((0, 28), (0, 28)))\n        X_flip.append(img.reshape((784)))\n    X_trfr = np.array(X_flip)\n    X = np.concatenate((X, X_flip))\n    return X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"839f31a4df7386f04a9351b91e4740e3021368f8"},"cell_type":"code","source":"X_scale = scale_up_image(X_train, 2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1b2126ed7594a5b6e59299c389a259c576ba5ab6"},"cell_type":"code","source":"plot_digits(X_scale[42000:], Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"15acf3327639dd0297f7f4389e339245876f6ef1"},"cell_type":"markdown","source":"# Translate image"},{"metadata":{"trusted":true,"_uuid":"8c6a0691996a01925b36a331c7642d848aeea007"},"cell_type":"code","source":"def translate_image(X, h, w):\n    X_flip = []\n    M = np.float32([[1, 0, h], [0, 1, w]])\n    for i in range(9):\n        img = X[i].reshape((28, 28))\n        img = img.astype(np.float32)\n        img = cv2.warpAffine(img, M, (28, 28))\n        X_flip.append(img.reshape((784)))\n    X_trfr = np.array(X_flip)\n    X = np.concatenate((X, X_flip))\n    return X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"484d6fad9714e355f7073f38668743a5d198e609"},"cell_type":"code","source":"X_translate = translate_image(X_train, 5, 5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6bb45604d3aa740c1a9b63f1e09e9a52800674fa"},"cell_type":"code","source":"plot_digits(X_translate[42000:], Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"16924cdf3fe648aabd458052814ce3a6ec4c42fe"},"cell_type":"markdown","source":"# Let's do the same in TensorFlow\n\n* Flip\n* Rotate\n* Scale\n* Crop\n* Translate"},{"metadata":{"_uuid":"ecde95cb8e5a20431d9462caf0cb2b80718ac248"},"cell_type":"markdown","source":"# Flip Image - LR, Up-Down, Transpose"},{"metadata":{"trusted":true,"_uuid":"4fc4a06dcc4f82ede769a508a7a40858d448397b"},"cell_type":"code","source":"def flip_image_tf(X, mode):\n    X_img = tf.placeholder(dtype=tf.float32, shape=(28, 28, 1), name='X')\n    if mode == 1:\n        tf_flip = tf.image.flip_left_right(X_img)\n    elif mode == 2:\n        tf_flip = tf.image.flip_up_down(X_img)\n    elif mode == 3:\n        tf_flip = tf.image.transpose_image(X_img)\n\n    tf.global_variables_initializer()\n    sess = tf.Session()\n    X_flip = []\n    for i in range(9):\n        img = X[i].reshape((28, 28, 1))\n        img_flip = sess.run([tf_flip], feed_dict={X_img:img})\n        X_flip.append(img_flip[0].reshape((784)))\n    return X_flip","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6583c2b979456d5c747322c70c1cf98fda415b5a"},"cell_type":"code","source":"X_lr = flip_image_tf(X_train, 1)\nX_lr = np.array(X_lr)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"48ca8be805278db2c793c41b03081e6a0f6ab432"},"cell_type":"code","source":"plot_digits(X_lr, Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"657655ebd677b782cda22bcc5a95241ca8576be3"},"cell_type":"code","source":"X_ud = flip_image_tf(X_train, 2)\nX_ud = np.array(X_ud)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b6c19066af39faee75be153c30f7504cff899214"},"cell_type":"code","source":"plot_digits(X_ud, Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"15b84a18278e9f9a6ca5e878b82884b9f701b65e"},"cell_type":"code","source":"X_tr = flip_image_tf(X_train, 3)\nX_tr = np.array(X_tr)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b56d082f6766ff8d6effa598cd39302440640971"},"cell_type":"code","source":"plot_digits(X_tr, Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"79dc564f5e07bf6dd16ddeb9bc6b5d0a5f47bb25"},"cell_type":"markdown","source":"# Rotate Image"},{"metadata":{"trusted":true,"_uuid":"822eb113f2b83b9b7f2ea40cd77d5410be1a5e14"},"cell_type":"code","source":"def rotate_image_tf(X, rot_angle):\n    X_img = tf.placeholder(dtype=tf.float32, shape=(28, 28, 1), name='X')\n    angle = tf.placeholder(dtype=tf.float32, shape=(1), name='angle')\n    tf_rot = tf.contrib.image.rotate(X_img, angle)\n    tf.global_variables_initializer()\n    sess = tf.Session()\n    X_rot = []\n    for i in range(9):\n        img = X[i].reshape((28, 28, 1))\n        rad = [rot_angle*pi/180]\n        img_rot = sess.run([tf_rot], feed_dict={X_img:img, angle:rad})\n        img_rot = img_rot[0].reshape((784))\n        X_rot.append(img_rot)\n    return X_rot","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2221dc41dda7aee3c5d0a0905846f22c1320d208"},"cell_type":"code","source":"X_rot = rotate_image_tf(X_train, 45)\nX_rot = np.array(X_rot)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e880715d28b5e788a39846c4f81b4a99921d5f6b"},"cell_type":"code","source":"plot_digits(X_rot, Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f591d131af108ac6b0ddf554b2aa28676a079b43"},"cell_type":"markdown","source":"# Let's explore Keras ImageDataGenerator"},{"metadata":{"trusted":true,"_uuid":"c56b4e51800f343e4487e793a8d4dcb6fb056321"},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e8a358c44aa9101732ab21c512961f90dc8c3547"},"cell_type":"code","source":"def image_aug_keras(X):\n    datagen = ImageDataGenerator(rotation_range=10, zoom_range=0.1, \\\n                                 width_shift_range=0.1, height_shift_range=0.1)\n    X_aug = []\n    for i in range(9):\n        X_train2, Y_train2 = datagen.flow(X_train[i,:].reshape((1, 28, 28, 1)), \\\n                                          Y_train[i].reshape((1, 1, 1, 1))).next()\n        X_aug.append(X_train2.reshape((28,28)))\n    return X_aug","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f20a0c940a6bd91ef108433ac4390813c2804266"},"cell_type":"code","source":"X_aug = image_aug_keras(X_train)\nX_aug = np.array(X_aug)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0c63ad64d21730a7f7894ebd9ab8c290e8616772"},"cell_type":"code","source":"plot_digits(X_aug, Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5a7117ec9d23eaae7676afc96abba60aae7da4a5"},"cell_type":"markdown","source":"# Augmentation with ImgAug"},{"metadata":{"trusted":true,"_uuid":"0a3d319a0a7e72bd778eb3a020f57eeed73e423d"},"cell_type":"code","source":"from imgaug import augmenters as iaa","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6c7732894bb96939e5eb52991290f8ef0122bfc0"},"cell_type":"code","source":"def flip_image_iaa(X):\n    X_flip = []\n    seq = iaa.Sequential([\n        iaa.Fliplr(1)\n    ])\n    for i in range(9):\n        img = X[i].reshape((1, 28, 28))\n        img_aug = seq.augment_images(img)\n        X_flip.append(img_aug[0].reshape((784)))\n    return X_flip","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c083f354659ef598d25547f1e1c0eeb81868daca"},"cell_type":"code","source":"X_flip = flip_image_iaa(X_train)\nX_flip = np.array(X_flip)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"aa8a2da58af354eb5e1f5bbd20af2c123d5e3fc6"},"cell_type":"code","source":"plot_digits(X_flip, Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"37607bbbe0668f6817b163f949d298818f919a60"},"cell_type":"code","source":"def augment_image_iaa(X):\n    X_rotate = []\n    seq = iaa.Sequential([\n        iaa.Affine(\n            scale={\"x\": (0.8, 1.2), \"y\": (0.8, 1.2)},\n            translate_percent={\"x\": (-0.2, 0.2), \"y\": (-0.2, 0.2)},\n            rotate=(-25, 25),\n            shear=(-8, 8)\n        )\n    ])\n    for i in range(9):\n        img = X[i].reshape((1, 28, 28))\n        img_aug = seq.augment_images(img)\n        X_rotate.append(img_aug.reshape((784)))\n    return X_rotate","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e8311e11de8046d515949be44c0e7a2d9806b05d"},"cell_type":"code","source":"X_aug = augment_image_iaa(X_train)\nX_aug = np.array(X_aug)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3b75e840ddf2f6df515507f6d169678717568c2f"},"cell_type":"code","source":"plot_digits(X_aug, Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"062b9753c500b7941661274db70a9b57637f7087"},"cell_type":"code","source":"X_aug = augment_image_iaa(X_train)\nX_aug = np.array(X_aug)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"eda7b3f4115719ae590d5db1c1aebd2325ff6fac"},"cell_type":"code","source":"plot_digits(X_aug, Y_train, 28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2f5e8df3a117e44e45ab60541fe0b9cc3403b6ba"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}