{"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 os\n\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\nfrom sklearn.model_selection import train_test_split\n\nfrom keras.preprocessing.image import ImageDataGenerator\n\nfrom keras.applications.resnet50 import ResNet50 \nfrom keras.applications.resnet50 import preprocess_input\n\nfrom keras.layers import Flatten, Dense, GlobalAveragePooling2D, BatchNormalization, Activation, Dropout\nfrom keras.models import Model, Sequential\n\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Main idea: define catheter type(s) on image using one RNN50-based network and after that define normality of this catheter position using specifically trained RNN50-based networks."},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"BASE_DIR = \"../input/ranzcr-clip-catheter-line-classification/\"\ntrain_df = pd.read_csv(os.path.join(BASE_DIR, \"train.csv\"), index_col=0)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Splitting train dataset for different catheter types"},{"metadata":{"trusted":true},"cell_type":"code","source":"ETT_columns = [x for x in train_df.columns.values if x.startswith('ETT')]\nNGT_columns = [x for x in train_df.columns.values if x.startswith('NGT')]\nCVC_columns = [x for x in train_df.columns.values if x.startswith('CVC')]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df_ETT = train_df[train_df[ETT_columns].isin([1]).any(axis=1)][ETT_columns]\ntrain_df_NGT = train_df[train_df[NGT_columns].isin([1]).any(axis=1)][NGT_columns]\ntrain_df_CVC = train_df[train_df[CVC_columns].isin([1]).any(axis=1)][CVC_columns]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df_ETT['IsETT'] = 1\ntrain_df_NGT['IsNGT'] = 1\ntrain_df_CVC['IsCVC'] = 1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Helper functions"},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\ndef create_image_generators(preprocess_input, target_image_size, train_dataframe, validation_dataframe, y_columns):\n    train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)\n    val_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)\n\n    train_generator = train_datagen.flow_from_dataframe(\n        train_dataframe,\n        x_col='image',\n        y_col=y_columns,\n        target_size=target_image_size,\n        batch_size=32,\n        shuffle=True,\n        class_mode='raw')\n\n    validation_generator = val_datagen.flow_from_dataframe(\n        validation_dataframe,\n        x_col='image',\n        y_col=y_columns,\n        target_size=target_image_size,\n        shuffle=False,\n        batch_size=32,\n        class_mode='raw')\n    return train_generator, validation_generator","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def create_rn50_based_model(class_number, activation_fn):\n    base_model_rn50 = ResNet50(input_shape=(224,224, 3),\n                include_top=False, \n                weights='../input/base-model-weights-rn50-enb3/resnet50_notop.h5')\n    dropout_dense_layer = 0.3\n\n    model_full = Sequential()\n    model_full.add(base_model_rn50)\n    \n    model_full.add(GlobalAveragePooling2D())\n    model_full.add(Dense(128))\n    model_full.add(BatchNormalization())\n    model_full.add(Activation('relu'))\n    model_full.add(Dense(32))\n    model_full.add(BatchNormalization())\n    model_full.add(Activation('relu'))\n    model_full.add(Dropout(dropout_dense_layer))\n\n    model_full.add(Dense(class_number, activation=activation_fn))\n    \n    return model_full","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"EPOCHS = 4\nBATCH_SIZE = 32\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Swan Ganz training"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_swanganz = pd.DataFrame(train_df['Swan Ganz Catheter Present'])\ntrain_swanganz = train_swanganz.reset_index()\ntrain_swanganz['image'] = BASE_DIR+'/train/'+train_swanganz.StudyInstanceUID+'.jpg'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nX_train, X_val, y_train, y_val = train_test_split(train_swanganz['image'],train_swanganz[['Swan Ganz Catheter Present']], test_size=0.2)\n\n\ntrain_sg = pd.concat([X_train, y_train], axis=1)\nvalidation_sg = pd.concat([X_val, y_val], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntrain_generator_sg, validation_generator_sg = create_image_generators(preprocess_input, (224,224), \n                                                                                 train_sg, validation_sg,\n                                                                                 ['Swan Ganz Catheter Present'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_sg = create_rn50_based_model (1, \"sigmoid\")\nmodel_sg.compile(optimizer='adam', \n              loss='binary_crossentropy', \n              metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_sg.fit_generator(generator=train_generator_sg,\n                    validation_data=validation_generator_sg,\n                    steps_per_epoch=len(train_sg)//BATCH_SIZE,\n                    epochs=EPOCHS)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"New dataset to determine catheter type first"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df_general = train_df_ETT.merge(train_df_NGT, how='outer', left_index=True, right_index=True).merge(train_df_CVC, how='outer', left_index=True, right_index=True)\ntrain_df_general = train_df_general.drop(columns = ETT_columns+NGT_columns+CVC_columns)\ntrain_df_general = train_df_general.fillna(0)\ntrain_df_general = train_df_general.reset_index()\ntrain_df_general['image'] = BASE_DIR+'/train/'+train_df_general.StudyInstanceUID+'.jpg'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nX_train, X_val, y_train, y_val = train_test_split(train_df_general['image'],train_df_general[['IsETT', 'IsNGT', 'IsCVC']], test_size=0.2)\n\n\ntrain_general = pd.concat([X_train, y_train], axis=1)\nvalidation_general = pd.concat([X_val, y_val], axis=1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Catheter type classification training"},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntrain_generator_general, validation_generator_general = create_image_generators(preprocess_input, (224,224), \n                                                                                 train_general, validation_general,\n                                                                                 ['IsETT', 'IsNGT', 'IsCVC'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nmodel_general = create_rn50_based_model (3, \"sigmoid\")\nmodel_general.compile(optimizer='adam', \n              loss='binary_crossentropy', \n              metrics=['AUC'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_general.fit_generator(generator=train_generator_general,\n                    validation_data=validation_generator_general,\n                    steps_per_epoch=len(train_general)//BATCH_SIZE,\n                    epochs=EPOCHS)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"ETT training"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df_ETT = train_df_ETT.drop(columns='IsETT').reset_index()\ntrain_df_ETT['image'] = BASE_DIR+'/train/'+train_df_ETT.StudyInstanceUID+'.jpg'\n\nX_train, X_val, y_train, y_val = train_test_split(train_df_ETT['image'],train_df_ETT[ETT_columns], test_size=0.2)\n\n\ntrain_ETT = pd.concat([X_train, y_train], axis=1)\nvalidation_ETT = pd.concat([X_val, y_val], axis=1)\n\ntrain_generator_ETT, validation_generator_ETT = create_image_generators(preprocess_input, (224,224), \n                                                                                 train_ETT, validation_ETT,\n                                                                                 ETT_columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_ETT = create_rn50_based_model (len(ETT_columns), \"softmax\")\nmodel_ETT.compile(optimizer='adam', \n              loss='categorical_crossentropy', \n              metrics=['AUC'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_ETT.fit_generator(generator=train_generator_ETT,\n                    validation_data=validation_generator_ETT,\n                    steps_per_epoch=len(train_ETT)//BATCH_SIZE,\n                    epochs=EPOCHS)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"NGT training"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df_NGT = train_df_NGT.drop(columns='IsNGT').reset_index()\ntrain_df_NGT['image'] = BASE_DIR+'/train/'+train_df_NGT.StudyInstanceUID+'.jpg'\n\nX_train, X_val, y_train, y_val = train_test_split(train_df_NGT['image'],train_df_NGT[NGT_columns], test_size=0.2)\n\n\ntrain_NGT = pd.concat([X_train, y_train], axis=1)\nvalidation_NGT = pd.concat([X_val, y_val], axis=1)\n\ntrain_generator_NGT, validation_generator_NGT = create_image_generators(preprocess_input, (224,224), \n                                                                                 train_NGT, validation_NGT,\n                                                                                 NGT_columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_NGT = create_rn50_based_model (len(NGT_columns), \"softmax\")\nmodel_NGT.compile(optimizer='adam', \n              loss='categorical_crossentropy', \n              metrics=['AUC'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_NGT.fit_generator(generator=train_generator_NGT,\n                    validation_data=validation_generator_NGT,\n                    steps_per_epoch=len(train_NGT)//BATCH_SIZE,\n                    epochs=EPOCHS)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"CVC training"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df_CVC = train_df_CVC.drop(columns='IsCVC').reset_index()\ntrain_df_CVC['image'] = BASE_DIR+'/train/'+train_df_CVC.StudyInstanceUID+'.jpg'\n\nX_train, X_val, y_train, y_val = train_test_split(train_df_CVC['image'],train_df_CVC[CVC_columns], test_size=0.2)\n\n\ntrain_CVC = pd.concat([X_train, y_train], axis=1)\nvalidation_CVC = pd.concat([X_val, y_val], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_generator_CVC, validation_generator_CVC = create_image_generators(preprocess_input, (224,224), \n                                                                                 train_CVC, validation_CVC,\n                                                                                 CVC_columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_CVC = create_rn50_based_model (len(CVC_columns), \"softmax\")\nmodel_CVC.compile(optimizer='adam', \n              loss='categorical_crossentropy', \n              metrics=['AUC'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_CVC.fit_generator(generator=train_generator_CVC,\n                    validation_data=validation_generator_CVC,\n                    steps_per_epoch=len(train_CVC)//BATCH_SIZE,\n                    epochs=EPOCHS)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Prediction"},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing import image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dir = BASE_DIR+'test/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def predict_into_list (image_name, model_spec, list_spec):\n    img = image.load_img(test_dir+image_name, target_size=(224, 224))\n    model_input_img = preprocess_input(np.expand_dims(img.copy(), axis=0)) \n    predicted_list = model_spec.predict(model_input_img)\n    list_to_add = list(predicted_list[0])\n    list_to_add.insert(0,image_name.replace('.jpg',''))\n    list_spec.append(list_to_add)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Predict Swan Ganz catheter"},{"metadata":{"trusted":true},"cell_type":"code","source":"image_name_list = os.listdir(test_dir)\nlist_sg = []\nfor image_name in image_name_list:\n    predict_into_list (image_name, model_sg, list_sg)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Predict catheter type"},{"metadata":{"trusted":true},"cell_type":"code","source":"\nlist_general = []\nfor image_name in image_name_list:\n    predict_into_list (image_name, model_general, list_general)\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_classified = pd.DataFrame(list_general, columns = ['StudyInstanceUID', 'IsETT', 'IsNGT', 'IsCVC'])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_classified.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Predict output values dependent of catheter type"},{"metadata":{"trusted":true},"cell_type":"code","source":"list_ETT = []\nlist_NGT = []\nlist_CVC = []","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def predict_specific (row):\n    if (row['IsETT']>0.8):\n        predict_into_list (row['StudyInstanceUID']+'.jpg', model_ETT, list_ETT)\n            \n    if (row['IsNGT']>0.8):\n        predict_into_list (row['StudyInstanceUID']+'.jpg', model_NGT, list_NGT)\n    \n    if (row['IsCVC']>0.8):\n        predict_into_list (row['StudyInstanceUID']+'.jpg', model_CVC, list_CVC)\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_classified.apply (predict_specific, axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ETT_columns.insert(0,'StudyInstanceUID')\nNGT_columns.insert(0,'StudyInstanceUID')\nCVC_columns.insert(0,'StudyInstanceUID')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predict_ETT_df = pd.DataFrame(list_ETT, columns=ETT_columns).set_index('StudyInstanceUID')\npredict_NGT_df = pd.DataFrame(list_NGT, columns=NGT_columns).set_index('StudyInstanceUID')\npredict_CVC_df = pd.DataFrame(list_CVC, columns=CVC_columns).set_index('StudyInstanceUID')\npredict_sg_df = pd.DataFrame(list_sg, columns = ['StudyInstanceUID', 'Swan Ganz Catheter Present']).set_index('StudyInstanceUID')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_classified = test_classified.set_index('StudyInstanceUID')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df = test_classified.join(predict_ETT_df).join(predict_NGT_df).join(predict_CVC_df).join(predict_sg_df)\nsubmission_df = submission_df.fillna(0).drop(columns=['IsETT', 'IsNGT', 'IsCVC'])\nsubmission_df = submission_df.reset_index()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def decision_boundaries(x):\n    if type(x) is str:\n        return x\n    elif x>0.6:\n        return 1\n    elif x<0.3:\n        return 0\n    else:\n        return x\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#submission_df = submission_df.applymap(decision_boundaries)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}