{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Training of modified U-Net for Optic Disc on RIM-ONE v3 database (cross-validation fold #0).\n",
"\n",
"512 px cropped by Optic Disc area and resized to 128 px images were used.\n",
"\n",
"You can either train your model or upload a pre-trained one from:\n",
"*../models_weights/01.03,10:33,OD Cup, U-Net light on RIM-ONE v3 512 px cropped to OD 128 px fold 0, SGD, log_dice loss/last_checkpoint.hdf5*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
}
],
"source": [
"import os\n",
"import glob\n",
"from datetime import datetime\n",
"#import warnings\n",
"#warnings.simplefilter('ignore')\n",
"import scipy as sp\n",
"import scipy.ndimage\n",
"import numpy as np\n",
"import pandas as pd\n",
"import tensorflow as tf\n",
"import skimage\n",
"import skimage.exposure\n",
"import skimage.transform\n",
"import mahotas as mh\n",
"from sklearn.model_selection import KFold\n",
"from PIL import Image\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"import h5py\n",
"from tqdm import tqdm_notebook\n",
"from IPython.display import display\n",
"from dual_IDG import DualImageDataGenerator"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import keras\n",
"from keras.models import Sequential, Model\n",
"from keras.layers import Dense, Dropout, Activation, Flatten, BatchNormalization, \\\n",
" Conv2D, MaxPooling2D, ZeroPadding2D, Input, Embedding, \\\n",
" Lambda, UpSampling2D, Cropping2D, Concatenate\n",
"from keras.utils import np_utils\n",
"from keras.optimizers import SGD, Adam\n",
"from keras.callbacks import ModelCheckpoint, LearningRateScheduler, ReduceLROnPlateau, CSVLogger\n",
"from keras.preprocessing.image import ImageDataGenerator\n",
"from keras import backend as K"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Keras version: 2.3.1\n",
"TensorFlow version: 2.0.0\n"
]
}
],
"source": [
"print('Keras version:', keras.__version__)\n",
"print('TensorFlow version:', tf.__version__)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"K.set_image_data_format('channels_first')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def mean_IOU_gpu(X, Y):\n",
" \"\"\"Computes mean Intersection-over-Union (IOU) for two arrays of binary images.\n",
" Assuming X and Y are of shape (n_images, w, h).\"\"\"\n",
" \n",
" #X_fl = K.clip(K.batch_flatten(X), K.epsilon(), 1.)\n",
" #Y_fl = K.clip(K.batch_flatten(Y), K.epsilon(), 1.)\n",
" X_fl = K.clip(K.batch_flatten(X), 0., 1.)\n",
" Y_fl = K.clip(K.batch_flatten(Y), 0., 1.)\n",
" X_fl = K.cast(K.greater(X_fl, 0.5), 'float32')\n",
" Y_fl = K.cast(K.greater(Y_fl, 0.5), 'float32')\n",
"\n",
" intersection = K.sum(X_fl * Y_fl, axis=1)\n",
" union = K.sum(K.maximum(X_fl, Y_fl), axis=1)\n",
" # if union == 0, it follows that intersection == 0 => score should be 0.\n",
" union = K.switch(K.equal(union, 0), K.ones_like(union), union)\n",
" return K.mean(intersection / K.cast(union, 'float32'))\n",
"\n",
"\n",
"def mean_IOU_gpu_loss(X, Y):\n",
" return -mean_IOU_gpu(X, Y)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def dice(y_true, y_pred):\n",
" # Workaround for shape bug. For some reason y_true shape was not being set correctly\n",
" #y_true.set_shape(y_pred.get_shape())\n",
"\n",
" # Without K.clip, K.sum() behaves differently when compared to np.count_nonzero()\n",
" #y_true_f = K.clip(K.batch_flatten(y_true), K.epsilon(), 1.)\n",
" #y_pred_f = K.clip(K.batch_flatten(y_pred), K.epsilon(), 1.)\n",
" y_true_f = K.clip(K.batch_flatten(y_true), 0., 1.)\n",
" y_pred_f = K.clip(K.batch_flatten(y_pred), 0., 1.)\n",
" #y_pred_f = K.greater(y_pred_f, 0.5)\n",
"\n",
" intersection = 2 * K.sum(y_true_f * y_pred_f, axis=1)\n",
" union = K.sum(y_true_f * y_true_f, axis=1) + K.sum(y_pred_f * y_pred_f, axis=1)\n",
" return K.mean(intersection / union)\n",
"\n",
"\n",
"def dice_loss(y_true, y_pred):\n",
" return -dice(y_true, y_pred)\n",
"\n",
"\n",
"def log_dice_loss(y_true, y_pred):\n",
" return -K.log(dice(y_true, y_pred))\n",
"\n",
"\n",
"def dice_metric(y_true, y_pred):\n",
" \"\"\"An exact Dice score for binary tensors.\"\"\"\n",
" y_true_f = K.cast(K.greater(y_true, 0.5), 'float32')\n",
" y_pred_f = K.cast(K.greater(y_pred, 0.5), 'float32')\n",
" return dice(y_true_f, y_pred_f)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def tf_to_th_encoding(X):\n",
" return np.rollaxis(X, 3, 1)\n",
"\n",
"\n",
"def th_to_tf_encoding(X):\n",
" return np.rollaxis(X, 1, 4)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# h5f = h5py.File(os.path.join(os.path.dirname(os.getcwd()), 'data', 'hdf5_datasets', 'all_data.hdf5'), 'r')\n",
"h5f = h5py.File(os.path.join(os.path.dirname(os.getcwd()), 'data', 'hdf5_datasets', 'RIM_ONE_v3.hdf5'), 'r')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### U-Net architecture\n",
"\n",
""
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"def get_unet_light(img_rows=256, img_cols=256):\n",
" inputs = Input((3, img_rows, img_cols))\n",
" conv1 = Conv2D(32, kernel_size=3, activation='relu', padding='same')(inputs)\n",
" conv1 = Dropout(0.3)(conv1)\n",
" conv1 = Conv2D(32, kernel_size=3, activation='relu', padding='same')(conv1)\n",
" pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)\n",
"\n",
" conv2 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(pool1)\n",
" conv2 = Dropout(0.3)(conv2)\n",
" conv2 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(conv2)\n",
" pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)\n",
"\n",
" conv3 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(pool2)\n",
" conv3 = Dropout(0.3)(conv3)\n",
" conv3 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(conv3)\n",
" pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)\n",
"\n",
" conv4 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(pool3)\n",
" conv4 = Dropout(0.3)(conv4)\n",
" conv4 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(conv4)\n",
" pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)\n",
"\n",
" conv5 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(pool4)\n",
" conv5 = Dropout(0.3)(conv5)\n",
" conv5 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(conv5)\n",
"\n",
" up6 = Concatenate(axis=1)([UpSampling2D(size=(2, 2))(conv5), conv4])\n",
" conv6 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(up6)\n",
" conv6 = Dropout(0.3)(conv6)\n",
" conv6 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(conv6)\n",
"\n",
" up7 = Concatenate(axis=1)([UpSampling2D(size=(2, 2))(conv6), conv3])\n",
" conv7 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(up7)\n",
" conv7 = Dropout(0.3)(conv7)\n",
" conv7 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(conv7)\n",
"\n",
" up8 = Concatenate(axis=1)([UpSampling2D(size=(2, 2))(conv7), conv2])\n",
" conv8 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(up8)\n",
" conv8 = Dropout(0.3)(conv8)\n",
" conv8 = Conv2D(64, kernel_size=3, activation='relu', padding='same')(conv8)\n",
"\n",
" up9 = Concatenate(axis=1)([UpSampling2D(size=(2, 2))(conv8), conv1])\n",
" conv9 = Conv2D(32, kernel_size=3, activation='relu', padding='same')(up9)\n",
" conv9 = Dropout(0.3)(conv9)\n",
" conv9 = Conv2D(32, kernel_size=3, activation='relu', padding='same')(conv9)\n",
"\n",
" conv10 = Conv2D(1, kernel_size=1, activation='sigmoid', padding='same')(conv9)\n",
" #conv10 = Flatten()(conv10)\n",
"\n",
" model = Model(input=inputs, output=conv10)\n",
"\n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/artem/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:50: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"co...)`\n"
]
}
],
"source": [
"model = get_unet_light(img_rows=128, img_cols=128)\n",
"model.compile(optimizer=SGD(lr=3e-4, momentum=0.95),\n",
" loss=log_dice_loss,\n",
" metrics=[mean_IOU_gpu, dice_metric])"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"model_1\"\n",
"__________________________________________________________________________________________________\n",
"Layer (type) Output Shape Param # Connected to \n",
"==================================================================================================\n",
"input_1 (InputLayer) (None, 3, 128, 128) 0 \n",
"__________________________________________________________________________________________________\n",
"conv2d_1 (Conv2D) (None, 32, 128, 128) 896 input_1[0][0] \n",
"__________________________________________________________________________________________________\n",
"dropout_1 (Dropout) (None, 32, 128, 128) 0 conv2d_1[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_2 (Conv2D) (None, 32, 128, 128) 9248 dropout_1[0][0] \n",
"__________________________________________________________________________________________________\n",
"max_pooling2d_1 (MaxPooling2D) (None, 32, 64, 64) 0 conv2d_2[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_3 (Conv2D) (None, 64, 64, 64) 18496 max_pooling2d_1[0][0] \n",
"__________________________________________________________________________________________________\n",
"dropout_2 (Dropout) (None, 64, 64, 64) 0 conv2d_3[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_4 (Conv2D) (None, 64, 64, 64) 36928 dropout_2[0][0] \n",
"__________________________________________________________________________________________________\n",
"max_pooling2d_2 (MaxPooling2D) (None, 64, 32, 32) 0 conv2d_4[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_5 (Conv2D) (None, 64, 32, 32) 36928 max_pooling2d_2[0][0] \n",
"__________________________________________________________________________________________________\n",
"dropout_3 (Dropout) (None, 64, 32, 32) 0 conv2d_5[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_6 (Conv2D) (None, 64, 32, 32) 36928 dropout_3[0][0] \n",
"__________________________________________________________________________________________________\n",
"max_pooling2d_3 (MaxPooling2D) (None, 64, 16, 16) 0 conv2d_6[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_7 (Conv2D) (None, 64, 16, 16) 36928 max_pooling2d_3[0][0] \n",
"__________________________________________________________________________________________________\n",
"dropout_4 (Dropout) (None, 64, 16, 16) 0 conv2d_7[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_8 (Conv2D) (None, 64, 16, 16) 36928 dropout_4[0][0] \n",
"__________________________________________________________________________________________________\n",
"max_pooling2d_4 (MaxPooling2D) (None, 64, 8, 8) 0 conv2d_8[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_9 (Conv2D) (None, 64, 8, 8) 36928 max_pooling2d_4[0][0] \n",
"__________________________________________________________________________________________________\n",
"dropout_5 (Dropout) (None, 64, 8, 8) 0 conv2d_9[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_10 (Conv2D) (None, 64, 8, 8) 36928 dropout_5[0][0] \n",
"__________________________________________________________________________________________________\n",
"up_sampling2d_1 (UpSampling2D) (None, 64, 16, 16) 0 conv2d_10[0][0] \n",
"__________________________________________________________________________________________________\n",
"concatenate_1 (Concatenate) (None, 128, 16, 16) 0 up_sampling2d_1[0][0] \n",
" conv2d_8[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_11 (Conv2D) (None, 64, 16, 16) 73792 concatenate_1[0][0] \n",
"__________________________________________________________________________________________________\n",
"dropout_6 (Dropout) (None, 64, 16, 16) 0 conv2d_11[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_12 (Conv2D) (None, 64, 16, 16) 36928 dropout_6[0][0] \n",
"__________________________________________________________________________________________________\n",
"up_sampling2d_2 (UpSampling2D) (None, 64, 32, 32) 0 conv2d_12[0][0] \n",
"__________________________________________________________________________________________________\n",
"concatenate_2 (Concatenate) (None, 128, 32, 32) 0 up_sampling2d_2[0][0] \n",
" conv2d_6[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_13 (Conv2D) (None, 64, 32, 32) 73792 concatenate_2[0][0] \n",
"__________________________________________________________________________________________________\n",
"dropout_7 (Dropout) (None, 64, 32, 32) 0 conv2d_13[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_14 (Conv2D) (None, 64, 32, 32) 36928 dropout_7[0][0] \n",
"__________________________________________________________________________________________________\n",
"up_sampling2d_3 (UpSampling2D) (None, 64, 64, 64) 0 conv2d_14[0][0] \n",
"__________________________________________________________________________________________________\n",
"concatenate_3 (Concatenate) (None, 128, 64, 64) 0 up_sampling2d_3[0][0] \n",
" conv2d_4[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_15 (Conv2D) (None, 64, 64, 64) 73792 concatenate_3[0][0] \n",
"__________________________________________________________________________________________________\n",
"dropout_8 (Dropout) (None, 64, 64, 64) 0 conv2d_15[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_16 (Conv2D) (None, 64, 64, 64) 36928 dropout_8[0][0] \n",
"__________________________________________________________________________________________________\n",
"up_sampling2d_4 (UpSampling2D) (None, 64, 128, 128) 0 conv2d_16[0][0] \n",
"__________________________________________________________________________________________________\n",
"concatenate_4 (Concatenate) (None, 96, 128, 128) 0 up_sampling2d_4[0][0] \n",
" conv2d_2[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_17 (Conv2D) (None, 32, 128, 128) 27680 concatenate_4[0][0] \n",
"__________________________________________________________________________________________________\n",
"dropout_9 (Dropout) (None, 32, 128, 128) 0 conv2d_17[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_18 (Conv2D) (None, 32, 128, 128) 9248 dropout_9[0][0] \n",
"__________________________________________________________________________________________________\n",
"conv2d_19 (Conv2D) (None, 1, 128, 128) 33 conv2d_18[0][0] \n",
"==================================================================================================\n",
"Total params: 656,257\n",
"Trainable params: 656,257\n",
"Non-trainable params: 0\n",
"__________________________________________________________________________________________________\n"
]
}
],
"source": [
"model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### RIM-ONE v3\n",
"\n",
"Accessing data, preparing train/validation sets division:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# Loading full images of desired resolution:\n",
"X = h5f['RIM-ONE v3/512 px/images']\n",
"Y = h5f['RIM-ONE v3/512 px/cup']\n",
"disc_locations = h5f['RIM-ONE v3/512 px/disc_locations']"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(,\n",
" )"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X, Y"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49\n",
" 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67\n",
" 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85\n",
" 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103\n",
" 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121\n",
" 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139\n",
" 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157\n",
" 158] [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n",
" 24 25 26 27 28 29 30 31]\n",
"[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17\n",
" 18 19 20 21 22 23 24 25 26 27 28 29 30 31 64 65 66 67\n",
" 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85\n",
" 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103\n",
" 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121\n",
" 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139\n",
" 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157\n",
" 158] [32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55\n",
" 56 57 58 59 60 61 62 63]\n",
"[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17\n",
" 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35\n",
" 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53\n",
" 54 55 56 57 58 59 60 61 62 63 96 97 98 99 100 101 102 103\n",
" 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121\n",
" 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139\n",
" 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157\n",
" 158] [64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87\n",
" 88 89 90 91 92 93 94 95]\n",
"[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17\n",
" 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35\n",
" 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53\n",
" 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71\n",
" 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89\n",
" 90 91 92 93 94 95 128 129 130 131 132 133 134 135 136 137 138 139\n",
" 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157\n",
" 158] [ 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113\n",
" 114 115 116 117 118 119 120 121 122 123 124 125 126 127]\n",
"[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17\n",
" 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35\n",
" 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53\n",
" 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71\n",
" 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89\n",
" 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107\n",
" 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125\n",
" 126 127] [128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145\n",
" 146 147 148 149 150 151 152 153 154 155 156 157 158]\n"
]
}
],
"source": [
"train_idx_cv, test_idx_cv = [], []\n",
"\n",
"for _train_idx, _test_idx in KFold(n_splits=5, random_state=1).split(X):\n",
" print(_train_idx, _test_idx)\n",
" train_idx_cv.append(_train_idx)\n",
" test_idx_cv.append(_test_idx)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"#train_idx = h5f['RIM-ONE v3/train_idx_driu']\n",
"#test_idx = h5f['RIM-ONE v3/test_idx_driu']\n",
"\n",
"train_idx = train_idx_cv[0]\n",
"test_idx = test_idx_cv[0]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(159, 127, 32)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(X), len(train_idx), len(test_idx)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Generator of augmented data:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"train_idg = DualImageDataGenerator(#rescale=1/255.0,\n",
" #samplewise_center=True, samplewise_std_normalization=True,\n",
" horizontal_flip=True, vertical_flip=True,\n",
" rotation_range=20, width_shift_range=0.1, height_shift_range=0.1,\n",
" zoom_range=(0.8, 1.2),\n",
" fill_mode='constant', cval=0.0)\n",
"test_idg = DualImageDataGenerator()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Preprocessing function and data generator:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"def preprocess(batch_X, batch_y, train_or_test='train'): \n",
" if train_or_test == 'train':\n",
" batch_X, batch_y = next(train_idg.flow(batch_X, batch_y, batch_size=len(batch_X), shuffle=False))\n",
" elif train_or_test == 'test':\n",
" batch_X, batch_y = next(test_idg.flow(batch_X, batch_y, batch_size=len(batch_X), shuffle=False))\n",
" batch_X = th_to_tf_encoding(batch_X)\n",
" batch_X = [skimage.exposure.equalize_adapthist(batch_X[i])\n",
" for i in range(len(batch_X))]\n",
" batch_X = np.array(batch_X)\n",
" batch_X = tf_to_th_encoding(batch_X)\n",
" return batch_X, batch_y\n",
"\n",
"\n",
"def data_generator(X, y, resize_to=128, train_or_test='train', batch_size=3, return_orig=False, stationary=False):\n",
" while True:\n",
" if train_or_test == 'train':\n",
" idx = np.random.choice(train_idx, size=batch_size)\n",
" elif train_or_test == 'test':\n",
" if stationary:\n",
" idx = test_idx[:batch_size]\n",
" else:\n",
" idx = np.random.choice(test_idx, size=batch_size)\n",
" batch_X = [X[i][disc_locations[i][0]:disc_locations[i][2], disc_locations[i][1]:disc_locations[i][3]] \n",
" for i in idx]\n",
" batch_X = [np.rollaxis(img, 2) for img in batch_X]\n",
" batch_X = [skimage.transform.resize(np.rollaxis(img, 0, 3), (resize_to, resize_to))\n",
" for img in batch_X]\n",
" batch_X = np.array(batch_X).copy()\n",
" \n",
" batch_y = [y[i][disc_locations[i][0]:disc_locations[i][2], disc_locations[i][1]:disc_locations[i][3]] \n",
" for i in idx]\n",
" batch_y = [img[..., 0] for img in batch_y]\n",
" batch_y = [skimage.transform.resize(img, (resize_to, resize_to))[..., None] for img in batch_y]\n",
" batch_y = np.array(batch_y).copy()\n",
" batch_X = tf_to_th_encoding(batch_X)\n",
" batch_y = tf_to_th_encoding(batch_y)\n",
" if return_orig:\n",
" batch_X_orig, batch_Y_orig = batch_X.copy(), batch_y.copy()\n",
" \n",
" batch_X, batch_y = preprocess(batch_X, batch_y, train_or_test)\n",
" \n",
" if not return_orig:\n",
" yield batch_X, batch_y\n",
" else:\n",
" yield batch_X, batch_y, batch_X_orig, batch_Y_orig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Testing the data generator and generator for augmented data:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/artem/miniconda3/lib/python3.7/site-packages/skimage/color/colorconv.py:265: RuntimeWarning: divide by zero encountered in true_divide\n",
" out_s = delta / out_v\n",
"/home/artem/miniconda3/lib/python3.7/site-packages/skimage/color/colorconv.py:271: RuntimeWarning: divide by zero encountered in true_divide\n",
" out[idx, 0] = (arr[idx, 1] - arr[idx, 2]) / delta[idx]\n",
"/home/artem/miniconda3/lib/python3.7/site-packages/skimage/util/dtype.py:135: UserWarning: Possible precision loss when converting from float64 to uint16\n",
" .format(dtypeobj_in, dtypeobj_out))\n"
]
},
{
"data": {
"text/plain": [
"(1, 3, 128, 128)"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gen = data_generator(X, Y, 128, 'train', batch_size=1)\n",
"batch = next(gen)\n",
"batch[0].shape"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"