{"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":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30746,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nimport pydicom as dicom\nimport cv2\nimport tensorflow as tf\nfrom tensorflow.keras import datasets, layers, models\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as patches\nimport seaborn as sns\nimport warnings\nfrom multiprocessing import Pool\nfrom tensorflow.keras import datasets, layers, models\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\n\nwarnings.filterwarnings('ignore')\n","metadata":{"execution":{"iopub.status.busy":"2024-08-23T05:35:58.542751Z","iopub.execute_input":"2024-08-23T05:35:58.543145Z","iopub.status.idle":"2024-08-23T05:36:13.917627Z","shell.execute_reply.started":"2024-08-23T05:35:58.543114Z","shell.execute_reply":"2024-08-23T05:36:13.916421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the datasets\ntrain_df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv') \ntrain_label_coords_df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_label_coordinates.csv')\ntrain_series_desc_df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')\ntest_series_desc_df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_series_descriptions.csv')","metadata":{"execution":{"iopub.status.busy":"2024-08-23T05:36:20.387765Z","iopub.execute_input":"2024-08-23T05:36:20.388403Z","iopub.status.idle":"2024-08-23T05:36:20.540299Z","shell.execute_reply.started":"2024-08-23T05:36:20.388370Z","shell.execute_reply":"2024-08-23T05:36:20.539295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"merged_df = pd.merge(train_label_coords_df, train_df, on='study_id')\nfiltered_df = merged_df[(merged_df.study_id == 100206310) & (merged_df.series_id == 1012284084)]","metadata":{"execution":{"iopub.status.busy":"2024-08-23T05:36:22.444790Z","iopub.execute_input":"2024-08-23T05:36:22.445182Z","iopub.status.idle":"2024-08-23T05:36:22.513399Z","shell.execute_reply.started":"2024-08-23T05:36:22.445153Z","shell.execute_reply":"2024-08-23T05:36:22.512294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder, OneHotEncoder\n\nconditions = [\n    'spinal_canal_stenosis_l1_l2', 'spinal_canal_stenosis_l2_l3', 'spinal_canal_stenosis_l3_l4', \n    'spinal_canal_stenosis_l4_l5', 'spinal_canal_stenosis_l5_s1',\n    'left_neural_foraminal_narrowing_l1_l2', 'left_neural_foraminal_narrowing_l2_l3', \n    'left_neural_foraminal_narrowing_l3_l4', 'left_neural_foraminal_narrowing_l4_l5', \n    'left_neural_foraminal_narrowing_l5_s1',\n    'right_neural_foraminal_narrowing_l1_l2', 'right_neural_foraminal_narrowing_l2_l3', \n    'right_neural_foraminal_narrowing_l3_l4', 'right_neural_foraminal_narrowing_l4_l5', \n    'right_neural_foraminal_narrowing_l5_s1',\n    'left_subarticular_stenosis_l1_l2', 'left_subarticular_stenosis_l2_l3', \n    'left_subarticular_stenosis_l3_l4', 'left_subarticular_stenosis_l4_l5', \n    'left_subarticular_stenosis_l5_s1',\n    'right_subarticular_stenosis_l1_l2', 'right_subarticular_stenosis_l2_l3', \n    'right_subarticular_stenosis_l3_l4', 'right_subarticular_stenosis_l4_l5', \n    'right_subarticular_stenosis_l5_s1'\n]","metadata":{"execution":{"iopub.status.busy":"2024-08-23T05:36:28.027190Z","iopub.execute_input":"2024-08-23T05:36:28.028126Z","iopub.status.idle":"2024-08-23T05:36:28.033839Z","shell.execute_reply.started":"2024-08-23T05:36:28.028093Z","shell.execute_reply":"2024-08-23T05:36:28.032725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Initialize LabelEncoders for each condition\nlabel_encoders = {condition: LabelEncoder() for condition in conditions}\n# Apply Label Encoding to each condition's severity level\nfor condition in conditions:\n    merged_df[condition + '_encoded'] = label_encoders[condition].fit_transform(merged_df[condition])\nmerged_df.head(1)","metadata":{"execution":{"iopub.status.busy":"2024-08-23T05:36:44.792399Z","iopub.execute_input":"2024-08-23T05:36:44.792794Z","iopub.status.idle":"2024-08-23T05:36:45.078227Z","shell.execute_reply.started":"2024-08-23T05:36:44.792762Z","shell.execute_reply":"2024-08-23T05:36:45.076924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels_arr = ['spinal_canal_stenosis_l1_l2','spinal_canal_stenosis_l2_l3','spinal_canal_stenosis_l3_l4','spinal_canal_stenosis_l4_l5','spinal_canal_stenosis_l5_s1',\n         'left_neural_foraminal_narrowing_l1_l2','left_neural_foraminal_narrowing_l2_l3','left_neural_foraminal_narrowing_l3_l4','left_neural_foraminal_narrowing_l4_l5','left_neural_foraminal_narrowing_l5_s1',\n         'right_neural_foraminal_narrowing_l1_l2','right_neural_foraminal_narrowing_l2_l3','right_neural_foraminal_narrowing_l3_l4','right_neural_foraminal_narrowing_l4_l5','right_neural_foraminal_narrowing_l5_s1',\n         'left_subarticular_stenosis_l1_l2','left_subarticular_stenosis_l2_l3','left_subarticular_stenosis_l3_l4','left_subarticular_stenosis_l4_l5','left_subarticular_stenosis_l5_s1',\n         'right_subarticular_stenosis_l1_l2','right_subarticular_stenosis_l2_l3','right_subarticular_stenosis_l3_l4','right_subarticular_stenosis_l4_l5','right_subarticular_stenosis_l5_s1']\ncondition_arr = ['Spinal Canal Stenosis','Left Neural Foraminal Narrowing', 'Right Neural Foraminal Narrowing', 'Left Subarticular Stenosis', 'Right Subarticular Stenosis']\nlevel_arr = ['L1/L2','L2/L3','L3/L4','L4/L5','L5/S1']","metadata":{"execution":{"iopub.status.busy":"2024-08-23T05:54:18.468876Z","iopub.execute_input":"2024-08-23T05:54:18.469278Z","iopub.status.idle":"2024-08-23T05:54:18.475742Z","shell.execute_reply.started":"2024-08-23T05:54:18.469243Z","shell.execute_reply":"2024-08-23T05:54:18.474607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Preprocess images\ndef preprocess_image(image_path):\n    dicom_data = dicom.dcmread(image_path)\n    img = dicom_data.pixel_array\n    img = cv2.resize(img, (128, 128))  # Resize to a smaller size for faster processing\n    img = img / 255.0  # Normalize pixel values\n    return img","metadata":{"execution":{"iopub.status.busy":"2024-08-23T05:36:53.059080Z","iopub.execute_input":"2024-08-23T05:36:53.059588Z","iopub.status.idle":"2024-08-23T05:36:53.065619Z","shell.execute_reply.started":"2024-08-23T05:36:53.059556Z","shell.execute_reply":"2024-08-23T05:36:53.064392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_images_and_labels(df, base_path, labels_arr):\n    images = []\n    labels = []\n    \n    for index, row in df.iterrows():\n        study_id = row['study_id']\n        series_id = row['series_id']\n        instance_number = row['instance_number']\n        \n        image_path = os.path.join(base_path, str(study_id), str(series_id), f'{instance_number}.dcm')\n        \n        if os.path.exists(image_path):\n            image = preprocess_image(image_path)\n            label = row[labels_arr].values  # Use all condition columns as labels\n            \n            images.append(image)\n            labels.append(label)\n    \n    images = np.array(images)\n    labels = np.array(labels)\n    \n    return images, labels","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:04:23.435924Z","iopub.execute_input":"2024-08-23T06:04:23.436623Z","iopub.status.idle":"2024-08-23T06:04:23.443880Z","shell.execute_reply.started":"2024-08-23T06:04:23.436587Z","shell.execute_reply":"2024-08-23T06:04:23.442655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Base path where images are stored\ntrain_images_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/'\n\n# Load images and labels\nimage_data, image_labels = load_images_and_labels(merged_df, train_images_path, conditions)\n","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:04:32.316548Z","iopub.execute_input":"2024-08-23T06:04:32.317378Z","iopub.status.idle":"2024-08-23T06:19:17.221433Z","shell.execute_reply.started":"2024-08-23T06:04:32.317327Z","shell.execute_reply":"2024-08-23T06:19:17.220393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_labels","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:24:54.778069Z","iopub.execute_input":"2024-08-23T06:24:54.778504Z","iopub.status.idle":"2024-08-23T06:24:54.785783Z","shell.execute_reply.started":"2024-08-23T06:24:54.778472Z","shell.execute_reply":"2024-08-23T06:24:54.784660Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(image_data, image_labels, test_size=0.2, random_state=42)\n","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:25:08.499080Z","iopub.execute_input":"2024-08-23T06:25:08.499658Z","iopub.status.idle":"2024-08-23T06:25:12.155598Z","shell.execute_reply.started":"2024-08-23T06:25:08.499625Z","shell.execute_reply":"2024-08-23T06:25:12.154721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#batch_size = 32","metadata":{"execution":{"iopub.status.busy":"2024-08-24T02:50:19.826747Z","iopub.execute_input":"2024-08-24T02:50:19.827144Z","iopub.status.idle":"2024-08-24T02:50:19.854836Z","shell.execute_reply.started":"2024-08-24T02:50:19.827095Z","shell.execute_reply":"2024-08-24T02:50:19.853697Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Use the generator for training\ntrain_generator = image_generator(filtered_df, base_path, batch_size, labels_arr, condition_arr, level_arr)\n","metadata":{"execution":{"iopub.status.busy":"2024-08-22T23:41:16.323318Z","iopub.execute_input":"2024-08-22T23:41:16.323751Z","iopub.status.idle":"2024-08-22T23:41:16.329854Z","shell.execute_reply.started":"2024-08-22T23:41:16.323717Z","shell.execute_reply":"2024-08-22T23:41:16.328237Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train.shape","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:27:18.705146Z","iopub.execute_input":"2024-08-23T06:27:18.705949Z","iopub.status.idle":"2024-08-23T06:27:18.712817Z","shell.execute_reply.started":"2024-08-23T06:27:18.705913Z","shell.execute_reply":"2024-08-23T06:27:18.711583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = models.Sequential([\n    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1)),\n    layers.MaxPooling2D((2, 2)),\n    layers.Conv2D(64, (3, 3), activation='relu'),\n    layers.MaxPooling2D((2, 2)),\n    layers.Conv2D(128, (3, 3), activation='relu'),\n    layers.MaxPooling2D((2, 2)),\n    layers.Flatten(),\n    layers.Dense(128, activation='relu'),\n    layers.Dense(len(conditions), activation='sigmoid')  # Assuming multi-label classification with sigmoid activation\n])","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:00:13.734690Z","iopub.execute_input":"2024-08-23T06:00:13.735146Z","iopub.status.idle":"2024-08-23T06:00:14.128154Z","shell.execute_reply.started":"2024-08-23T06:00:13.735112Z","shell.execute_reply":"2024-08-23T06:00:14.127285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Compile the model\nmodel.compile(optimizer='adam',\n              loss='binary_crossentropy',  # Use 'categorical_crossentropy' for multi-class classification\n              metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:27:50.567441Z","iopub.execute_input":"2024-08-23T06:27:50.568483Z","iopub.status.idle":"2024-08-23T06:27:50.628745Z","shell.execute_reply.started":"2024-08-23T06:27:50.568439Z","shell.execute_reply":"2024-08-23T06:27:50.627833Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Display the model summary\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:00:32.237472Z","iopub.execute_input":"2024-08-23T06:00:32.237874Z","iopub.status.idle":"2024-08-23T06:00:32.270137Z","shell.execute_reply.started":"2024-08-23T06:00:32.237843Z","shell.execute_reply":"2024-08-23T06:00:32.269147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Estimate the number of steps per epoch\nsteps_per_epoch = len(merged_df) // batch_size\nsteps_per_epoch","metadata":{"execution":{"iopub.status.busy":"2024-08-22T23:41:19.209326Z","iopub.execute_input":"2024-08-22T23:41:19.209762Z","iopub.status.idle":"2024-08-22T23:41:19.218017Z","shell.execute_reply.started":"2024-08-22T23:41:19.209729Z","shell.execute_reply":"2024-08-22T23:41:19.216541Z"},"jupyter":{"source_hidden":true,"outputs_hidden":true},"collapsed":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))\n","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:28:14.795722Z","iopub.execute_input":"2024-08-23T06:28:14.796800Z","iopub.status.idle":"2024-08-23T06:28:15.104120Z","shell.execute_reply.started":"2024-08-23T06:28:14.796757Z","shell.execute_reply":"2024-08-23T06:28:15.102689Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train.shape, X_val.shape","metadata":{"execution":{"iopub.status.busy":"2024-08-23T06:02:36.785149Z","iopub.execute_input":"2024-08-23T06:02:36.785961Z","iopub.status.idle":"2024-08-23T06:02:36.792468Z","shell.execute_reply.started":"2024-08-23T06:02:36.785923Z","shell.execute_reply":"2024-08-23T06:02:36.791324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history['accuracy'], label='accuracy')\nplt.plot(history.history['val_accuracy'], label = 'val_accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.ylim([0, 1])\nplt.legend(loc='lower right')\nplt.show()","metadata":{},"execution_count":null,"outputs":[]}]}