{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport cv2\nimport tensorflow as tf\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D, Dropout, Flatten, Dense\nfrom keras.callbacks import ReduceLROnPlateau, Callback, ModelCheckpoint\nfrom sklearn.metrics import cohen_kappa_score\nfrom keras.utils import np_utils\nfrom keras import backend as K\nfrom keras import regularizers\nfrom keras.optimizers import Adam\nimport os\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.utils import shuffle\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.models import load_model\nfrom keras.applications import DenseNet121\nfrom tqdm import tqdm\nfrom sklearn.utils import class_weight\n\n\nprint(os.listdir(\"../input/densenet\"))\ndensenet = DenseNet121(\n    weights='../input/densenet/densenet121_weights_tf_dim_ordering_tf_kernels_notop.h5',\n    include_top=False,\n    input_shape=(224,224,3)\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Metrics(Callback):\n    def on_train_begin(self, logs={}):\n        self.val_kappas = []\n\n    def on_epoch_end(self, epoch, logs={}):\n        X_val, Y_val = self.validation_data[:2]\n        Y_val = Y_val.sum(axis=1) - 1\n        \n        Y_pred = self.model.predict(X_val) > 0.5\n        Y_pred = Y_pred.astype(int).sum(axis=1) - 1\n\n        _val_kappa = cohen_kappa_score(\n            Y_val,\n            Y_pred, \n            weights='quadratic'\n        )\n\n        self.val_kappas.append(_val_kappa)\n\n        print(f\"val_kappa: {_val_kappa:.4f}\")\n        \n        if _val_kappa == max(self.val_kappas):\n            print(\"Validation Kappa has improved. Saving model.\")\n            self.model.save('model.h5')\n\n        return","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"model = Sequential()\nmodel.add(densenet)\nmodel.add(GlobalAveragePooling2D(\n))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(5, activation='sigmoid'))#, kernel_regularizer=regularizers.l2(0.0001)\n               #,activity_regularizer=regularizers.l1(0.01)))\nmodel.compile(optimizer=Adam(lr=0.0001),\n              loss='binary_crossentropy',\n              metrics=['accuracy'])\nmc = ModelCheckpoint('model.h5', monitor='val_loss', save_best_only = True, mode ='min', verbose = 1)\nrl = reduceLROnPlat = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, verbose=1, mode='auto', cooldown=1, min_lr=0.000005)\nqwk = Metrics()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for layer in model.layers:\n    layer.trainable = False\n\nfor i in range(-3,0):\n    model.layers[i].trainable = True","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\n\nx_train = []\ny_train = []\n\nfor image_name in df['id_code']:\n    temp_label = df.loc[df.id_code == image_name, 'diagnosis'].values[0]\n    image = cv2.imread('../input/aptos2019-blindness-detection/train_images/'+image_name+'.png')\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    gray_img = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)\n    mask = gray_img>7\n    img1=image[:,:,0][np.ix_(mask.any(1),mask.any(0))]\n    img2=image[:,:,1][np.ix_(mask.any(1),mask.any(0))]\n    img3=image[:,:,2][np.ix_(mask.any(1),mask.any(0))]\n    img = np.stack([img1,img2,img3],axis=-1)\n    image_arr = cv2.resize(img, (224, 224), interpolation = cv2.INTER_LANCZOS4)\n    \n    #image_arr = cv2.resize(image, (224, 224), interpolation = cv2.INTER_LANCZOS4)\n    \n    image_arr = cv2.addWeighted (image_arr, 4, cv2.GaussianBlur(image_arr, (0, 0), 10), -4, 128)\n    image_arr = image_arr.astype('float32')\n    image_arr /= 255\n    x_train.append(image_arr)\n    y_train.append(temp_label)\n\nx_train = np.array(x_train)\nx_train = x_train.reshape(x_train.shape[0], 224, 224, 3)\ny_train = np.array(y_train)\nx_train = x_train.astype('float32')\ninput_shape = (224, 224, 3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_train = np_utils.to_categorical(y_train) \n\ny_train1 = np.zeros(y_train.shape, dtype=y_train.dtype)\nfor x in range(4, -1, -1):\n    for i in range(x, -1, -1):\n        y_train1[:,i] += y_train[:,x]\ny_train1 = np.array(y_train1)\ny_train = y_train1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.15, random_state=42)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_integers = []\n\nfor label in y_train:\n    for e in range(len(label)):\n        if label[e] == 1:\n            y_integers.append(e)\n\nclass_weights = class_weight.compute_class_weight('balanced',\n                                                 np.unique(y_integers),\n                                                 y_integers)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"datagen = ImageDataGenerator(\n    zoom_range=0.2,\n    fill_mode='constant',\n    cval=0.,\n    horizontal_flip=True,\n    vertical_flip=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(datagen.flow(x_train, y_train, batch_size=32), validation_data=(x_val, y_val),\n                    steps_per_epoch=(len(x_train)/32), epochs=2)#, class_weight=class_weights)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for layer in model.layers:\n    layer.trainable = True","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer=Adam(lr=0.00005),\n              loss='binary_crossentropy',\n              metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(datagen.flow(x_train, y_train, batch_size=32), validation_data=(x_val, y_val),\n                    steps_per_epoch=(len(x_train)/32), epochs=60, callbacks=[qwk])#, class_weight=class_weights, callbacks=[rl, qwk])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"densenet = None\nx_train = None\nx_train1 = None\ny_train = None\ny_train1 = None\nx_val = None\ny_val = None\n\ndel densenet\ndel x_train\ndel x_train1\ndel y_train\ndel y_train1\ndel x_val\ndel y_val\nK.clear_session()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = load_model('model.h5')\nmodel.get_weights()\nmodel.optimizer\n\nsubmission_df = pd.read_csv('../input/aptos2019-blindness-detection/sample_submission.csv') \npredictions = []\nfor i, name in tqdm(enumerate(submission_df['id_code'])):\n    path = os.path.join('../input/aptos2019-blindness-detection/test_images/', name+'.png')\n    image = cv2.imread(path)\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    mask = gray_img>7\n    img1=image[:,:,0][np.ix_(mask.any(1),mask.any(0))]\n    img2=image[:,:,1][np.ix_(mask.any(1),mask.any(0))]\n    img3=image[:,:,2][np.ix_(mask.any(1),mask.any(0))]\n    img = np.stack([img1,img2,img3],axis=-1)\n    image = cv2.resize(img, (224, 224), interpolation = cv2.INTER_LANCZOS4)\n    \n    #image = cv2.resize(image, (224, 224), interpolation = cv2.INTER_LANCZOS4)\n    \n    image = cv2.addWeighted (image, 4, cv2.GaussianBlur(image, (0, 0), 10), -4, 128)\n    image = image.astype('float32')\n    image /= 255\n    image = image.reshape(1, 224, 224, 3)\n    score_predict=((model.predict(image).ravel()+model.predict(image[:, ::-1, :, :]).ravel()+model.predict(image[:, ::-1, ::-1, :]).ravel()+model.predict(image[:, :, ::-1, :]).ravel())*0.25).tolist()\n    #score_predict=((model.predict(image).ravel()*model.predict(image[:, ::-1, :, :]).ravel()*model.predict(image[:, ::-1, ::-1, :]).ravel()*model.predict(image[:, :, ::-1, :]).ravel())**0.25).tolist()\n    score_predict = np.array(score_predict) > 0.5\n    label_predict = score_predict.astype(int).sum() - 1\n    predictions.append(str(label_predict))\n\nsubmission_df['diagnosis'] = predictions\nsubmission_df.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]}],"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}