{"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 shap\nimport random\nimport warnings\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.utils import class_weight\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix, cohen_kappa_score\nfrom keras.models import Model\nfrom keras import optimizers, applications\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau\nfrom keras.layers import Dense, Dropout, GlobalAveragePooling2D, Input, Conv2D, MaxPooling2D, Flatten\nimport matplotlib.image as mpimg\nimport shutil\nfrom PIL import Image\nimport cv2\nfrom keras.preprocessing import image as kimage\nfrom lime import lime_image\nfrom skimage.segmentation import mark_boundaries","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"_kg_hide-output":true,"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.status.busy":"2022-03-13T21:17:27.911996Z","iopub.execute_input":"2022-03-13T21:17:27.912419Z","iopub.status.idle":"2022-03-13T21:17:32.543985Z","shell.execute_reply.started":"2022-03-13T21:17:27.912346Z","shell.execute_reply":"2022-03-13T21:17:32.543052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras\nkeras.__version__","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:17:32.546232Z","iopub.execute_input":"2022-03-13T21:17:32.546513Z","iopub.status.idle":"2022-03-13T21:17:32.559383Z","shell.execute_reply.started":"2022-03-13T21:17:32.546458Z","shell.execute_reply":"2022-03-13T21:17:32.558466Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load data","metadata":{"_kg_hide-output":true}},{"cell_type":"code","source":"train = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\ntest = pd.read_csv('../input/aptos2019-blindness-detection/test.csv')\nprint('Number of train samples: ', train.shape[0])\nprint('Number of test samples: ', test.shape[0])\n\n# Preprocess data\ntrain[\"id_code\"] = train[\"id_code\"].apply(lambda x: x + \".png\")\ntest[\"id_code\"] = test[\"id_code\"].apply(lambda x: x + \".png\")\ntrain['diagnosis'] = train['diagnosis'].astype('str')\ntrain.head()","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_kg_hide-input":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","execution":{"iopub.status.busy":"2022-03-13T21:17:32.560863Z","iopub.execute_input":"2022-03-13T21:17:32.56109Z","iopub.status.idle":"2022-03-13T21:17:32.623213Z","shell.execute_reply.started":"2022-03-13T21:17:32.561055Z","shell.execute_reply":"2022-03-13T21:17:32.622505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Split into train and test","metadata":{}},{"cell_type":"code","source":"# train[train['diagnosis']=='0']","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:17:32.624434Z","iopub.execute_input":"2022-03-13T21:17:32.624725Z","iopub.status.idle":"2022-03-13T21:17:32.628584Z","shell.execute_reply.started":"2022-03-13T21:17:32.624674Z","shell.execute_reply":"2022-03-13T21:17:32.627854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"list_0=[]\nfor a in train[train['diagnosis']=='0']['id_code']:\n    list_0.append(a)\nlist_1=[]\nfor b in train[train['diagnosis']=='1']['id_code']:\n    list_1.append(b)\nlist_2=[]\nfor c in train[train['diagnosis']=='2']['id_code']:\n    list_2.append(c)\nlist_3=[]\nfor d in train[train['diagnosis']=='3']['id_code']:\n    list_3.append(d)\nlist_4=[]\nfor e in train[train['diagnosis']=='4']['id_code']:\n    list_4.append(e)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:17:32.631779Z","iopub.execute_input":"2022-03-13T21:17:32.63211Z","iopub.status.idle":"2022-03-13T21:17:32.650543Z","shell.execute_reply.started":"2022-03-13T21:17:32.632055Z","shell.execute_reply":"2022-03-13T21:17:32.64965Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(list_4)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:17:32.653078Z","iopub.execute_input":"2022-03-13T21:17:32.6536Z","iopub.status.idle":"2022-03-13T21:17:32.658999Z","shell.execute_reply.started":"2022-03-13T21:17:32.653541Z","shell.execute_reply":"2022-03-13T21:17:32.658152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = \"../input/aptos2019-blindness-detection/train_images/\"\n#train_sep_dir = '..input/train_sep/'\n    # Create subdirectory with `class_name`\nif not os.path.exists(\"train_split\" + \"4\"):\n        os.mkdir(\"train_split\" + \"4\")\nfor i in list_4:\n    src_path = train_dir + i\n    \n    dst_path = \"train_split\" + \"4\" + \"/\" + i\n#     shutil.copy(src_path, dst_path)\n    img = cv2.imread(src_path)\n    img = cv2.resize(img, (224, 224))\n    cv2.imwrite('train_split' + '4' + '/' + i, img)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:17:32.660673Z","iopub.execute_input":"2022-03-13T21:17:32.661201Z","iopub.status.idle":"2022-03-13T21:18:21.009857Z","shell.execute_reply.started":"2022-03-13T21:17:32.661145Z","shell.execute_reply":"2022-03-13T21:18:21.008945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ntrain_dir = \"../input/aptos2019-blindness-detection/train_images/\"\n\nif not os.path.exists(\"train_split\" + \"3\"):\n        os.mkdir(\"train_split\" + \"3\")\nfor i in list_3:\n    src_path = train_dir + i \n    dst_path = \"train_split\" + \"3\" + \"/\" + i\n#     shutil.copy(src_path, dst_path)\n    img = cv2.imread(src_path)\n    img = cv2.resize(img, (224, 224))\n    cv2.imwrite('train_split' + '3' + '/' + i, img)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:18:21.011541Z","iopub.execute_input":"2022-03-13T21:18:21.011925Z","iopub.status.idle":"2022-03-13T21:18:49.605168Z","shell.execute_reply.started":"2022-03-13T21:18:21.011859Z","shell.execute_reply":"2022-03-13T21:18:49.604341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ntrain_dir = \"../input/aptos2019-blindness-detection/train_images/\"\n#train_sep_dir = '..input/train_sep/'\n    # Create subdirectory with `class_name`\nif not os.path.exists(\"train_split\" + \"2\"):\n        os.mkdir(\"train_split\" + \"2\")\nfor i in list_2:\n    src_path = train_dir + i\n    dst_path = \"train_split\" + \"2\" + \"/\" + i\n#     shutil.copy(src_path, dst_path)\n    img = cv2.imread(src_path)\n    img = cv2.resize(img, (224, 224))\n    cv2.imwrite('train_split' + '2' + '/' + i, img)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:18:49.606507Z","iopub.execute_input":"2022-03-13T21:18:49.607086Z","iopub.status.idle":"2022-03-13T21:21:34.64691Z","shell.execute_reply.started":"2022-03-13T21:18:49.607015Z","shell.execute_reply":"2022-03-13T21:21:34.644858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = \"../input/aptos2019-blindness-detection/train_images/\"\n#train_sep_dir = '..input/train_sep/'\n    # Create subdirectory with `class_name`\nif not os.path.exists(\"train_split\" + \"1\"):\n        os.mkdir(\"train_split\" + \"1\")\nfor i in list_1:\n    src_path = train_dir + i\n    dst_path = \"train_split\" + \"1\" + \"/\" + i\n#     shutil.copy(src_path, dst_path)\n    img = cv2.imread(src_path)\n    img = cv2.resize(img, (224, 224))\n    cv2.imwrite('train_split' + '1' + '/' + i, img)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:21:34.650185Z","iopub.execute_input":"2022-03-13T21:21:34.650498Z","iopub.status.idle":"2022-03-13T21:22:25.23832Z","shell.execute_reply.started":"2022-03-13T21:21:34.650451Z","shell.execute_reply":"2022-03-13T21:22:25.236845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ntrain_dir = \"../input/aptos2019-blindness-detection/train_images/\"\n#train_sep_dir = '..input/train_sep/'\n    # Create subdirectory with `class_name`\nif not os.path.exists(\"train_split\" + \"0\"):\n        os.mkdir(\"train_split\" + \"0\")\nfor i in list_0:\n    src_path = train_dir + i\n    dst_path = \"train_split\" + \"0\" + \"/\" + i \n#     shutil.copy(src_path, dst_path)\n    img = cv2.imread(src_path)\n    img = cv2.resize(img, (224, 224))\n    cv2.imwrite('train_split' + '0' + '/' + i, img)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:22:25.240017Z","iopub.execute_input":"2022-03-13T21:22:25.240282Z","iopub.status.idle":"2022-03-13T21:24:50.516115Z","shell.execute_reply.started":"2022-03-13T21:22:25.240245Z","shell.execute_reply":"2022-03-13T21:24:50.515175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install split-folders","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:24:50.517845Z","iopub.execute_input":"2022-03-13T21:24:50.518148Z","iopub.status.idle":"2022-03-13T21:27:21.561898Z","shell.execute_reply.started":"2022-03-13T21:24:50.518094Z","shell.execute_reply":"2022-03-13T21:27:21.560792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import splitfolders","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.564088Z","iopub.execute_input":"2022-03-13T21:27:21.564445Z","iopub.status.idle":"2022-03-13T21:27:21.794405Z","shell.execute_reply.started":"2022-03-13T21:27:21.564389Z","shell.execute_reply":"2022-03-13T21:27:21.792613Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"input_path = ''\noutput_path = 'final'\nsplitfolders.ratio(input_path, output=output_path, seed=1337, ratio=(.8, .1, .1))","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.795437Z","iopub.status.idle":"2022-03-13T21:27:21.79582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# labels = ['0 - No DR', '1 - Mild', '2 - Moderate', '3 - Severe', '4 - Proliferative DR']","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.796868Z","iopub.status.idle":"2022-03-13T21:27:21.797227Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"PATH = \"../input/aptos2019-blindness-detection/train_images/000c1434d8d7.png\"\nfor i in range(0,1):\n    p = PATH.format(i)\n    image = mpimg.imread(p) \n    plt.imshow(image)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.7982Z","iopub.status.idle":"2022-03-13T21:27:21.798605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen= ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.1, horizontal_flip= True)\nvalid_datagen= ImageDataGenerator(rescale=1./255)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.800284Z","iopub.status.idle":"2022-03-13T21:27:21.800713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Data Generator","metadata":{}},{"cell_type":"code","source":"train_set= train_datagen.flow_from_directory('final/train', \n                                             target_size=(224, 224), batch_size=20, class_mode='categorical', \n                                             shuffle=True, seed=20)\nvalid_set= valid_datagen.flow_from_directory('final/val', \n                                             target_size=(224, 224), batch_size=20, class_mode='categorical', \n                                             shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.802512Z","iopub.status.idle":"2022-03-13T21:27:21.803195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model Training","metadata":{}},{"cell_type":"code","source":"#using pre-trained model VGG16\nbase_model=applications.VGG16(input_shape=(224,224,3), weights='imagenet', include_top=False)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.804826Z","iopub.status.idle":"2022-03-13T21:27:21.805612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x=base_model.output\nx=Conv2D(32, (3,3), activation='relu')(x)\nx=MaxPooling2D(pool_size=(2,2))(x)\nx=Flatten()(x)\nx=Dense(units=128, activation='relu')(x)\nx=Dense(units=64, activation='relu')(x)\nx=Dense(units=32, activation='relu')(x)\nx=Dense(units=5, activation='softmax')(x)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.80706Z","iopub.status.idle":"2022-03-13T21:27:21.80776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model=Model(inputs=base_model.inputs, outputs=x)\nfor layer in model.layers[:16]:\n  layer.trainable=False\n\nfor layer in model.layers[16:]:\n    layer.trainable=True","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-03-13T21:27:21.809028Z","iopub.status.idle":"2022-03-13T21:27:21.809568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=optimizers.Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])\nstep_size_train=train_set.n//train_set.batch_size\nstep_size_valid=valid_set.n//valid_set.batch_size\nmodel.fit_generator(train_set, steps_per_epoch=step_size_train, epochs=5, \n                    validation_data= valid_set, validation_steps=step_size_valid)","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-03-13T21:27:21.811053Z","iopub.status.idle":"2022-03-13T21:27:21.81165Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('vgg16_model.h5')","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.812866Z","iopub.status.idle":"2022-03-13T21:27:21.813481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model Evaluation","metadata":{}},{"cell_type":"code","source":"os.chdir(r'/kaggle/working/final/train/train_split0')","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-03-13T21:27:21.814712Z","iopub.status.idle":"2022-03-13T21:27:21.815485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.818258Z","iopub.status.idle":"2022-03-13T21:27:21.818964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from IPython.display import FileLink","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.820064Z","iopub.status.idle":"2022-03-13T21:27:21.820737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"FileLink(r'vgg16_model.h5')","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.821808Z","iopub.status.idle":"2022-03-13T21:27:21.822493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img=kimage.load_img(('005b95c28852.png'),target_size=(224, 224))\nimg=kimage.img_to_array(img)\nimg=img.reshape(1,224,224,3)\noutput=model.predict(img)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.823537Z","iopub.status.idle":"2022-03-13T21:27:21.824245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.argmax(output[0])","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.825359Z","iopub.status.idle":"2022-03-13T21:27:21.826207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Explain","metadata":{}},{"cell_type":"markdown","source":"### SHAPLEY","metadata":{}},{"cell_type":"code","source":"PATH = \"4464bb62bf20.png\"\nfor i in range(0,1):\n    p = PATH.format(i)\n    image = mpimg.imread(p) \n    plt.imshow(image)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.827219Z","iopub.status.idle":"2022-03-13T21:27:21.827896Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.chdir(r'/kaggle/working/')","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.828883Z","iopub.status.idle":"2022-03-13T21:27:21.829502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image, _ = next(train_set)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.830548Z","iopub.status.idle":"2022-03-13T21:27:21.831175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# label\n_","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.832131Z","iopub.status.idle":"2022-03-13T21:27:21.832583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# img=kimage.img_to_array(image)\n# img=img.reshape(1,224,224,3)\noutput=model.predict(image)\nnp.argmax(output[0])","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.833733Z","iopub.status.idle":"2022-03-13T21:27:21.834571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"explainer = shap.DeepExplainer(model, image)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.835525Z","iopub.status.idle":"2022-03-13T21:27:21.836238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shapley_values = explainer.shap_values(image)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.837348Z","iopub.status.idle":"2022-03-13T21:27:21.837871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shap.image_plot(shapley_values, -image[:1], hspace=0.1)","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.838805Z","iopub.status.idle":"2022-03-13T21:27:21.839272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Lime Explain","metadata":{}},{"cell_type":"code","source":"lime_explainer = lime_image.LimeImageExplainer()","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.840191Z","iopub.status.idle":"2022-03-13T21:27:21.840723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict_fn(x):\n    model.predict(preprocess_input(x))","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.84178Z","iopub.status.idle":"2022-03-13T21:27:21.842431Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"explanation = lime_explainer.explain_instance(\n    image=image[0],\n    classifier_fn = model.predict,\n    top_labels=1, \n    hide_color=0, \n    num_features=20, \n    num_samples=500\n)\n","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.843384Z","iopub.status.idle":"2022-03-13T21:27:21.843904Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"explanation","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.844996Z","iopub.status.idle":"2022-03-13T21:27:21.845413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"temp, mask = explanation.get_image_and_mask(explanation.top_labels[0], positive_only=True, num_features=5, hide_rest=False)\nplt.imshow(mark_boundaries(temp / 2 + 0.5, mask))","metadata":{"execution":{"iopub.status.busy":"2022-03-13T21:27:21.846459Z","iopub.status.idle":"2022-03-13T21:27:21.847106Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}