{"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 torchio","metadata":{"execution":{"iopub.status.busy":"2022-10-20T19:44:20.778675Z","iopub.execute_input":"2022-10-20T19:44:20.779216Z","iopub.status.idle":"2022-10-20T19:44:35.50685Z","shell.execute_reply.started":"2022-10-20T19:44:20.779074Z","shell.execute_reply":"2022-10-20T19:44:35.505639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Imports","metadata":{}},{"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 torchio as tio\nimport SimpleITK as sitk\n\nimport os\nimport pydicom\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import Sequential\nfrom tensorflow.keras.layers import Flatten, Dense, Conv3D, MaxPool3D, BatchNormalization, Dropout, GlobalAveragePooling3D","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-10-20T19:44:35.509284Z","iopub.execute_input":"2022-10-20T19:44:35.509792Z","iopub.status.idle":"2022-10-20T19:44:44.28445Z","shell.execute_reply.started":"2022-10-20T19:44:35.509736Z","shell.execute_reply":"2022-10-20T19:44:44.28369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load data","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv('../input/rsna-str-pulmonary-embolism-detection/train.csv')","metadata":{"execution":{"iopub.status.busy":"2022-10-20T19:45:00.395152Z","iopub.execute_input":"2022-10-20T19:45:00.395562Z","iopub.status.idle":"2022-10-20T19:45:03.544076Z","shell.execute_reply.started":"2022-10-20T19:45:00.395527Z","shell.execute_reply":"2022-10-20T19:45:03.543123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def getlabel(name : str) -> int:\n    label = df[df.StudyInstanceUID == name].negative_exam_for_pe.values\n    return int(label[0])","metadata":{"execution":{"iopub.status.busy":"2022-10-20T19:45:07.197162Z","iopub.execute_input":"2022-10-20T19:45:07.197592Z","iopub.status.idle":"2022-10-20T19:45:07.202443Z","shell.execute_reply.started":"2022-10-20T19:45:07.197554Z","shell.execute_reply":"2022-10-20T19:45:07.201418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def resize(vol):\n    sit = vol.as_sitk()\n    depth = sit.GetDepth()\n    res = tio.Resize((128, 128, depth))\n    read = res(vol)\n    return read","metadata":{"execution":{"iopub.status.busy":"2022-10-20T19:45:12.849785Z","iopub.execute_input":"2022-10-20T19:45:12.85032Z","iopub.status.idle":"2022-10-20T19:45:12.857644Z","shell.execute_reply.started":"2022-10-20T19:45:12.850272Z","shell.execute_reply":"2022-10-20T19:45:12.856714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef load_data(ind = 0,limit = 10):\n    transform = tio.ZNormalization()\n    HOUNSFIELD_AIR, HOUNSFIELD_BONE = -1000, 1000\n    clamp = tio.Clamp(out_min=HOUNSFIELD_AIR, out_max=HOUNSFIELD_BONE)\n    resample = tio.Resample((1, 1, 1))\n    data = []\n    baddirs = []\n    counter = 1\n    datay = []\n    for i in fns[ind:]:\n        \n        if counter == limit:\n            break\n        print(i)\n\n        path = f'../input/rsna-str-pulmonary-embolism-detection/train/{i}'\n        imageList = os.listdir(path)\n        path += '/' + imageList[0]\n        vol = tio.ScalarImage(path)\n        s = vol.as_sitk()\n        depth = s.GetDepth()\n        if depth > 290:\n            continue\n\n        clamped = clamp(vol)\n        normal = transform(clamped)\n        ready = resample(normal)\n        ready = resize(ready)\n\n        s = ready.as_sitk()\n        depth = s.GetDepth()\n        iarray = sitk.GetArrayFromImage(s)\n        if depth < 290:\n            for j in range(290 - depth):   \n\n                im = np.zeros((128, 128))\n\n                iarray = np.append(iarray, [im], axis=0)\n\n        elif depth > 290:\n            continue\n\n        iarray = iarray.reshape(128, 128, 290)\n        iarray = np.expand_dims(iarray, axis=3)\n\n        print(counter , '/' , 801)\n        lbl = getlabel(str(i))\n        datay.append(lbl)\n        data.append(iarray)\n        counter += 1\n\n            \n    return data,datay\n","metadata":{"execution":{"iopub.status.busy":"2022-10-20T19:45:13.178487Z","iopub.execute_input":"2022-10-20T19:45:13.179475Z","iopub.status.idle":"2022-10-20T19:45:13.192058Z","shell.execute_reply.started":"2022-10-20T19:45:13.179425Z","shell.execute_reply":"2022-10-20T19:45:13.191267Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datax, datay = load_data(0, 59)\ndatay = np.array(datay)","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:10:26.43729Z","iopub.execute_input":"2022-10-20T20:10:26.437738Z","iopub.status.idle":"2022-10-20T20:41:49.479959Z","shell.execute_reply.started":"2022-10-20T20:10:26.437698Z","shell.execute_reply":"2022-10-20T20:41:49.477075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datax = np.array(datax)","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:43:22.082665Z","iopub.execute_input":"2022-10-20T20:43:22.083229Z","iopub.status.idle":"2022-10-20T20:43:23.236881Z","shell.execute_reply.started":"2022-10-20T20:43:22.083175Z","shell.execute_reply":"2022-10-20T20:43:23.235883Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datax.shape\n","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:43:25.685371Z","iopub.execute_input":"2022-10-20T20:43:25.686045Z","iopub.status.idle":"2022-10-20T20:43:25.692966Z","shell.execute_reply.started":"2022-10-20T20:43:25.686008Z","shell.execute_reply":"2022-10-20T20:43:25.691916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datay.shape","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:43:39.588988Z","iopub.execute_input":"2022-10-20T20:43:39.589473Z","iopub.status.idle":"2022-10-20T20:43:39.596089Z","shell.execute_reply.started":"2022-10-20T20:43:39.589436Z","shell.execute_reply":"2022-10-20T20:43:39.594812Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datay = datay.reshape(len(datay), -1)\ndatay","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:43:46.613541Z","iopub.execute_input":"2022-10-20T20:43:46.61396Z","iopub.status.idle":"2022-10-20T20:43:46.621409Z","shell.execute_reply.started":"2022-10-20T20:43:46.613927Z","shell.execute_reply":"2022-10-20T20:43:46.620428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = tf.data.Dataset.from_tensor_slices((datax, datay))\n\nbatch_size = 2\n\ntrain_dataset = (train_loader.shuffle(len(datax)).batch(batch_size).prefetch(2))\n","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:44:02.807244Z","iopub.execute_input":"2022-10-20T20:44:02.807676Z","iopub.status.idle":"2022-10-20T20:44:03.399764Z","shell.execute_reply.started":"2022-10-20T20:44:02.807623Z","shell.execute_reply":"2022-10-20T20:44:03.398841Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Build model","metadata":{}},{"cell_type":"code","source":"\nmodel = Sequential()\n\nmodel.add(Conv3D(filters=64, kernel_size=(3, 3, 3), activation='relu', input_shape = (128, 128, 290, 1) ))\nmodel.add(Conv3D(filters=64, kernel_size=(3, 3, 3), activation='relu'))\nmodel.add(MaxPool3D(pool_size=2))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv3D(filters=64, kernel_size=(3, 3, 3), activation='relu' ))\nmodel.add(Conv3D(filters=64, kernel_size=(3, 3, 3), activation='relu' ))\nmodel.add(MaxPool3D(pool_size=2))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv3D(filters=128, kernel_size=(3, 3, 3), activation='relu' ))\nmodel.add(Conv3D(filters=128, kernel_size=(3, 3, 3), activation='relu' ))\nmodel.add(MaxPool3D(pool_size=2))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv3D(filters=256, kernel_size=(3, 3, 3), activation='relu' ))\nmodel.add(Conv3D(filters=256, kernel_size=(3, 3, 3), activation='relu' ))\nmodel.add(MaxPool3D(pool_size=2))\nmodel.add(BatchNormalization())\n\nmodel.add(GlobalAveragePooling3D())\n\nmodel.add(Dense(units=512, activation='relu'))\n\nmodel.add(Dense(units=256, activation='relu'))\n\nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(units=1, activation='sigmoid'))\n\n","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:44:07.470115Z","iopub.execute_input":"2022-10-20T20:44:07.4705Z","iopub.status.idle":"2022-10-20T20:44:07.770911Z","shell.execute_reply.started":"2022-10-20T20:44:07.470467Z","shell.execute_reply":"2022-10-20T20:44:07.769921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import keras\n\ninitial_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.SGD(learning_rate=initial_learning_rate, momentum=0.0, nesterov=False, name='SGD',\n),\n    metrics=[\"acc\"],\n)\n\n# Define callbacks.\ncheckpoint_cb = keras.callbacks.ModelCheckpoint(\n    \"3d_image_classification\", save_best_only=True,verbose = 1\n)\nearly_stopping_cb = keras.callbacks.EarlyStopping(monitor=\"val_acc\",verbose = 1, patience=15)\nLRred = keras.callbacks.ReduceLROnPlateau(monitor='loss', verbose = 1,factor=0.2,\n                              patience=1, min_lr=0.000001)\n# Train the model, doing validation at the end of each epoch\nepochs = 25\n\n","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:44:21.351429Z","iopub.execute_input":"2022-10-20T20:44:21.352313Z","iopub.status.idle":"2022-10-20T20:44:21.366625Z","shell.execute_reply.started":"2022-10-20T20:44:21.352269Z","shell.execute_reply":"2022-10-20T20:44:21.365795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n    train_dataset,\n    epochs=epochs,\n    shuffle=True,\n    verbose=1,\n    callbacks=[checkpoint_cb, early_stopping_cb,LRred],\n)","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:44:24.898007Z","iopub.execute_input":"2022-10-20T20:44:24.898934Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"test\")","metadata":{"execution":{"iopub.status.busy":"2022-10-20T20:06:39.16873Z","iopub.execute_input":"2022-10-20T20:06:39.169162Z","iopub.status.idle":"2022-10-20T20:06:42.434988Z","shell.execute_reply.started":"2022-10-20T20:06:39.169126Z","shell.execute_reply":"2022-10-20T20:06:42.434224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}