{"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":"gpu","dataSources":[{"sourceId":13451,"databundleVersionId":1188070,"sourceType":"competition"},{"sourceId":8290336,"sourceType":"datasetVersion","datasetId":4924697},{"sourceId":8316278,"sourceType":"datasetVersion","datasetId":4939994}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nfrom matplotlib import pyplot as plt\nimport pydicom\nfrom tqdm import tqdm\nimport cv2\nimport tensorflow as tf\nfrom sklearn.utils import shuffle\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import MultiLabelBinarizer\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import layers, models, optimizers\nfrom tensorflow.keras.callbacks import LearningRateScheduler\nfrom tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions\nfrom sklearn.metrics import confusion_matrix, classification_report\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-04T04:23:30.263318Z","iopub.execute_input":"2024-05-04T04:23:30.263684Z","iopub.status.idle":"2024-05-04T04:23:43.739575Z","shell.execute_reply.started":"2024-05-04T04:23:30.263655Z","shell.execute_reply":"2024-05-04T04:23:43.738584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"csv_path='/kaggle/input/stage-2-undersample/stage_2_one_hot_more_removed_undersample.csv'\nimage_dir = \"/kaggle/input/rsna-images\"","metadata":{"execution":{"iopub.status.busy":"2024-05-04T04:23:43.741501Z","iopub.execute_input":"2024-05-04T04:23:43.742022Z","iopub.status.idle":"2024-05-04T04:23:43.746117Z","shell.execute_reply.started":"2024-05-04T04:23:43.741996Z","shell.execute_reply":"2024-05-04T04:23:43.745218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df1 = pd.read_csv(csv_path)\nprint(df1.head())","metadata":{"execution":{"iopub.status.busy":"2024-05-04T04:23:43.747541Z","iopub.execute_input":"2024-05-04T04:23:43.748115Z","iopub.status.idle":"2024-05-04T04:23:43.811054Z","shell.execute_reply.started":"2024-05-04T04:23:43.748082Z","shell.execute_reply":"2024-05-04T04:23:43.810053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dict = {\"absent\": 0, \"epidural\": 1, \"intraparenchymal\": 2, \"intraventricular\": 3, \"subarachnoid\": 4, \"subdural\": 5}","metadata":{"execution":{"iopub.status.busy":"2024-05-04T04:23:43.812515Z","iopub.execute_input":"2024-05-04T04:23:43.812913Z","iopub.status.idle":"2024-05-04T04:23:43.818187Z","shell.execute_reply.started":"2024-05-04T04:23:43.81288Z","shell.execute_reply":"2024-05-04T04:23:43.817187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images = []\nlabels = []\nimg_path = '/kaggle/input/rsna-complete-stage-2/'\nfor index, row in df1.iterrows():\n    image_path = img_path + row['Image'] + '.png'\n    img = cv2.imread(image_path)\n    class_id = row.index[row == 1][0]\n    images.append(img)\n    labels.append(dict[class_id])\n\nprint(len(images), len(labels))","metadata":{"execution":{"iopub.status.busy":"2024-05-04T04:23:43.820976Z","iopub.execute_input":"2024-05-04T04:23:43.821681Z","iopub.status.idle":"2024-05-04T04:25:19.847283Z","shell.execute_reply.started":"2024-05-04T04:23:43.821654Z","shell.execute_reply":"2024-05-04T04:25:19.846363Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = np.array(labels)\ndef load_images(labels, images):\n    images = np.array(images) \n    labels_onehot = np.array(labels)     # Convert lists to NumPy arrays\n    train_images, val_images, train_labels, val_labels = train_test_split(\n        images, labels_onehot, test_size=0.3, random_state=42)\n    return train_images, val_images, train_labels, val_labels\n \ntrain_images, val_images, train_labels, val_labels = load_images(labels, images)","metadata":{"execution":{"iopub.status.busy":"2024-05-04T04:25:19.8484Z","iopub.execute_input":"2024-05-04T04:25:19.848695Z","iopub.status.idle":"2024-05-04T04:25:20.701752Z","shell.execute_reply.started":"2024-05-04T04:25:19.84867Z","shell.execute_reply":"2024-05-04T04:25:20.700949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_list = [\n    {\n    'name': 'MobileNetV2',\n    'function': tf.keras.applications.MobileNetV2\n    },\n]","metadata":{"execution":{"iopub.status.busy":"2024-05-04T04:25:20.702691Z","iopub.execute_input":"2024-05-04T04:25:20.702976Z","iopub.status.idle":"2024-05-04T04:25:20.708521Z","shell.execute_reply.started":"2024-05-04T04:25:20.702952Z","shell.execute_reply":"2024-05-04T04:25:20.707512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_model(model_name, model_function):\n    num_classes = 6\n    base_model = model_function(\n        input_shape=(224, 224, 3),\n        include_top=False,\n        weights='imagenet'\n    )\n\n    # Freeze the convolutional base\n    base_model.trainable = False\n\n    # Model\n    model = models.Sequential([\n        base_model,\n        layers.GlobalAveragePooling2D(),\n        layers.Dense(256, activation='relu'),\n        layers.Dropout(0.5),\n        layers.Dense(num_classes, activation='sigmoid')  # Use 'sigmoid' for multi-label classification\n    ])\n\n    # Compile the model with a learning rate scheduler\n    initial_learning_rate = 0.001\n    lr_schedule = LearningRateScheduler(lambda epoch, lr: float(lr * tf.math.exp(-0.1)))\n    opt = optimizers.Adam(learning_rate=initial_learning_rate)\n    model.compile(\n        optimizer=opt,\n        loss='sparse_categorical_crossentropy',  # 'binary_crossentropy' for multi-label classification\n        metrics=['accuracy']\n    )\n\n    # Unfreeze more layers for fine-tuning\n    base_model.trainable = True\n    # fine_tune_at = 50\n    # for layer in base_model.layers[:fine_tune_at]:\n    #     layer.trainable = False\n\n    # Adjust the learning rate for fine-tuning\n    opt_fine_tune = optimizers.Adam(learning_rate=0.0001)\n    model.compile(\n        optimizer=opt_fine_tune,\n        loss='sparse_categorical_crossentropy',  # 'binary_crossentropy' for multi-label classification\n        metrics=['accuracy']\n    )\n    model.build((None, 224, 224, 3))\n    model.summary()\n    # Train model\n    history = model.fit(\n        train_images, train_labels,\n        epochs=30,\n        validation_data=(val_images, val_labels),\n        callbacks=[lr_schedule]\n    )\n    model.save(f'{model_name}.keras')\n    return model, history\n    \ndef print_report(model_name, model, val_labels, val_images):\n    # Assuming 'val_labels' contains the true class labels for each sample\n    rounded_labels = val_labels\n\n    y_pred = model.predict(val_images)\n    y_pred = np.argmax(y_pred, axis=1)\n\n    conf_mat = classification_report(rounded_labels, y_pred)\n    print(f\"{model_name} Report\")\n    print(conf_mat)\n\ndef plot_history(model_name, history):\n    plt.plot(history.history['accuracy'], label=f'Training Accuracy of {model_name}')\n    plt.plot(history.history['val_accuracy'], label=f'Validation Accuracy of {model_name}')\n    plt.xlabel('Epoch')\n    plt.ylabel('Accuracy')\n    plt.legend()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-04T04:33:29.953668Z","iopub.execute_input":"2024-05-04T04:33:29.954355Z","iopub.status.idle":"2024-05-04T04:33:29.966873Z","shell.execute_reply.started":"2024-05-04T04:33:29.954319Z","shell.execute_reply":"2024-05-04T04:33:29.966005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for model in model_list:\n    model_name, model_function = model['name'], model['function']\n    print(f'model_name, model_function is {model_name, model_function}')\n    model, history = train_model(model_name, model_function)\n    print_report(model_name, model, val_labels, val_images)\n    plot_history(model_name, history)\n    ","metadata":{"execution":{"iopub.status.busy":"2024-05-04T04:33:34.286927Z","iopub.execute_input":"2024-05-04T04:33:34.287282Z","iopub.status.idle":"2024-05-04T04:35:57.404279Z","shell.execute_reply.started":"2024-05-04T04:33:34.287254Z","shell.execute_reply":"2024-05-04T04:35:57.403329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}