{"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":"!pip install pylibjpeg\n!pip install python_gdcm\n!pip install pylibjpeg_libjpeg\n!pip install glob2","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-09-06T02:10:14.898258Z","iopub.execute_input":"2022-09-06T02:10:14.898749Z","iopub.status.idle":"2022-09-06T02:11:12.047633Z","shell.execute_reply.started":"2022-09-06T02:10:14.89865Z","shell.execute_reply":"2022-09-06T02:11:12.046119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport numpy as np\nimport pydicom\nimport tensorflow as tf\n\nfrom tqdm.auto import tqdm\nimport glob\nfrom scipy.ndimage import zoom\n\n\nfrom tensorflow import keras\nfrom tensorflow.keras import layers","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:26:24.46667Z","iopub.execute_input":"2022-09-06T02:26:24.467104Z","iopub.status.idle":"2022-09-06T02:26:24.473788Z","shell.execute_reply.started":"2022-09-06T02:26:24.467069Z","shell.execute_reply":"2022-09-06T02:26:24.472441Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DATA_DIR = \"../input/rsna-2022-cervical-spine-fracture-detection/\"","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:26:26.598602Z","iopub.execute_input":"2022-09-06T02:26:26.599456Z","iopub.status.idle":"2022-09-06T02:26:26.604509Z","shell.execute_reply.started":"2022-09-06T02:26:26.599408Z","shell.execute_reply":"2022-09-06T02:26:26.603683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir(DATA_DIR)","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:26:27.978259Z","iopub.execute_input":"2022-09-06T02:26:27.979071Z","iopub.status.idle":"2022-09-06T02:26:27.987179Z","shell.execute_reply.started":"2022-09-06T02:26:27.979021Z","shell.execute_reply":"2022-09-06T02:26:27.985951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv(DATA_DIR + \"train.csv\")\ntrain_df.head(-1)","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:26:30.931808Z","iopub.execute_input":"2022-09-06T02:26:30.932276Z","iopub.status.idle":"2022-09-06T02:26:30.959307Z","shell.execute_reply.started":"2022-09-06T02:26:30.932239Z","shell.execute_reply":"2022-09-06T02:26:30.958481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dicom(path):\n\n    img=pydicom.dcmread(path)\n    data=img.pixel_array\n    data=data-np.min(data)\n    if np.max(data) != 0:\n        data=data/np.max(data)\n    data=(data*255).astype(np.uint8)  \n\n\n    return data","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:26:33.034515Z","iopub.execute_input":"2022-09-06T02:26:33.035272Z","iopub.status.idle":"2022-09-06T02:26:33.041336Z","shell.execute_reply.started":"2022-09-06T02:26:33.035236Z","shell.execute_reply":"2022-09-06T02:26:33.040165Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample = 5\nX = np.zeros((sample,64,64,64))\ny = np.zeros((sample,8))\nfor k, study_instance in enumerate(train_df.StudyInstanceUID[:sample]):\n    print(k) # k = index of study_Instance\n    number_files = len(os.listdir(DATA_DIR + f\"train_images/{study_instance}\"))\n    img3d = np.zeros((512,512,number_files))\n    train_labels = []\n    train_labels.extend([\n            train_df.loc[k, \"C1\"],\n            train_df.loc[k, \"C2\"],\n            train_df.loc[k, \"C3\"],\n            train_df.loc[k, \"C4\"],\n            train_df.loc[k, \"C5\"],\n            train_df.loc[k, \"C6\"],\n            train_df.loc[k, \"C7\"],\n            train_df.loc[k, \"patient_overall\"] \n        ])\n    print(train_labels)\n    y[k:] = train_labels\n    for i, dcm in enumerate(sorted(os.listdir(DATA_DIR + f\"train_images/{study_instance}\"))):\n        train_labels = []  # i is index of slice in each study instance\n        path = DATA_DIR + f\"train_images/{study_instance}/{dcm}\"\n        img2d = load_dicom(path)\n        img2d = np.resize(img2d, (512, 512))\n        img3d[:,:,i] += img2d\n    \n    \n    img3d = zoom(img3d, (0.125, 0.125, 64/(number_files))).astype(np.uint8)\n    X[k,:,:,:] += img3d  # 64 slices and down resolution\n        \n        \n    \n        \n\n        \n   \n            \n        ","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:26:36.106288Z","iopub.execute_input":"2022-09-06T02:26:36.107126Z","iopub.status.idle":"2022-09-06T02:27:45.977376Z","shell.execute_reply.started":"2022-09-06T02:26:36.107066Z","shell.execute_reply":"2022-09-06T02:27:45.976208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = np.resize(X, (sample, 64, 64, 64, 1))","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:27:49.210047Z","iopub.execute_input":"2022-09-06T02:27:49.210917Z","iopub.status.idle":"2022-09-06T02:27:49.21863Z","shell.execute_reply.started":"2022-09-06T02:27:49.210873Z","shell.execute_reply":"2022-09-06T02:27:49.217214Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X.shape","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:27:50.741303Z","iopub.execute_input":"2022-09-06T02:27:50.742355Z","iopub.status.idle":"2022-09-06T02:27:50.749689Z","shell.execute_reply.started":"2022-09-06T02:27:50.742306Z","shell.execute_reply":"2022-09-06T02:27:50.748531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X[:3]\nX_val = X[3:]\ny_train = y[:3]\ny_val = y[3:]","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:27:57.852583Z","iopub.execute_input":"2022-09-06T02:27:57.852979Z","iopub.status.idle":"2022-09-06T02:27:57.865686Z","shell.execute_reply.started":"2022-09-06T02:27:57.852948Z","shell.execute_reply":"2022-09-06T02:27:57.864728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = tf.data.Dataset.from_tensor_slices((X_train,y_train))\nvalidation_loader = tf.data.Dataset.from_tensor_slices((X_val, y_val))\n\n\nbatch_size = 1\n# Augment the on the fly during training.\ntrain_dataset = (\n    train_loader.shuffle(len(X_train))\n    .batch(batch_size)\n    .prefetch(2)\n)\n\nvalidation_dataset = (\n    validation_loader.shuffle(len(X_val))\n    .batch(batch_size)\n    .prefetch(2)\n)","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:27:57.875962Z","iopub.execute_input":"2022-09-06T02:27:57.876711Z","iopub.status.idle":"2022-09-06T02:27:57.888274Z","shell.execute_reply.started":"2022-09-06T02:27:57.876644Z","shell.execute_reply":"2022-09-06T02:27:57.88734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model(width=64, height=64, depth=64):\n    \"\"\"Build a 3D convolutional neural network model.\"\"\"\n\n    inputs = keras.Input((width, height, depth, 1))\n\n    x = layers.Conv3D(filters=128, kernel_size=3, activation=\"relu\",padding='same')(inputs)\n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.BatchNormalization()(x)\n\n    x = layers.Conv3D(filters=128, kernel_size=3, activation=\"relu\",padding='same')(x)\n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.BatchNormalization()(x)\n\n    x = layers.Conv3D(filters=256, kernel_size=3, activation=\"relu\",padding='same')(x)\n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.BatchNormalization()(x)\n\n    x = layers.Conv3D(filters=256, kernel_size=3, activation=\"relu\",padding='same')(x)\n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.BatchNormalization()(x)\n\n    x = layers.GlobalAveragePooling3D()(x)\n    x = layers.Dense(units=512, activation=\"relu\")(x)\n    x = layers.Dropout(0.3)(x)\n\n    outputs = layers.Dense(units=8, activation=\"sigmoid\")(x)\n\n    # Define the model.\n    model = keras.Model(inputs, outputs, name=\"3dcnn\")\n    return model\n\n\n# Build model.\nmodel = get_model(width=64, height=64, depth=64)\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:28:00.535251Z","iopub.execute_input":"2022-09-06T02:28:00.536095Z","iopub.status.idle":"2022-09-06T02:28:00.67507Z","shell.execute_reply.started":"2022-09-06T02:28:00.53606Z","shell.execute_reply":"2022-09-06T02:28:00.674016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"initial_learning_rate = 0.0001\nlr_schedule = keras.optimizers.schedules.ExponentialDecay(\n    initial_learning_rate, decay_steps=100000, decay_rate=0.96, staircase=True\n)\nmodel.compile(\n    loss=\"binary_crossentropy\",\n    optimizer=keras.optimizers.Adam(learning_rate=lr_schedule),\n    metrics=[\"acc\"],\n)\n\n# Define callbacks.\ncheckpoint_cb = keras.callbacks.ModelCheckpoint(\n    \"3d_image_classification.h5\", save_best_only=True\n)\nearly_stopping_cb = keras.callbacks.EarlyStopping(monitor=\"val_acc\", patience=5)\n\n# Train the model, doing validation at the end of each epoch\nepochs = 20\nmodel.fit(\n    train_dataset,\n    validation_data=validation_dataset,\n    epochs=epochs,\n    batch_size=8,\n    shuffle=True,\n    verbose=2,\n    callbacks=[checkpoint_cb, early_stopping_cb],\n)","metadata":{"execution":{"iopub.status.busy":"2022-09-06T02:28:03.496008Z","iopub.execute_input":"2022-09-06T02:28:03.497326Z","iopub.status.idle":"2022-09-06T02:28:32.498732Z","shell.execute_reply.started":"2022-09-06T02:28:03.497276Z","shell.execute_reply":"2022-09-06T02:28:32.497286Z"},"trusted":true},"execution_count":null,"outputs":[]}]}