{"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 shutil\nimport cv2\nimport keras\nfrom tensorflow.keras.applications.mobilenet_v2 import preprocess_input, MobileNetV2\nimport pydicom\nfrom pathlib import Path\nfrom tqdm.auto import tqdm\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport skimage.io\nimport tqdm\nimport glob\nimport tensorflow\nimport matplotlib.image as mpimage\nimport matplotlib.pyplot as plt\n%matplotlib inline\nfrom PIL import Image\nimport random\nimport gc\nimport re\nimport cv2\nfrom tqdm import tqdm\nfrom sklearn.utils import shuffle\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow.keras import backend as K\nfrom tensorflow.keras.models import Model,Sequential\nfrom tensorflow.keras.layers import Activation, Dropout, Flatten, BatchNormalization, Dense\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\n\n\n# import pandas as pd\n# import tensorflow as tf\n# from sklearn.preprocessing import OneHotEncoder\n# from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n# from sklearn.model_selection import train_test_split\n# import yaml\n# from kaggle_secrets import UserSecretsClient\n# import cv2\n# graphing\n# TF model stuff\n# from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input\n# from sklearn.utils.class_weight import compute_class_weight\n# from sklearn.metrics import accuracy_score, roc_auc_score, classification_report\n# from tensorflow.keras.preprocessing.image import load_img, img_to_array\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"execution":{"iopub.status.busy":"2021-07-10T05:34:09.280697Z","iopub.execute_input":"2021-07-10T05:34:09.280981Z","iopub.status.idle":"2021-07-10T05:34:16.383207Z","shell.execute_reply.started":"2021-07-10T05:34:09.280921Z","shell.execute_reply":"2021-07-10T05:34:16.382365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"SIIM_COVID19_DETECTION_DIR = '/kaggle/input/siim-covid19-detection/'\nPART0_RESIZED_DIR = '../input/siim-covid19-resized-to-512px-jpg'\n\n\nTEMP_DIR = '/kaggle/temp/'\n\nINPUT_DIR = PART0_RESIZED_DIR+'/train/'\n\nOUTPUT_DIR = DATASET_DIR = TEMP_DIR+'/train/'\nTRAIN_DIR = DATASET_DIR + 'train/'\nTA_DIR = TRAIN_DIR+'ta/'\nIA_DIR = TRAIN_DIR+'ia/'\nAA_DIR = TRAIN_DIR+'aa/'\nNP_DIR = TRAIN_DIR+'np/'\n\n# WORKING_DIR = '/kaggle/working/'\n\nWANDB_PROJECT_NAME = 'project8-kaggle-covid19'\nWANDB_ENTITY_NAME = ''\n\nTRAIN_IMAGE_LEVEL_PATH = SIIM_COVID19_DETECTION_DIR+'train_image_level.csv'\nTRAIN_STUDY_LEVEL_PATH = SIIM_COVID19_DETECTION_DIR+'train_study_level.csv'\nMETA_PATH = PART0_RESIZED_DIR+'meta.csv'\n\nBATCH_SIZE = 32\nEPOCHS = 25\nIMG_SIZE = WIDTH = HEIGHT = 224\nLEARNING_RATE = 0.00008\n\n# INTERPOLATION = cv2.INTER_LANCZOS4\n","metadata":{"execution":{"iopub.status.busy":"2021-07-10T05:34:16.387022Z","iopub.execute_input":"2021-07-10T05:34:16.387338Z","iopub.status.idle":"2021-07-10T05:34:16.395813Z","shell.execute_reply.started":"2021-07-10T05:34:16.387308Z","shell.execute_reply":"2021-07-10T05:34:16.394829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_image_level = pd.read_csv(TRAIN_IMAGE_LEVEL_PATH)\ndf_train_study_level = pd.read_csv(TRAIN_STUDY_LEVEL_PATH)\n\ndf_train_image_level['id'] = df_train_image_level.apply(lambda row: row.id.split('_')[0], axis=1)\ndf_train_image_level['path'] = df_train_image_level.apply(lambda row: INPUT_DIR+row.id+'.jpg', axis=1)\ndf_train_image_level['image_level'] = df_train_image_level.apply(lambda row: row.label.split(' ')[0], axis=1)\n\ndf_train_study_level['id'] = df_train_study_level.apply(lambda row: row.id.split('_')[0], axis=1)\ndf_train_study_level.columns = ['StudyInstanceUID', 'Negative for Pneumonia', 'Typical Appearance', 'Indeterminate Appearance', 'Atypical Appearance']\n\ndf_train_study_level.head()","metadata":{"execution":{"iopub.status.busy":"2021-07-10T05:34:16.399081Z","iopub.execute_input":"2021-07-10T05:34:16.399334Z","iopub.status.idle":"2021-07-10T05:34:16.968882Z","shell.execute_reply.started":"2021-07-10T05:34:16.399300Z","shell.execute_reply":"2021-07-10T05:34:16.968047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_image_level.head()","metadata":{"execution":{"iopub.status.busy":"2021-07-10T05:34:16.970770Z","iopub.execute_input":"2021-07-10T05:34:16.971134Z","iopub.status.idle":"2021-07-10T05:34:16.983323Z","shell.execute_reply.started":"2021-07-10T05:34:16.971095Z","shell.execute_reply":"2021-07-10T05:34:16.982374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_image_level = df_train_image_level.merge(df_train_study_level, on='StudyInstanceUID',how=\"left\")\ndf_train_image_level = df_train_image_level[['id','StudyInstanceUID','path','Negative for Pneumonia','Typical Appearance','Indeterminate Appearance','Atypical Appearance']]\ndf_train_image_level = df_train_image_level.dropna()\ndf_train_image_level = df_train_image_level[~df_train_image_level.duplicated(subset=['StudyInstanceUID'], keep='first')]\ndf_train_image_level = df_train_image_level.reset_index(drop=True)\ndf_train_image_level.head()","metadata":{"execution":{"iopub.status.busy":"2021-07-10T05:34:16.984789Z","iopub.execute_input":"2021-07-10T05:34:16.985175Z","iopub.status.idle":"2021-07-10T05:34:17.033055Z","shell.execute_reply.started":"2021-07-10T05:34:16.985138Z","shell.execute_reply":"2021-07-10T05:34:17.032358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"[os.makedirs(dir, exist_ok=True) for dir in [TA_DIR,IA_DIR,AA_DIR,NP_DIR]]\nfor i in tqdm(range(len(df_train_image_level))):\n    row = df_train_image_level.loc[i]\n    if row['Typical Appearance']:\n        shutil.copy(row.path, f'{TA_DIR}{row.id}.jpg')\n    if row['Indeterminate Appearance']:\n        shutil.copy(row.path, f'{IA_DIR}{row.id}.jpg')\n    if row['Atypical Appearance']:\n        shutil.copy(row.path, f'{AA_DIR}{row.id}.jpg')\n    if row['Negative for Pneumonia']:\n        shutil.copy(row.path, f'{NP_DIR}{row.id}.jpg')\n#     else:\n#         print('Error: check df_train_image_level')\n\n#     if row['Typical Appearance']:\n#         shutil.copy(row.path, f'{TA_DIR}{row.id}.jpg')\n#     elif row['Indeterminate Appearance']:\n#         shutil.copy(row.path, f'{IA_DIR}{row.id}.jpg')\n#     elif row['Atypical Appearance']:\n#         shutil.copy(row.path, f'{AA_DIR}{row.id}.jpg')\n#     elif row['Negative for Pneumonia']:\n#         shutil.copy(row.path, f'{NP_DIR}{row.id}.jpg')\n#     else:\n#         print('Error: check df_train_image_level')","metadata":{"execution":{"iopub.status.busy":"2021-07-10T05:34:17.034228Z","iopub.execute_input":"2021-07-10T05:34:17.034578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen_kwargs = dict(validation_split=.20,\n                      preprocessing_function=preprocess_input\n                     )\ndataflow_kwargs = dict(target_size=(IMG_SIZE, IMG_SIZE),\n                       batch_size=BATCH_SIZE,\n                       interpolation=\"lanczos\"\n                      )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nvalid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(**datagen_kwargs)\nvalid_generator = valid_datagen.flow_from_directory(TRAIN_DIR,\n                                                    subset=\"validation\",\n                                                    shuffle=False,\n                                                    **dataflow_kwargs)\n\ntrain_datagen = tf.keras.preprocessing.image.ImageDataGenerator(\n    rotation_range=40,\n    horizontal_flip=True,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    **datagen_kwargs)\ntrain_generator = train_datagen.flow_from_directory(TRAIN_DIR,\n                                                    subset=\"training\",\n                                                    shuffle=True,\n                                                    **dataflow_kwargs)\n\nprint('classes :', train_generator.class_indices)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_model = MobileNetV2(input_shape=(224,224,3), \n                         include_top=False,\n                         weights=\"imagenet\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for layer in base_model.layers:\n    layer.trainable=False","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model=Sequential()\nmodel.add(base_model)\nmodel.add(Dropout(0.5))\nmodel.add(Flatten())\nmodel.add(BatchNormalization())\nmodel.add(Dense(2048,kernel_initializer='he_uniform'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(1024,kernel_initializer='he_uniform'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(4,activation='sigmoid'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import plot_model\nfrom IPython.display import SVG, Image\nplot_model(model, to_file='model.png', show_shapes=True, show_layer_names=True)\nImage('model.png',width=400, height=200)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"OPT    = tensorflow.keras.optimizers.Adam(lr=0.001)\n\nmodel.compile(loss='categorical_crossentropy',\n              metrics=[tensorflow.keras.metrics.Accuracy(name = 'accuracy')],\n              optimizer=OPT)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filepath = './best_weights.hdf5'\n\nearlystopping = EarlyStopping(monitor = 'val_accuracy', \n                              mode = 'max' , \n                              patience = 15,\n                              verbose = 1)\n\ncheckpoint    = ModelCheckpoint(filepath, \n                                monitor = 'val_accuracy', \n                                mode='max', \n                                save_best_only=True, \n                                verbose = 1)\n\n\ncallback_list = [earlystopping, checkpoint]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_history=model.fit(train_generator,\n                        validation_data=valid_generator,\n                        epochs = 30,\n                        callbacks = callback_list,\n                        verbose = 1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('./best_weights_sigmoid.hdf5')\n# model.save('./best_weights2.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_path = '../input/kaggle-covid19/best_weights_sigmoid.hdf5'\nmodel = keras.models.load_model(model_path)#'kaggle/input/kaggle-covid19/kaggle/best_weights.hdf5')\n# os.listdir(model_path)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(model_history.history['accuracy'])\nplt.plot(model_history.history['val_accuracy'])\nplt.title('Model Accuracy')\nplt.ylabel('Accuracy')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Validation'], loc='upper left', bbox_to_anchor=(1,1))\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}