{"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":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30733,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport cv2\nimport pydicom\nimport tensorflow as tf\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import EfficientNetB0, EfficientNetB1, EfficientNetB2\nfrom sklearn.model_selection import KFold\nimport keras_tuner as kt\nimport tensorflow.keras.backend as K\nimport matplotlib.cm as cm\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-06-18T14:55:46.582883Z","iopub.execute_input":"2024-06-18T14:55:46.584087Z","iopub.status.idle":"2024-06-18T14:56:00.560345Z","shell.execute_reply.started":"2024-06-18T14:55:46.584039Z","shell.execute_reply":"2024-06-18T14:56:00.559231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Paths to datasets\ndata_dir = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification'\ntrain_images_dir = os.path.join(data_dir, '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images')\ntest_images_dir = os.path.join(data_dir, '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images')\n\ntrain_df = pd.read_csv(os.path.join(data_dir, 'train.csv'))\ntrain_labels_df = pd.read_csv(os.path.join(data_dir, 'train_label_coordinates.csv'))\n","metadata":{"execution":{"iopub.status.busy":"2024-06-18T14:57:03.156092Z","iopub.execute_input":"2024-06-18T14:57:03.156788Z","iopub.status.idle":"2024-06-18T14:57:03.310156Z","shell.execute_reply.started":"2024-06-18T14:57:03.156758Z","shell.execute_reply":"2024-06-18T14:57:03.309029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load and preprocess images\ndef load_dicom_image(filepath, img_size=(512, 512)):\n    dicom = pydicom.dcmread(filepath)\n    img = dicom.pixel_array\n    img = cv2.resize(img, img_size)\n    img = np.stack((img,) * 3, axis=-1)  # Convert to 3-channel image\n    return img","metadata":{"execution":{"iopub.status.busy":"2024-06-18T14:57:19.158826Z","iopub.execute_input":"2024-06-18T14:57:19.159224Z","iopub.status.idle":"2024-06-18T14:57:19.165193Z","shell.execute_reply.started":"2024-06-18T14:57:19.159193Z","shell.execute_reply":"2024-06-18T14:57:19.164045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_df.head())\nprint(train_df.columns)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-18T14:58:54.278086Z","iopub.execute_input":"2024-06-18T14:58:54.278514Z","iopub.status.idle":"2024-06-18T14:58:54.300972Z","shell.execute_reply.started":"2024-06-18T14:58:54.278456Z","shell.execute_reply":"2024-06-18T14:58:54.299665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# List the files in the training images directory to understand the naming convention\ntrain_images = os.listdir(train_images_dir)\nprint(\"Sample of filenames in train_images_dir:\")\nprint(train_images[:10])  # Print the first 10 filenames to check their format\n","metadata":{"execution":{"iopub.status.busy":"2024-06-18T15:13:59.831576Z","iopub.execute_input":"2024-06-18T15:13:59.831967Z","iopub.status.idle":"2024-06-18T15:13:59.842338Z","shell.execute_reply.started":"2024-06-18T15:13:59.831940Z","shell.execute_reply":"2024-06-18T15:13:59.841352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# Define paths\ntrain_images_dir = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images'\ntrain_csv_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv'\n\n# Load the train.csv file\ntrain_df = pd.read_csv(train_csv_path)\n\n# Create a list of image filenames in the train_images_dir\nimage_filenames = set(os.listdir(train_images_dir))\n\n# Create the image_id column based on study_id if the image file exists\ntrain_df['image_id'] = train_df['study_id'].astype(str).apply(lambda x: x if x in image_filenames else None)\n\n# Drop rows where image_id is None\ntrain_df = train_df.dropna(subset=['image_id'])\n\n# Print the updated dataframe to verify\nprint(\"train_df head after updating image_id and dropping rows without corresponding images:\")\nprint(train_df.head())\n\n# Define label columns\nlabel_cols = train_df.columns.tolist()[1:-1]  # Exclude study_id and image_id\n\n# Create an ImageDataGenerator\ndatagen = ImageDataGenerator(\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode='nearest',\n    validation_split=0.2\n)\n\n# Training and validation generators\ntrain_generator = datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory=train_images_dir,\n    x_col='image_id',\n    y_col=label_cols,\n    subset='training',\n    batch_size=32,\n    seed=42,\n    shuffle=True,\n    class_mode='raw',\n    target_size=(512, 512)\n)\n\nvalidation_generator = datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory=train_images_dir,\n    x_col='image_id',\n    y_col=label_cols,\n    subset='validation',\n    batch_size=32,\n    seed=42,\n    shuffle=True,\n    class_mode='raw',\n    target_size=(512, 512)\n)\n\n# Print some information about the generators to verify\nprint(\"Train generator samples: \", train_generator.samples)\nprint(\"Validation generator samples: \", validation_generator.samples)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-18T15:16:00.132910Z","iopub.execute_input":"2024-06-18T15:16:00.133328Z","iopub.status.idle":"2024-06-18T15:16:00.204878Z","shell.execute_reply.started":"2024-06-18T15:16:00.133300Z","shell.execute_reply":"2024-06-18T15:16:00.203986Z"},"trusted":true},"execution_count":null,"outputs":[]}]}