{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os \nimport pathlib\nimport glob \nfrom tqdm import tqdm \n\nimport pandas as pd\nimport numpy as np\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport pydicom\n\nfrom fastai.vision.all import *\nfrom fastai.medical.imaging import *\nfrom fastcore.all import *\nimport pandas as pd\nimport pydicom\nimport numpy as np\n\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport seaborn as sns\n\n%matplotlib inline","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-16T19:19:18.164703Z","iopub.execute_input":"2022-08-16T19:19:18.165354Z","iopub.status.idle":"2022-08-16T19:19:18.19385Z","shell.execute_reply.started":"2022-08-16T19:19:18.165273Z","shell.execute_reply":"2022-08-16T19:19:18.192257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rsna_path = \"../input/rsna-2022-cervical-spine-fracture-detection/\"\nseg_path =  \"../input/segged-data\"","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:19:20.181779Z","iopub.execute_input":"2022-08-16T19:19:20.182189Z","iopub.status.idle":"2022-08-16T19:19:20.188037Z","shell.execute_reply.started":"2022-08-16T19:19:20.182147Z","shell.execute_reply":"2022-08-16T19:19:20.186712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv(rsna_path + \"train.csv\")\ntest_df = pd.read_csv(rsna_path + \"test.csv\")\ntrain_df.head(5)\n","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:19:21.731568Z","iopub.execute_input":"2022-08-16T19:19:21.732165Z","iopub.status.idle":"2022-08-16T19:19:21.765881Z","shell.execute_reply.started":"2022-08-16T19:19:21.732115Z","shell.execute_reply":"2022-08-16T19:19:21.764663Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data_instance = '../input/segged-data/sag/1.2.826.0.1.3680043.10001'\ndata_list = os.listdir(f'../input/segged-data/sag/')\ndata_test_list = os.listdir(f'../input/segged-data-t/sag/')","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:19:23.178008Z","iopub.execute_input":"2022-08-16T19:19:23.178442Z","iopub.status.idle":"2022-08-16T19:19:23.188063Z","shell.execute_reply.started":"2022-08-16T19:19:23.178407Z","shell.execute_reply":"2022-08-16T19:19:23.187011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(2,4,figsize=(25,12))\n\nsns.countplot(train_df.patient_overall, ax=ax[0,0], palette=\"Blues_r\")\nax[0,0].set_title(\"Patient overall target count\");\nsns.countplot(train_df.C1, ax=ax[0,1], palette=\"Blues_r\")\nax[0,1].set_title(\"C1 target count\");\nsns.countplot(train_df.C2, ax=ax[0,2], palette=\"Blues_r\")\nax[0,2].set_title(\"C2 target count\");\nsns.countplot(train_df.C3, ax=ax[0,3], palette=\"Blues_r\")\nax[0,3].set_title(\"C3 target count\");\n\nsns.countplot(train_df.C4, ax=ax[1,0], palette=\"Blues_r\")\nax[1,0].set_title(\"C4 target count\");\nsns.countplot(train_df.C5, ax=ax[1,1], palette=\"Blues_r\")\nax[1,1].set_title(\"C5 target count\");\nsns.countplot(train_df.C6, ax=ax[1,2], palette=\"Blues_r\")\nax[1,2].set_title(\"C6 target count\");\nsns.countplot(train_df.C7, ax=ax[1,3], palette=\"Blues_r\")\nax[1,3].set_title(\"C7 target count\");\n\nfor n in range(4):\n    ax[0,n].set_xlabel(\"\")\n    ax[1,n].set_xlabel(\"\")\n","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:00:44.559306Z","iopub.execute_input":"2022-08-16T19:00:44.559867Z","iopub.status.idle":"2022-08-16T19:00:45.402893Z","shell.execute_reply.started":"2022-08-16T19:00:44.55982Z","shell.execute_reply":"2022-08-16T19:00:45.401662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_case(folder_name, interval=5):\n    plt.figure(figsize=(16, 12))\n    count = 1\n    for i in range(-4 * interval, 5 * interval, interval):\n        fn = f'../input/segged-data/sag/{folder_name}/{folder_name}_{i}.jpg'\n        img = mpimg.imread(fn)\n        plt.subplot(3,3,count)\n        count += 1\n        plt.imshow(img, cmap='bone')\n        plt.axis(\"off\")\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-16T18:53:25.574388Z","iopub.execute_input":"2022-08-16T18:53:25.574815Z","iopub.status.idle":"2022-08-16T18:53:25.582268Z","shell.execute_reply.started":"2022-08-16T18:53:25.574779Z","shell.execute_reply":"2022-08-16T18:53:25.581299Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"show_case('1.2.826.0.1.3680043.1102')","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:17:18.105558Z","iopub.execute_input":"2022-08-16T19:17:18.106041Z","iopub.status.idle":"2022-08-16T19:17:18.967694Z","shell.execute_reply.started":"2022-08-16T19:17:18.106004Z","shell.execute_reply":"2022-08-16T19:17:18.966609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_set=[]\ntrain_label=[]\ntrain_idt=[]\n\nfor i in range(len(data_list)):\n    folder_name = data_list[i]\n    interval = -20\n    for im in os.listdir(f'../input/segged-data/sag/{folder_name}/'):\n        path = f'../input/segged-data/sag/{folder_name}/{folder_name}_{interval}.jpg'\n        idt = folder_name\n        img = plt.imread(path)\n            \n            # resize each image into a shape of (512, 512)\n        img = np.resize(img, (64, 64,1))\n            #  normalize image\n        img = img / 255.0\n\n            \n        cur_label=[]\n        cur_label.append(train_df.loc[i, 'patient_overall'])\n        cur_label.append(train_df.loc[i,'C1'])\n        cur_label.append(train_df.loc[i,'C2'])\n        cur_label.append(train_df.loc[i,'C3'])\n        cur_label.append(train_df.loc[i,'C4'])\n        cur_label.append(train_df.loc[i,'C5'])\n        cur_label.append(train_df.loc[i,'C6'])\n        cur_label.append(train_df.loc[i,'C7'])\n        train_label+=[cur_label]\n        train_idt+=[idt]\n        train_set+=[img]\n            \n        interval += 5\n          ","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:19:28.996866Z","iopub.execute_input":"2022-08-16T19:19:28.997344Z","iopub.status.idle":"2022-08-16T19:20:07.257313Z","shell.execute_reply.started":"2022-08-16T19:19:28.997306Z","shell.execute_reply":"2022-08-16T19:20:07.256239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y=np.array(train_label)\nY_train=y\nX_train=np.array(train_set)","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:20:19.84325Z","iopub.execute_input":"2022-08-16T19:20:19.843719Z","iopub.status.idle":"2022-08-16T19:20:19.939905Z","shell.execute_reply.started":"2022-08-16T19:20:19.843681Z","shell.execute_reply":"2022-08-16T19:20:19.938918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dir=f'../input/segged-data_t/sag/'\ntest_set=[]\ntest_idt=[]\nfor i in tqdm(range(len(test_df))):\n    folder_name = data_test_list[i]\n    interval = -20\n    idt=folder_name\n    \n    for im in os.listdir(f'../input/segged-data-t/sag/{folder_name}/'):\n        \n        path = f'../input/segged-data-t/sag/{folder_name}/{folder_name}_{interval}.jpg'\n\n        img=plt.imread(path) \n\n        img = np.resize(img, (64, 64,1))\n        img = img / 255.0\n        test_set+=[img]\n        test_idt+=[idt]\n        interval += 5\n","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:20:21.473844Z","iopub.execute_input":"2022-08-16T19:20:21.474263Z","iopub.status.idle":"2022-08-16T19:20:21.758601Z","shell.execute_reply.started":"2022-08-16T19:20:21.474229Z","shell.execute_reply":"2022-08-16T19:20:21.757401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = np.array(test_set)","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:20:23.772514Z","iopub.execute_input":"2022-08-16T19:20:23.773056Z","iopub.status.idle":"2022-08-16T19:20:23.779338Z","shell.execute_reply.started":"2022-08-16T19:20:23.773019Z","shell.execute_reply":"2022-08-16T19:20:23.777843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import models\nfrom tensorflow.keras.utils import plot_model\n\ndef myNN():\n    model = models.Sequential()\n    \n    model.add(layers.Conv2D(16,3,padding = 'same',activation = 'relu', input_shape = (64,64,1)))\n    \n    model.add(layers.Conv2D(32,3,padding = 'same', activation = 'relu',name = 'hidden1'))\n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(64,3,padding = 'same', activation = 'relu',name = 'hidden2'))\n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(128,3,padding = 'same', activation = 'relu',name = 'hidden3'))\n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(256,3,padding = 'same', activation = 'relu',name = 'hidden4'))\n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(512,3,padding = 'same', activation = 'relu',name = 'hidden5'))\n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Conv2D(1,3,padding = 'same', activation = 'relu',name = 'hidden6'))\n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.BatchNormalization())\n    \n\n\n    model.add(layers.Flatten())\n    model.add(layers.Dense(1024,name = 'hidden7', activation = 'relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dropout(.25))\n    model.add(layers.Dense(1024,name = 'hidden8', activation = 'relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dropout(.25))\n    model.add(layers.Dense(1024,name = 'hidden9', activation = 'relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dropout(.25))\n    model.add(layers.Dense(8,name = 'out', activation = 'softmax'))\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:24:36.771056Z","iopub.execute_input":"2022-08-16T19:24:36.771868Z","iopub.status.idle":"2022-08-16T19:24:36.789438Z","shell.execute_reply.started":"2022-08-16T19:24:36.771817Z","shell.execute_reply":"2022-08-16T19:24:36.788315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = myNN()","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:24:39.285518Z","iopub.execute_input":"2022-08-16T19:24:39.286318Z","iopub.status.idle":"2022-08-16T19:24:39.604686Z","shell.execute_reply.started":"2022-08-16T19:24:39.28628Z","shell.execute_reply":"2022-08-16T19:24:39.603658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:24:40.905847Z","iopub.execute_input":"2022-08-16T19:24:40.906611Z","iopub.status.idle":"2022-08-16T19:24:40.918258Z","shell.execute_reply.started":"2022-08-16T19:24:40.90657Z","shell.execute_reply":"2022-08-16T19:24:40.917187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_model(model, show_shapes = True, show_layer_names = True, rankdir = 'TB',to_file = 'model.png')\n","metadata":{"execution":{"iopub.status.busy":"2022-08-16T19:26:03.266892Z","iopub.execute_input":"2022-08-16T19:26:03.267998Z","iopub.status.idle":"2022-08-16T19:26:03.652058Z","shell.execute_reply.started":"2022-08-16T19:26:03.267932Z","shell.execute_reply":"2022-08-16T19:26:03.650467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=tf.keras.optimizers.Adam(), \n              loss=tf.keras.losses.CategoricalCrossentropy(),\n              metrics=[tf.keras.metrics.CategoricalAccuracy()]\n             )","metadata":{"execution":{"iopub.status.busy":"2022-08-16T15:55:24.660466Z","iopub.execute_input":"2022-08-16T15:55:24.660824Z","iopub.status.idle":"2022-08-16T15:55:24.683635Z","shell.execute_reply.started":"2022-08-16T15:55:24.660784Z","shell.execute_reply":"2022-08-16T15:55:24.682504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\nidg = ImageDataGenerator()\nbatch_size = 5\ntrain_datagen =  idg.flow(X_train, Y_train, batch_size)\nvalid_datagen = idg.flow(X_train, Y_train, batch_size)","metadata":{"execution":{"iopub.status.busy":"2022-08-16T15:55:24.685314Z","iopub.execute_input":"2022-08-16T15:55:24.685625Z","iopub.status.idle":"2022-08-16T15:55:24.772443Z","shell.execute_reply.started":"2022-08-16T15:55:24.685597Z","shell.execute_reply":"2022-08-16T15:55:24.771233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ne = 5\nhistory = model.fit_generator(generator = train_datagen,\n                                  validation_data = valid_datagen,\n                                  epochs = ne)","metadata":{"execution":{"iopub.status.busy":"2022-08-16T15:56:41.377791Z","iopub.execute_input":"2022-08-16T15:56:41.378993Z","iopub.status.idle":"2022-08-16T16:02:19.179791Z","shell.execute_reply.started":"2022-08-16T15:56:41.378915Z","shell.execute_reply":"2022-08-16T16:02:19.178891Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred = model.predict(X_train)","metadata":{"execution":{"iopub.status.busy":"2022-08-16T16:02:29.877202Z","iopub.execute_input":"2022-08-16T16:02:29.877703Z","iopub.status.idle":"2022-08-16T16:02:50.007478Z","shell.execute_reply.started":"2022-08-16T16:02:29.87766Z","shell.execute_reply":"2022-08-16T16:02:50.006122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result = pd.DataFrame(columns = [\"StudyInstanceUID\", 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'patient_overall'])","metadata":{"execution":{"iopub.status.busy":"2022-08-16T16:02:57.967127Z","iopub.execute_input":"2022-08-16T16:02:57.967632Z","iopub.status.idle":"2022-08-16T16:02:57.977204Z","shell.execute_reply.started":"2022-08-16T16:02:57.967588Z","shell.execute_reply":"2022-08-16T16:02:57.976056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in tqdm(range(len(test_idt))):\n    result.loc[i, 'StudyInstanceUID'] = test_idt[i]\n    rows = pred[i].round(3)\n    result.loc[i, 'C1'] = rows[0]\n    result.loc[i, 'C2'] = rows[1]\n    result.loc[i, 'C3'] = rows[2]\n    result.loc[i, 'C4'] = rows[3]\n    result.loc[i, 'C5'] = rows[4]\n    result.loc[i, 'C6'] = rows[5]\n    result.loc[i, 'C7'] = rows[6]\n    result.loc[i, 'patient_overall'] = rows[7]","metadata":{"execution":{"iopub.status.busy":"2022-08-16T16:03:08.198398Z","iopub.execute_input":"2022-08-16T16:03:08.198824Z","iopub.status.idle":"2022-08-16T16:03:08.254749Z","shell.execute_reply.started":"2022-08-16T16:03:08.198777Z","shell.execute_reply":"2022-08-16T16:03:08.253404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-16T16:03:10.561172Z","iopub.execute_input":"2022-08-16T16:03:10.561676Z","iopub.status.idle":"2022-08-16T16:03:10.583682Z","shell.execute_reply.started":"2022-08-16T16:03:10.561629Z","shell.execute_reply":"2022-08-16T16:03:10.582516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"means = result[['patient_overall', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7']].mean().to_dict()\nprint(means)","metadata":{"execution":{"iopub.status.busy":"2022-08-16T16:03:22.09188Z","iopub.execute_input":"2022-08-16T16:03:22.092272Z","iopub.status.idle":"2022-08-16T16:03:22.10608Z","shell.execute_reply.started":"2022-08-16T16:03:22.09224Z","shell.execute_reply":"2022-08-16T16:03:22.104674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df['fractured'] = test_df['prediction_type'].map(means)\ntest_df[['row_id','fractured']].to_csv('submission.csv', index=False, float_format='%.1g')","metadata":{"execution":{"iopub.status.busy":"2022-08-16T16:03:28.136911Z","iopub.execute_input":"2022-08-16T16:03:28.137345Z","iopub.status.idle":"2022-08-16T16:03:28.150197Z","shell.execute_reply.started":"2022-08-16T16:03:28.137309Z","shell.execute_reply":"2022-08-16T16:03:28.14903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cat submission.csv","metadata":{"execution":{"iopub.status.busy":"2022-08-16T16:03:31.0195Z","iopub.execute_input":"2022-08-16T16:03:31.01993Z","iopub.status.idle":"2022-08-16T16:03:32.104921Z","shell.execute_reply.started":"2022-08-16T16:03:31.019892Z","shell.execute_reply":"2022-08-16T16:03:32.103411Z"},"trusted":true},"execution_count":null,"outputs":[]}]}