{"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":"# -*- coding: utf-8 -*-\n\"\"\"\nCreated on Sun Feb 13 18:40:09 2022\n\n@author: PC\n\"\"\"\n\nimport json\nimport math\nimport os\n\nimport cv2\nfrom PIL import Image\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.applications import DenseNet121\nfrom tensorflow.keras.applications.densenet import preprocess_input\n\nfrom tensorflow.keras.callbacks import Callback, ModelCheckpoint\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.optimizers import Adam\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import cohen_kappa_score, accuracy_score\nimport scipy\nfrom tqdm import tqdm\n\ndef resize_image(image_path, desired_size=224):\n    im = Image.open(image_path)\n    #im = im.resize((desired_size, desired_size ), resample=Image.LANCZOS)\n    \n    return im\n\ndef load_image_ben_orig(path,resize=True,crop=False,norm255=True,keras=False):\n    image = cv2.imread(path)\n    \n    \n    #image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        \n        \n    image=cv2.addWeighted( image,4, cv2.GaussianBlur( image , (0,0) ,  10) ,-4 ,128)\n    \n    if norm255:\n        return image/255\n    elif keras:\n        \n        image = np.expand_dims(image, axis=0)\n        return preprocess_input(image)[0]\n    else:\n        return image.astype(np.int16)\n    \n    return image\n\ndef transform_image_ben(img,resize=True,crop=False,norm255=True,keras=False):  \n    image=cv2.addWeighted( img,4, cv2.GaussianBlur( img , (0,0) ,  10) ,-4 ,128)\n    \n    if norm255:\n        return image/255\n    elif keras:\n        image = np.expand_dims(image, axis=0)\n        return preprocess_input(image)[0]\n    else:\n        return image.astype(np.int16)\n    \n    return image\n\ntrain_df = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\nprint(train_df.shape)\n","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:09.579975Z","iopub.execute_input":"2022-02-25T20:32:09.580652Z","iopub.status.idle":"2022-02-25T20:32:09.613442Z","shell.execute_reply.started":"2022-02-25T20:32:09.580586Z","shell.execute_reply":"2022-02-25T20:32:09.612290Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"N = train_df.shape[0]\nx_train = np.empty((N, 224, 224, 3), dtype=np.uint8)\n\n\nfor i, image_id in enumerate(tqdm(train_df['id_code'])):\n    x_train[i, :, :, :] = Image.open(f'../input/cropped-degrees-dataset/cropped 0.1/{image_id}.jpg')\n","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:09.616284Z","iopub.execute_input":"2022-02-25T20:32:09.616668Z","iopub.status.idle":"2022-02-25T20:32:37.009300Z","shell.execute_reply.started":"2022-02-25T20:32:09.616617Z","shell.execute_reply":"2022-02-25T20:32:37.008142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_train = pd.get_dummies(train_df['diagnosis']).values\n\nprint(x_train.shape)\n\n\nprint(y_train.shape)\n\n","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:37.010855Z","iopub.execute_input":"2022-02-25T20:32:37.011679Z","iopub.status.idle":"2022-02-25T20:32:37.022009Z","shell.execute_reply.started":"2022-02-25T20:32:37.011627Z","shell.execute_reply":"2022-02-25T20:32:37.020907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_train_multi = np.empty(y_train.shape, dtype=y_train.dtype)\ny_train_multi[:, 4] = y_train[:, 4]\n\nfor i in range(3, -1, -1):\n    y_train_multi[:, i] = np.logical_or(y_train[:, i], y_train_multi[:, i+1])\n\nprint(\"Original y_train:\", y_train.sum(axis=0))\nprint(\"Multilabel version:\", y_train_multi.sum(axis=0))\nprint(y_train)\nprint(y_train_multi)\n\n\n","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:37.024740Z","iopub.execute_input":"2022-02-25T20:32:37.025499Z","iopub.status.idle":"2022-02-25T20:32:37.041912Z","shell.execute_reply.started":"2022-02-25T20:32:37.025447Z","shell.execute_reply":"2022-02-25T20:32:37.040349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_trin, x_val, y_trin, y_val = train_test_split(\n    x_train, y_train_multi, \n    test_size=0.2,\n    random_state=2019\n)\n","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:37.044700Z","iopub.execute_input":"2022-02-25T20:32:37.045384Z","iopub.status.idle":"2022-02-25T20:32:37.259184Z","shell.execute_reply.started":"2022-02-25T20:32:37.045334Z","shell.execute_reply":"2022-02-25T20:32:37.258158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BATCH_SIZE = 32\n\ndef create_datagen():\n    return ImageDataGenerator(\n        zoom_range=0.15,  \n        rotation_range=360,\n        featurewise_std_normalization = True,\n        fill_mode='constant',\n        cval=0.,  \n        horizontal_flip=True,  \n        vertical_flip=True, \n    )\n\ndata_generator = create_datagen().flow(x_trin, y_trin, batch_size=BATCH_SIZE, seed=2019)\n\n\n","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:37.261711Z","iopub.execute_input":"2022-02-25T20:32:37.262368Z","iopub.status.idle":"2022-02-25T20:32:38.489609Z","shell.execute_reply.started":"2022-02-25T20:32:37.262305Z","shell.execute_reply":"2022-02-25T20:32:38.488420Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"densenet = DenseNet121(\n    weights=\"../input/densenet-keras/DenseNet-BC-121-32-no-top.h5\" ,\n    include_top=False,\n    input_shape=(224,224,3)\n)\n\nGAP_layer = layers.GlobalAveragePooling2D()\ndrop_layer = layers.Dropout(0.5)\ndense_layer = layers.Dense(5, activation='sigmoid', name='final_output')\n\n\n\n","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:38.491550Z","iopub.execute_input":"2022-02-25T20:32:38.491916Z","iopub.status.idle":"2022-02-25T20:32:42.672710Z","shell.execute_reply.started":"2022-02-25T20:32:38.491861Z","shell.execute_reply":"2022-02-25T20:32:42.671746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.models import Model\n\ndef build_model_functional():\n    base_model = densenet\n    #base_model.trainable=False\n    x = GAP_layer(base_model.layers[-1].output)\n    x = drop_layer(x)\n    final_output = dense_layer(x)\n    model = Model(base_model.layers[0].input, final_output)\n    \n    return model\n\n\n\n\nmodel = build_model_functional()\n#model.summary()\n\n\n","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:42.674442Z","iopub.execute_input":"2022-02-25T20:32:42.674804Z","iopub.status.idle":"2022-02-25T20:32:42.727288Z","shell.execute_reply.started":"2022-02-25T20:32:42.674741Z","shell.execute_reply":"2022-02-25T20:32:42.726292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(\n        optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001, decay=1e-6), \n        loss='binary_crossentropy', \n        metrics=['accuracy','AUC']\n    )","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:42.731838Z","iopub.execute_input":"2022-02-25T20:32:42.732281Z","iopub.status.idle":"2022-02-25T20:32:42.756365Z","shell.execute_reply.started":"2022-02-25T20:32:42.732232Z","shell.execute_reply":"2022-02-25T20:32:42.755279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bucket_num = 3\ndiv = round(train_df.shape[0]/bucket_num)","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:42.757938Z","iopub.execute_input":"2022-02-25T20:32:42.759059Z","iopub.status.idle":"2022-02-25T20:32:42.764805Z","shell.execute_reply.started":"2022-02-25T20:32:42.759002Z","shell.execute_reply":"2022-02-25T20:32:42.763758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_init = {\n    'val_loss': [0.0],\n    'val_acc': [0.0],\n    'loss': [0.0], \n    'acc': [0.0],\n    'bucket': [0.0]\n}\nresults = pd.DataFrame(df_init)","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:42.766559Z","iopub.execute_input":"2022-02-25T20:32:42.767280Z","iopub.status.idle":"2022-02-25T20:32:42.778366Z","shell.execute_reply.started":"2022-02-25T20:32:42.767224Z","shell.execute_reply":"2022-02-25T20:32:42.777227Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import math\nimport gc\n\nepochs = [5,5,5]\ncheckpoint_filepath = 'weights.{bucket_num:02d}-{epoch:02d}-{val_loss:.2f}.h5'\nmodel_checkpoint_callback = ModelCheckpoint(\n    filepath=checkpoint_filepath,\n    monitor='val_accuracy',\n    mode='max',\n    save_best_only=True)\n","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:42.780446Z","iopub.execute_input":"2022-02-25T20:32:42.780916Z","iopub.status.idle":"2022-02-25T20:32:42.791274Z","shell.execute_reply.started":"2022-02-25T20:32:42.780810Z","shell.execute_reply":"2022-02-25T20:32:42.789968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(0,bucket_num):\n    if i != (bucket_num-1):\n        print(\"Bucket Nr: {}\".format(i))\n        \n        history = model.fit_generator(\n                        data_generator,\n                        steps_per_epoch=x_trin.shape[0] / BATCH_SIZE,\n                        epochs=epochs[i],\n                        validation_data=(x_val, y_val),\n                        callbacks=[model_checkpoint_callback],\n                        )\n        \n        dic = history.history\n        df_model = pd.DataFrame(dic)\n        df_model['bucket'] = i\n    else:\n        print(\"Bucket Nr: {}\".format(i))\n        \n        history = model.fit_generator(\n                        data_generator,\n                        steps_per_epoch=x_trin.shape[0] / BATCH_SIZE,\n                        epochs=epochs[i],\n                        validation_data=(x_val, y_val),\n                        callbacks=[model_checkpoint_callback],\n                        )\n        \n        dic = history.history\n        df_model = pd.DataFrame(dic)\n        df_model['bucket'] = i\n\n    results = results.append(df_model)\n    \n    gc.collect()\n    \n    print('-'*40)","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:32:42.793427Z","iopub.execute_input":"2022-02-25T20:32:42.793844Z","iopub.status.idle":"2022-02-25T20:43:01.099666Z","shell.execute_reply.started":"2022-02-25T20:32:42.793787Z","shell.execute_reply":"2022-02-25T20:43:01.098558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(results)","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:43:01.102370Z","iopub.execute_input":"2022-02-25T20:43:01.103001Z","iopub.status.idle":"2022-02-25T20:43:01.119501Z","shell.execute_reply.started":"2022-02-25T20:43:01.102952Z","shell.execute_reply":"2022-02-25T20:43:01.118070Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_reset=results.reset_index()\nprint(df_reset)","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:43:01.121515Z","iopub.execute_input":"2022-02-25T20:43:01.121994Z","iopub.status.idle":"2022-02-25T20:43:01.144361Z","shell.execute_reply.started":"2022-02-25T20:43:01.121944Z","shell.execute_reply":"2022-02-25T20:43:01.143301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(df_reset.val_accuracy)","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:43:01.146240Z","iopub.execute_input":"2022-02-25T20:43:01.146653Z","iopub.status.idle":"2022-02-25T20:43:01.381884Z","shell.execute_reply.started":"2022-02-25T20:43:01.146574Z","shell.execute_reply":"2022-02-25T20:43:01.380799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(df_reset.val_auc)","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:43:01.388278Z","iopub.execute_input":"2022-02-25T20:43:01.389030Z","iopub.status.idle":"2022-02-25T20:43:01.618199Z","shell.execute_reply.started":"2022-02-25T20:43:01.388994Z","shell.execute_reply":"2022-02-25T20:43:01.617209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"model_0.1.h5\")","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:43:01.619925Z","iopub.execute_input":"2022-02-25T20:43:01.620539Z","iopub.status.idle":"2022-02-25T20:43:03.405367Z","shell.execute_reply.started":"2022-02-25T20:43:01.620486Z","shell.execute_reply":"2022-02-25T20:43:03.404327Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sklearn.metrics as met\n\ny_val1=y_val>0.5\ny_val2=y_val1*1\ny_pred=model.predict(x_val)\ny_pred1=y_pred>0.5\ny_pred2=y_pred1*1\nacc_score=met.accuracy_score(np.argmax(y_val, axis=1),np.argmax(y_pred, axis=1))\nacc_score1=met.accuracy_score(y_val,y_pred2)\nprint(acc_score)\nprint(acc_score1)","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:43:03.411754Z","iopub.execute_input":"2022-02-25T20:43:03.412019Z","iopub.status.idle":"2022-02-25T20:43:07.150853Z","shell.execute_reply.started":"2022-02-25T20:43:03.411986Z","shell.execute_reply":"2022-02-25T20:43:07.148845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"auc=met.roc_auc_score(np.argmax(y_val, axis=1),np.argmax(y_pred, axis=1))\nauc1=met.roc_auc_score(y_val,y_pred2)\n#print(auc)\nprint(auc1)","metadata":{"execution":{"iopub.status.busy":"2022-02-25T20:43:07.152527Z","iopub.execute_input":"2022-02-25T20:43:07.153033Z","iopub.status.idle":"2022-02-25T20:43:07.188095Z","shell.execute_reply.started":"2022-02-25T20:43:07.152983Z","shell.execute_reply":"2022-02-25T20:43:07.186667Z"},"trusted":true},"execution_count":null,"outputs":[]}]}