{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport sys\nimport pandas as pd\nimport numpy as np\nimport math\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport cv2\nimport PIL\n\nimport random\nimport tensorflow as tf\nimport tensorflow_addons as tfa\nfrom keras_preprocessing.image import ImageDataGenerator\n\nfrom pathlib import Path\nfrom glob import glob\nfrom random import randrange\n\nfrom collections import defaultdict\nfrom openslide import OpenSlide\n\nfrom tensorflow.keras import layers, models, Model, Input, backend\nfrom keras.models import Sequential\n#print(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))\nfrom skimage.exposure import is_low_contrast\nfrom collections import defaultdict\nfrom skimage.io import imread\nfrom PIL import Image\nfrom pathlib import Path\nfrom tqdm import tqdm\n\nrandom.seed(19)\ntf.random.set_seed(19)","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:39.387791Z","iopub.execute_input":"2022-10-12T05:00:39.388428Z","iopub.status.idle":"2022-10-12T05:00:42.184211Z","shell.execute_reply.started":"2022-10-12T05:00:39.388354Z","shell.execute_reply":"2022-10-12T05:00:42.183218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"orig_data_path='../input/mayo-clinic-strip-ai/'\n\ntrain_path = orig_data_path + 'train/'\nother_path = orig_data_path + 'other/'","metadata":{"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:42.190268Z","iopub.execute_input":"2022-10-12T05:00:42.19101Z","iopub.status.idle":"2022-10-12T05:00:42.196105Z","shell.execute_reply.started":"2022-10-12T05:00:42.190957Z","shell.execute_reply":"2022-10-12T05:00:42.195027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv_data = pd.read_csv(orig_data_path + 'train.csv')\nother_csv_data = pd.read_csv(orig_data_path + 'other.csv')","metadata":{"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:42.1977Z","iopub.execute_input":"2022-10-12T05:00:42.198357Z","iopub.status.idle":"2022-10-12T05:00:42.21457Z","shell.execute_reply.started":"2022-10-12T05:00:42.198321Z","shell.execute_reply":"2022-10-12T05:00:42.213689Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"other_csv_data.head()","metadata":{"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:42.217663Z","iopub.execute_input":"2022-10-12T05:00:42.21806Z","iopub.status.idle":"2022-10-12T05:00:42.234265Z","shell.execute_reply.started":"2022-10-12T05:00:42.218027Z","shell.execute_reply":"2022-10-12T05:00:42.23323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv_data.label.value_counts()","metadata":{"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:42.235675Z","iopub.execute_input":"2022-10-12T05:00:42.236349Z","iopub.status.idle":"2022-10-12T05:00:42.244814Z","shell.execute_reply.started":"2022-10-12T05:00:42.23631Z","shell.execute_reply":"2022-10-12T05:00:42.243865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path_train_images = '../input/mayo-clinic-tiles/output/train/tiles2/'\ntrain_ids = next(os.walk(path_train_images))[2]\nimg_list = os.listdir('../input/mayo-clinic-tiles/output/train/tiles2/')","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:42.246358Z","iopub.execute_input":"2022-10-12T05:00:42.246787Z","iopub.status.idle":"2022-10-12T05:00:42.272929Z","shell.execute_reply.started":"2022-10-12T05:00:42.24675Z","shell.execute_reply":"2022-10-12T05:00:42.272042Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show(path):\n    image = Image.open(path_train_images + path)\n    print(image.size)\n    plt.figure()\n    plt.imshow(image)\n    plt.colorbar()\n    plt.grid(False)\n    plt.show()\n    \nshow(img_list[0])","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:42.274511Z","iopub.execute_input":"2022-10-12T05:00:42.274909Z","iopub.status.idle":"2022-10-12T05:00:42.543506Z","shell.execute_reply.started":"2022-10-12T05:00:42.274872Z","shell.execute_reply":"2022-10-12T05:00:42.542534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# function to check if the image contains useful information after the crop.\ndef get_score(img):\n    imgray = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2GRAY)\n    ret, thresh = cv2.threshold(imgray, 127, 255, 0)\n    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)\n    #print(len(hierarchy[0]), len(contours))\n    return len(contours)","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:42.545094Z","iopub.execute_input":"2022-10-12T05:00:42.545444Z","iopub.status.idle":"2022-10-12T05:00:42.551158Z","shell.execute_reply.started":"2022-10-12T05:00:42.545408Z","shell.execute_reply":"2022-10-12T05:00:42.550094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"low_sc_images = []\ndef load_train_df():\n    train_df = defaultdict(list)\n    img_indx = 0\n    print('Loading train images...')\n    for i, proc_image_id in tqdm(enumerate(train_ids), total=len(train_ids)):\n        fnames = ['0ba49d_0', '0ba49d_0', '006388_0']   \n        if any(f in proc_image_id for f in fnames):\n            continue\n        if(train_csv_data.loc[train_csv_data['image_id'] == proc_image_id[:-8]].empty):\n            continue\n            \n        label = train_csv_data.loc[train_csv_data['image_id'] == proc_image_id[:-8]]['label'].item()\n        center_id = train_csv_data.loc[train_csv_data['image_id'] == proc_image_id[:-8]]['center_id'].item()\n        \n        path_tiles = path_train_images + proc_image_id\n        train_df['image_id'].append(proc_image_id)\n        train_df['label'].append(label)\n        img_indx += 1\n                \n    return pd.DataFrame(train_df)","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:42.552643Z","iopub.execute_input":"2022-10-12T05:00:42.553177Z","iopub.status.idle":"2022-10-12T05:00:42.564138Z","shell.execute_reply.started":"2022-10-12T05:00:42.553138Z","shell.execute_reply":"2022-10-12T05:00:42.563217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = load_train_df()","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:42.565358Z","iopub.execute_input":"2022-10-12T05:00:42.5657Z","iopub.status.idle":"2022-10-12T05:00:48.799241Z","shell.execute_reply.started":"2022-10-12T05:00:42.565663Z","shell.execute_reply":"2022-10-12T05:00:48.798366Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['label'].value_counts()","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:52.68543Z","iopub.execute_input":"2022-10-12T05:00:52.686195Z","iopub.status.idle":"2022-10-12T05:00:52.694137Z","shell.execute_reply.started":"2022-10-12T05:00:52.686155Z","shell.execute_reply":"2022-10-12T05:00:52.693185Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_crop(image):\n#    image = Image.open(path_train_crops + path)\n    image = np.asarray(image)\n    print('is_low_contrast', is_low_contrast(image))\n    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)\n    plt.figure()\n    plt.imshow(image)\n    plt.colorbar()\n    plt.grid(False)\n    plt.show()","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:54.410631Z","iopub.execute_input":"2022-10-12T05:00:54.411714Z","iopub.status.idle":"2022-10-12T05:00:54.418687Z","shell.execute_reply.started":"2022-10-12T05:00:54.411664Z","shell.execute_reply":"2022-10-12T05:00:54.417564Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# show_crop(low_sc_images[7])\n# #len(low_sc_images)","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:56.14564Z","iopub.execute_input":"2022-10-12T05:00:56.146018Z","iopub.status.idle":"2022-10-12T05:00:56.150942Z","shell.execute_reply.started":"2022-10-12T05:00:56.145983Z","shell.execute_reply":"2022-10-12T05:00:56.149875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMG_SIZE = 224","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:00:56.470213Z","iopub.execute_input":"2022-10-12T05:00:56.47051Z","iopub.status.idle":"2022-10-12T05:00:56.476644Z","shell.execute_reply.started":"2022-10-12T05:00:56.470481Z","shell.execute_reply":"2022-10-12T05:00:56.475563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_shape = (IMG_SIZE, IMG_SIZE)\n\ndatagen=ImageDataGenerator(rescale=1./255,\n                           zoom_range=0.2,\n                           rotation_range=20,\n                           validation_split=0.2)\ntrain_gen = datagen.flow_from_dataframe(\n                         train_df,\n                         directory=path_train_images,\n                         x_col = 'image_id',\n                         y_col = 'label',\n                         target_size=image_shape,\n                         class_mode = 'sparse',\n                         color_mode = 'rgb',\n                         shuffle=True,\n                         batch_size=16,\n                         seed=19,\n                         subset='training')\nvalidation_gen = datagen.flow_from_dataframe(\n                         train_df,\n                         directory=path_train_images,\n                         x_col = 'image_id',\n                         y_col = 'label',\n                         target_size=image_shape,\n                         class_mode = 'sparse',\n                         color_mode = 'rgb',\n                         shuffle=True,\n                         batch_size=16,\n                         seed=19,\n                         subset='validation')","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:01:13.526538Z","iopub.execute_input":"2022-10-12T05:01:13.527283Z","iopub.status.idle":"2022-10-12T05:01:14.019289Z","shell.execute_reply.started":"2022-10-12T05:01:13.527245Z","shell.execute_reply":"2022-10-12T05:01:14.018343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_gen.class_indices","metadata":{"_kg_hide-input":true,"tags":[],"execution":{"iopub.status.busy":"2022-10-12T05:01:15.425938Z","iopub.execute_input":"2022-10-12T05:01:15.427899Z","iopub.status.idle":"2022-10-12T05:01:15.436821Z","shell.execute_reply.started":"2022-10-12T05:01:15.427851Z","shell.execute_reply":"2022-10-12T05:01:15.435604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def squeeze_module(x, dim, idx):\n    name = 'conv_' + idx + '_sq'\n    x = layers.Conv2D(filters=dim, kernel_size=1, strides=1, padding=\"same\", name=name)(x)\n    x = layers.BatchNormalization()(x)\n    x = layers.Activation('relu')(x)\n    return x\n\ndef expand_module(x, dim, idx):\n    name = 'conv_' + idx + '_ex_' + '0'\n    net1 = layers.Conv2D(filters=dim, kernel_size=1, strides=1, padding=\"same\", name=name)(x)\n\n    name = 'conv_' + idx + '_ex_' + '1'\n    net2 = layers.Conv2D(filters=dim, kernel_size=3, strides=1, padding=\"same\", name=name)(x)\n    \n    output = tf.concat([net1, net2], 3)\n    output = layers.BatchNormalization()(output)\n    output = layers.Activation('relu')(output)\n\n    return output","metadata":{"execution":{"iopub.status.busy":"2022-10-12T05:01:16.84633Z","iopub.execute_input":"2022-10-12T05:01:16.846743Z","iopub.status.idle":"2022-10-12T05:01:16.854639Z","shell.execute_reply.started":"2022-10-12T05:01:16.846707Z","shell.execute_reply":"2022-10-12T05:01:16.853525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def fire_module(input_tensor, squeeze_dim, expand_dim, idx):\n    net = squeeze_module(input_tensor, squeeze_dim, idx)\n    net = expand_module(net, expand_dim, idx)\n    return net","metadata":{"execution":{"iopub.status.busy":"2022-10-12T05:01:17.985519Z","iopub.execute_input":"2022-10-12T05:01:17.986262Z","iopub.status.idle":"2022-10-12T05:01:17.991945Z","shell.execute_reply.started":"2022-10-12T05:01:17.986222Z","shell.execute_reply":"2022-10-12T05:01:17.99072Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_model():\n    inputA = Input(shape=(IMG_SIZE, IMG_SIZE, 3))\n    x = layers.Conv2D(filters=96, kernel_size=5, strides=2, name='conv0')(inputA) #384\n    x = layers.BatchNormalization()(x)\n    x = layers.Activation('relu')(x)\n#     x = layers.Dropout(0.2)(x)\n    \n    x = layers.MaxPool2D(pool_size=(3, 3), strides=2, padding='same')(x) #96\n    \n    x = fire_module(x, 16, 64, '0')\n    x = fire_module(x, 16, 64, '1')\n    x = fire_module(x, 32, 128, '2')\n    x = layers.MaxPool2D(pool_size=(3, 3), strides=2, padding='same')(x)\n\n    x = fire_module(x, 32, 128, '3')\n    x = fire_module(x, 48, 192, '4')\n    x = fire_module(x, 48, 192, '5')\n    x = fire_module(x, 64, 256, '6')\n    x = layers.MaxPool2D(pool_size=(3, 3), strides=2, padding='same')(x)\n\n    x = fire_module(x, 64, 512, '7')\n    x = layers.Dropout(0.5)(x)\n    \n    x = layers.Conv2D(filters=2048, kernel_size=1, strides=1, name='conv1')(x) #384\n    x = layers.BatchNormalization()(x)\n    x = layers.Activation('relu')(x)\n    \n    x = tf.expand_dims(x, -1)\n    x = layers.AveragePooling3D(pool_size=(14, 14, 1024))(x)\n    x = tf.squeeze(x, [1, 2, 4])\n    x = layers.Softmax()(x)\n\n    model = Model(inputs=inputA, outputs=x)\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-10-12T05:01:18.385636Z","iopub.execute_input":"2022-10-12T05:01:18.388201Z","iopub.status.idle":"2022-10-12T05:01:18.398486Z","shell.execute_reply.started":"2022-10-12T05:01:18.38816Z","shell.execute_reply":"2022-10-12T05:01:18.397339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = make_model()\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-10-12T05:01:19.015467Z","iopub.execute_input":"2022-10-12T05:01:19.016169Z","iopub.status.idle":"2022-10-12T05:01:20.627306Z","shell.execute_reply.started":"2022-10-12T05:01:19.016129Z","shell.execute_reply":"2022-10-12T05:01:20.62635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor='loss', factor=0.1, verbose=1,mode='min',patience=3, min_lr=1E-6)\nearly_st = tf.keras.callbacks.EarlyStopping(monitor='val_accuracy', min_delta=1E-5, patience=5, verbose=1, mode='min', baseline=None, \n                                            restore_best_weights=True)\n\nmodel.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),\n              metrics=['accuracy'])\n\nhistory = model.fit(train_gen, epochs=200, shuffle=True, validation_data=validation_gen, callbacks=[reduce_lr])\n#, callbacks=[cp_callback, es_callback]","metadata":{"execution":{"iopub.status.busy":"2022-10-12T05:01:20.629109Z","iopub.execute_input":"2022-10-12T05:01:20.629596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history['accuracy'], label='accuracy')\nplt.plot(history.history['val_accuracy'], label = 'val_accuracy')\n\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\n#plt.xlim([0, 1])\n#plt.ylim([0, 1])\nplt.legend(loc='lower right')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history['loss'], label='loss')\nplt.plot(history.history['val_loss'], label = 'val_loss')\n\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.ylim([0, 1])\nplt.legend(loc='lower right')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('mc_strip_ai.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}