{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":23870,"databundleVersionId":1781260,"sourceType":"competition"},{"sourceId":8344673,"sourceType":"datasetVersion","datasetId":4956806},{"sourceId":8358499,"sourceType":"datasetVersion","datasetId":4398093},{"sourceId":8365832,"sourceType":"datasetVersion","datasetId":4972751}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np\nimport os\nimport tensorflow as tf\nimport tensorflow.keras.layers as tfl\nfrom tensorflow.keras import losses\nfrom tensorflow.keras.layers import Flatten ,Dense, Dropout\nfrom tensorflow.keras.preprocessing import image_dataset_from_directory\nfrom tensorflow.keras.layers import RandomFlip, RandomRotation,RandomCrop,RandomContrast,Normalization\n\n\n#load data\nimport pandas as pd\ntrain_df = pd.read_csv('/kaggle/input/new-train-split/train_24.csv')\n#sample_df.shape\ndef append_ext(fn):\n    return fn+\".jpg\"\n\ntrain_df[\"StudyInstanceUID\"]=train_df[\"StudyInstanceUID\"].apply(append_ext)\n\ntrain_df.shape\n\nBATCH_SIZE = 8\nIMG_SIZE = (380, 380)\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nlabel=['ETT - Abnormal', 'ETT - Borderline','ETT - Normal']\n\ndatagen=ImageDataGenerator(validation_split=0.20,\n                           rotation_range=0.30,\n                           vertical_flip= True,\n\n                          #Normalization = True,\n                          rescale=1./255.)\n                          \n\ntrain_dataset=datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory=\"/kaggle/input/ranzcr-clip-catheter-line-classification/train/\",\n    x_col=\"StudyInstanceUID\",\n    y_col=label,\n    subset=\"training\",\n    batch_size=BATCH_SIZE,\n    color_mode='rgb',\n    labels_mode ='binary',\n    class_mode='raw',\n    target_size=IMG_SIZE,\n    #rotation_range=0.30,\n    #vertical_flip= True,\n    shuffle=1024,\n    seed=42,\n    interpolation=\"bilinear\")\n\nvalidation_dataset=datagen.flow_from_dataframe(\ndataframe=train_df,\ndirectory=\"/kaggle/input/ranzcr-clip-catheter-line-classification/train/\",\nx_col=\"StudyInstanceUID\",\ny_col=label,\nsubset=\"validation\",\nbatch_size=BATCH_SIZE,\ncolor_mode='rgb',\nlabels_mode ='binary',\nclass_mode='raw',\ntarget_size=IMG_SIZE,\n#shuffle=1024,\nshuffle=False,\nseed=42,\ninterpolation=\"bilinear\")\n\n\nimage_shape = (380,380)\ninput_shape = image_shape + (3,)\nim_size =380\nfrom tensorflow.keras import Model, initializers, regularizers\n\n#from tensorflow.keras.applications.resnet_v2 import ResNet50V2\nfrom tensorflow.keras.applications.xception import  Xception\n\n\nmodelB7 = tf.keras.Sequential([ResNet50V2(input_shape=(im_size, im_size, 3),\n                                                weights='imagenet',\n                                                include_top=False\n                                                ),\n                             tf.keras.layers.GlobalAveragePooling2D()])\n    \n\n    \n    \ninputs = tf.keras.Input(shape=input_shape) \n\n#x = data_augmenter()(inputs)    \nx = modelB7(inputs) \n#x =  Flatten()(x)\nx = Dropout(0.6)(x)\n#x = tfl.GlobalAveragePooling2D()(x)\noutputs = tfl.Dense(3,activation='sigmoid')(x)\n    \n\nmodel = tf.keras.Model(inputs, outputs)  \ntf.compat.v1.reset_default_graph()\nmodel.compile(\n    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),\n    loss='binary_crossentropy',\n    metrics=[tf.keras.metrics.AUC(multi_label=True)])\nmodel.summary()\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"steps_per_epoch = 24067 // BATCH_SIZE\ncheckpoint = tf.keras.callbacks.ModelCheckpoint(\n    '/kaggle/working/model.keras', save_best_only=True, monitor='val_auc', mode='max')\nlr_reducer = tf.keras.callbacks.ReduceLROnPlateau(\n    monitor='val_auc', patience=3, min_lr=1e-6, mode='max')\n\n\ninitial_learning_rate = 1e-4\ndef lr_exp_decay(epoch, lr):\n    k = 0.4\n    return float(initial_learning_rate * tf.math.exp(-k*epoch))\n\nhistory = model.fit(\n    train_dataset,\n    verbose=True,\n    epochs=4,\n    #initial_epoch=history.epoch[-1],\n    #callbacks=[checkpoint],\n    callbacks=[checkpoint, tf.keras.callbacks.LearningRateScheduler(lr_exp_decay, verbose=1)],\n    #steps_per_epoch=steps_per_epoch,\n    validation_data=validation_dataset)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ETT 3 classes Evaluation\n#Prepar\ntarget_size_dim = 380\nloadedModel = model\n#adapt test file\n# Transform the train file\nimport pandas as pd\ndf_source = pd.read_csv('/kaggle/input/new-train-split/test_24.csv' ,delimiter=',', encoding='latin-1')\ndf_cible = df_source[['StudyInstanceUID','ETT - Abnormal','ETT - Borderline','ETT - Normal']]\n\n#load data\nimport pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\n#from keras.preprocessing import image\nimport keras.utils as image\nimport tensorflow\ntest_df =  df_cible\ndef append_ext(fn):\n    return fn+\".jpg\"\n\n\ntest_df[\"StudyInstanceUID\"]=test_df[\"StudyInstanceUID\"].apply(append_ext)\ntest_image = []\n\nfor i in tqdm(range(test_df.shape[0])):\n    img = image.load_img(\"/kaggle/input/ranzcr-clip-catheter-line-classification/train/\"+test_df['StudyInstanceUID'][i],target_size=(target_size_dim,target_size_dim,3))\n    img = image.img_to_array(img)\n    #img = AHE(img)\n    img = img/255\n    #img = tensorflow.keras.preprocessing.image.random_rotation(img,15.0)\n    #img = tensorflow.keras.preprocessing.image.random_brightness(img,[0.5,1.5])\n    #img = tensorflow.keras.preprocessing.image.random_zoom(img,[0.0,0.2])\n   \n    \n    test_image.append(img)\n         \nX = np.array(test_image)\n\n#3 class \n#test_lab =test_df[['ETT - Abnormal', 'ETT - Borderline','ETT - Normal']]\n#Tubes position\ntest_lab =test_df[['ETT - Abnormal','ETT - Borderline','ETT - Normal']]\n\n\nlabels = np.array(test_lab)\n\nX_test = X.astype('float32')\n\nprint (X_test.shape)\nprint (labels.shape)\n#print (X_test.shape)\n\n#Evaluate on test data\n\n### Evaluation ####\nfrom tensorflow.keras.models import load_model\n\nresults= loadedModel.evaluate(X_test, labels, return_dict = True )\n\nprint(\"test loss, test acc:\", results)\n\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\ndef CsvTransformer(sourcepath):\n    #Read the csv input file\n    df_source = pd.read_csv(sourcepath ,delimiter=',', encoding='latin-1')\n    #Select the image name and ETT tube positioning columns\n    df_source = df_source[['Image ID','Endotracheal Tube Placement']]\n    #Remove the NaN valuse and reindex the DF\n    df_source= df_source.dropna(subset = ['Endotracheal Tube Placement'])\n    df_source.reset_index(drop=True, inplace=True)\n    \n    #Create the cible dataframe\n    df_cible = pd.DataFrame(columns=['StudyInstanceUID','ETT - Abnormal', 'ETT - Borderline',\n       'ETT - Normal', 'NGT - Abnormal', 'NGT - Borderline',\n       'NGT - Incompletely Imaged', 'NGT - Normal', 'CVC - Abnormal',\n       'CVC - Borderline', 'CVC - Normal', 'Swan Ganz Catheter Present','PatientID'])\n    \n    #Storing the data into the cible df\n    for i in range(len(df_source)):\n        if (df_source['Endotracheal Tube Placement'][i] == 'Normal'):\n            df_cible.loc[i, \"StudyInstanceUID\"]=df_source['Image ID'][i]\n            df_cible.loc[i, \"ETT - Abnormal\"]= 0\n            df_cible.loc[i, \"ETT - Borderline\"]= 0\n            df_cible.loc[i, \"ETT - Normal\"]= 1\n\n        if (df_source['Endotracheal Tube Placement'][i] == 'Abnormal'):\n            df_cible.loc[i, \"StudyInstanceUID\"]=df_source['Image ID'][i]\n            df_cible.loc[i, \"ETT - Abnormal\"]= 1\n            df_cible.loc[i, \"ETT - Borderline\"]= 0\n            df_cible.loc[i, \"ETT - Normal\"]= 0\n\n        if (df_source['Endotracheal Tube Placement'][i] == 'Borderline'):\n            df_cible.loc[i, \"StudyInstanceUID\"]=df_source['Image ID'][i]\n            df_cible.loc[i, \"ETT - Abnormal\"]= 0\n            df_cible.loc[i, \"ETT - Borderline\"]= 1\n            df_cible.loc[i, \"ETT - Normal\"]= 0\n#  Deplucate data\n #   for i in range(64):\n  #      df_cible.loc[i+6, \"StudyInstanceUID\"]=df_source['Image ID'][0]\n   #     df_cible.loc[i+6, \"ETT - Abnormal\"]= '0'\n    #    df_cible.loc[i+6, \"ETT - Borderline\"]= '0'\n     #   df_cible.loc[i+6, \"ETT - Normal\"]= '1'\n        \n    \n    return df_cible\n\n\nnewtest = CsvTransformer('/kaggle/input/results/results.csv')\nnewtest = newtest.fillna(0)\nnewtest","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ETT 3 classes Evaluation\n#Prepar\ntarget_size_dim = 380\nloadedModel = model\n#adapt test file\n# Transform the train file\nimport pandas as pd\ndf_source = pd.read_csv('/kaggle/input/new-train-split/test_24.csv' ,delimiter=',', encoding='latin-1')\ndf_cible = df_source[['StudyInstanceUID','ETT - Abnormal','ETT - Borderline','ETT - Normal']]\n\ndf_results = newtest\ndf_results = df_results[['StudyInstanceUID','ETT - Abnormal','ETT - Borderline','ETT - Normal']]\n\n#load data\nimport pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\n#from keras.preprocessing import image\nimport keras.utils as image\nimport tensorflow\ntest_df =  df_cible\ndef append_ext(fn):\n    return fn+\".jpg\"\n\n\ntest_df[\"StudyInstanceUID\"]=test_df[\"StudyInstanceUID\"].apply(append_ext)\ndf_results[\"StudyInstanceUID\"]=df_results[\"StudyInstanceUID\"].apply(append_ext)\ntest_image = []\n\nfor i in tqdm(range(test_df.shape[0])):\n    img = image.load_img(\"/kaggle/input/ranzcr-clip-catheter-line-classification/train/\"+test_df['StudyInstanceUID'][i],target_size=(target_size_dim,target_size_dim,3))\n    img = image.img_to_array(img)\n    #img = AHE(img)\n    img = img/255\n    #img = tensorflow.keras.preprocessing.image.random_rotation(img,15.0)\n    #img = tensorflow.keras.preprocessing.image.random_brightness(img,[0.5,1.5])\n    #img = tensorflow.keras.preprocessing.image.random_zoom(img,[0.0,0.2])\n   \n    \n    test_image.append(img)\n         \nX = np.array(test_image)\n\n#3 class \n#test_lab =test_df[['ETT - Abnormal', 'ETT - Borderline','ETT - Normal']]\n#Tubes position\ntest_lab =test_df[['ETT - Abnormal','ETT - Borderline','ETT - Normal']]\n\n\nlabels = np.array(test_lab)\n\nX_test = X.astype('float32')\n\nprint (X_test.shape)\nprint (labels.shape)\n#print (X_test.shape)\n\n\n\n\n\n##############################\nresult_image = []\n\nfor i in tqdm(range(df_results.shape[0])):\n    img = image.load_img(\"/kaggle/input/test-images/\"+df_results['StudyInstanceUID'][i],target_size=(target_size_dim,target_size_dim,3))\n    img = image.img_to_array(img)\n    #img = AHE(img)\n    img = img/255\n    #img = tensorflow.keras.preprocessing.image.random_rotation(img,15.0)\n    #img = tensorflow.keras.preprocessing.image.random_brightness(img,[0.5,1.5])\n    #img = tensorflow.keras.preprocessing.image.random_zoom(img,[0.0,0.2])\n   \n    \n    result_image.append(img)\n         \nX1 = np.array(result_image)\n\n#3 class \n#test_lab =test_df[['ETT - Abnormal', 'ETT - Borderline','ETT - Normal']]\n#Tubes position\ntest_lab1 =df_results[['ETT - Abnormal','ETT - Borderline','ETT - Normal']]\n\n\nlabels1 = np.array(test_lab1)\n\nX_test1 = X1.astype('float32')\n\nprint (X_test1.shape)\nprint (labels1.shape)\n#print (X_test.shape)\n#############################\n\n#Evaluate on test data\n\n### Evaluation ####\nfrom tensorflow.keras.models import load_model\n\nresults= loadedModel.evaluate(X_test, labels, return_dict = True )\n\nprint(\"test loss, test acc:\", results)\n\nresults= loadedModel.evaluate(X_test1, labels1, return_dict = True )\n\nprint(\"test loss, test on PrivateDS acc:\", results)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import classification_report\n\ny_pred = loadedModel.predict(X_test, batch_size=32, verbose=1)\ny_pred_bool = np.argmax(y_pred, axis=1)\ny_train = np.argmax(labels, axis=1)\n\nprint(classification_report(y_train, y_pred_bool))","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}