{"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 pydicom\nimport pandas as pd\nimport numpy as np\nimport cv2\nimport math\ndata_dir = \"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\"\npatients = os.listdir(data_dir)\npatients.sort()","metadata":{"execution":{"iopub.status.busy":"2021-10-13T08:27:39.970910Z","iopub.execute_input":"2021-10-13T08:27:39.971512Z","iopub.status.idle":"2021-10-13T08:27:40.305403Z","shell.execute_reply.started":"2021-10-13T08:27:39.971411Z","shell.execute_reply":"2021-10-13T08:27:40.304533Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def average(l):\n    return sum(l)/len(l)\n    \ndef layers(l,n):\n    for i in range(0, len(l), n):\n        yield l[i:i + n]\n\nm2 = [22, 23, 24, 36, 37, 38, 39, 40, 50, 51, 52, 53, 54, 55, 56, 65, 66, 67, 68, 69, 70, 81, 82, 83, 84, 97, 98]\nm3 = [19, 20, 21, 25, 26, 33, 34, 35, 41, 42, 49]\nm4 = [18, 27, 28]\nm5 = [17]\n\ndef adjuster(file):\n    if len(file) in m5:\n        n = 5\n    elif len(file) in m4:\n        n = 4\n    elif len(file) in m3:\n        n = 3\n    elif len(file) in m2:\n        n = 2\n    else:\n        n = 1\n    new_file = []\n    for i in range(len(file)):\n        for j in range(n):\n            new_file.append(file[i])\n    return new_file       \n\ndef decider(length, layer_number):\n    return math.ceil(length/layer_number)\n   \ndef adjuster2(layers, layer_number):\n    if len(layers) == layer_number - 1:\n        layers.append(layers[-1])","metadata":{"execution":{"iopub.status.busy":"2021-10-13T08:27:43.365432Z","iopub.execute_input":"2021-10-13T08:27:43.365971Z","iopub.status.idle":"2021-10-13T08:27:43.376603Z","shell.execute_reply.started":"2021-10-13T08:27:43.365935Z","shell.execute_reply":"2021-10-13T08:27:43.375546Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"layer_number=16\nc=1\nInput_Values = []\nfor p in patients[:]:\n    if p != '00109' and p != '00123' and p != '00709':\n        scan=[]\n        \n        flair_list = os.listdir(data_dir + p + '/FLAIR/')\n        flair_list.sort(key = lambda x : int(pydicom.read_file(data_dir + p + '/FLAIR/'+ x).ImagePositionPatient[2]))\n        flair = [\n            cv2.resize(pydicom.read_file(data_dir + p + '/FLAIR/'+ layer).pixel_array,(64,64)) \n            for layer in flair_list ]\n\n        new_flair=[]\n        flair = adjuster(flair)\n        layer_size = decider(len(flair) , layer_number)\n        for layer_chunk in layers(flair, layer_size):\n            layer_chunk = list(map(average, zip(*layer_chunk)))\n            new_flair.append(layer_chunk)\n        adjuster2(new_flair, layer_number)\n\n        T1w_list = os.listdir(data_dir + p + '/T1w/')\n        T1w_list.sort(key = lambda x : int(pydicom.read_file(data_dir + p + '/T1w/'+ x).ImagePositionPatient[2]))\n        T1w = [\n            cv2.resize(pydicom.read_file(data_dir + p + '/T1w/'+ layer).pixel_array,(64,64)) \n            for layer in T1w_list]\n\n        new_T1w = []\n        T1w=adjuster(T1w)\n        layer_size = decider(len(T1w) , layer_number)\n        for layer_chunk in layers(T1w, layer_size):\n            layer_chunk = list(map(average, zip(*layer_chunk)))\n            new_T1w.append(layer_chunk)\n        adjuster2(new_T1w, layer_number)\n\n        T1wCE_list = os.listdir(data_dir + p + '/T1wCE/')\n        T1wCE_list.sort(key = lambda x : int(pydicom.read_file(data_dir + p + '/T1wCE/'+ x).ImagePositionPatient[2]))\n        T1wCE = [\n            cv2.resize(pydicom.read_file(data_dir + p + '/T1wCE/'+ layer).pixel_array,(64,64)) \n            for layer in T1wCE_list]\n\n        new_T1wCE = []\n        T1wCE=adjuster(T1wCE)\n        layer_size = decider(len(T1wCE) , layer_number)\n        for layer_chunk in layers(T1wCE, layer_size):\n            layer_chunk = list(map(average, zip(*layer_chunk)))\n            new_T1wCE.append(layer_chunk)\n\n        adjuster2(new_T1wCE, layer_number)\n\n        T2w_list = os.listdir(data_dir + p + '/T2w/')\n        T2w_list.sort(key = lambda x : int(pydicom.read_file(data_dir + p + '/T2w/'+ x).ImagePositionPatient[2]))\n        T2w = [\n            cv2.resize(pydicom.read_file(data_dir + p + '/T2w/'+ layer).pixel_array,(64,64)) \n            for layer in T2w_list]\n\n        new_T2w=[]\n        T2w=adjuster(T2w)\n        layer_size = decider(len(T2w) , layer_number)\n        for layer_chunk in layers(T2w, layer_size):\n            layer_chunk = list(map(average, zip(*layer_chunk)))\n            new_T2w.append(layer_chunk)\n\n        adjuster2(new_T2w, layer_number)\n\n        for i in range(0,layer_number):\n            x=[]\n            for j in range(64):\n                y =[]\n                for k in range(64):\n                    channel=[]\n                    channel.append(new_flair[i][j][k])\n                    channel.append(new_T1w[i][j][k])\n                    channel.append(new_T1wCE[i][j][k])\n                    channel.append(new_T2w[i][j][k])\n                    y.append(channel)\n                x.append(y)\n            scan.append(np.array(x))\n        Input_Values.append(scan)\n        print(str(c))\n        c+=1\n\nnp.shape(Input_Values)","metadata":{"execution":{"iopub.status.busy":"2021-10-13T08:16:19.584873Z","iopub.execute_input":"2021-10-13T08:16:19.585149Z","iopub.status.idle":"2021-10-13T08:16:33.524028Z","shell.execute_reply.started":"2021-10-13T08:16:19.585104Z","shell.execute_reply":"2021-10-13T08:16:33.523346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv')\ndf = df.drop([71,81,488])\nOutput = df['MGMT_value']\n\nOutput_Values = []\nfor i in range(585):\n    if i != 71 and i != 81 and i != 488:\n        Output_Values.append(Output[i])\nOutput_Values = np.reshape(Output_Values,(582,1))\nprint(np.shape(Output_Values))","metadata":{"execution":{"iopub.status.busy":"2021-10-12T23:26:44.702346Z","iopub.execute_input":"2021-10-12T23:26:44.702926Z","iopub.status.idle":"2021-10-12T23:26:44.718877Z","shell.execute_reply.started":"2021-10-12T23:26:44.702889Z","shell.execute_reply":"2021-10-12T23:26:44.717794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Input_Values = np.load('../input/rsna-competition/Input_Values_64x64.npy')\nnp.save('./Input_Values',Input_Values)\nInput_Values = np.array(Input_Values)\nOutput_Values = np.array(Output_Values)\nprint(np.shape(Input_Values))\nprint(np.shape(Output_Values))","metadata":{"execution":{"iopub.status.busy":"2021-10-12T22:42:52.97101Z","iopub.execute_input":"2021-10-12T22:42:52.971321Z","iopub.status.idle":"2021-10-12T22:42:53.371314Z","shell.execute_reply.started":"2021-10-12T22:42:52.971288Z","shell.execute_reply":"2021-10-12T22:42:53.370546Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.layers import Conv3D, MaxPooling3D, BatchNormalization, Activation, Dropout, Flatten, Dense, GlobalAveragePooling3D\nfrom tensorflow.keras.models import Sequential, load_model\nimport matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2021-10-12T22:42:53.372492Z","iopub.execute_input":"2021-10-12T22:42:53.373219Z","iopub.status.idle":"2021-10-12T22:42:53.378815Z","shell.execute_reply.started":"2021-10-12T22:42:53.373179Z","shell.execute_reply":"2021-10-12T22:42:53.37764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv3D(64, (3, 3, 3), activation = \"relu\", input_shape=(16, 64, 64, 4)))\nmodel.add(MaxPooling3D(pool_size=(2, 2, 2)))\nmodel.add(BatchNormalization())\n#model.add(Dropout(0.5))\nmodel.add(Conv3D(128, (3, 3, 3), activation = \"relu\"))\nmodel.add(MaxPooling3D(pool_size=(1, 2, 2)))\nmodel.add(BatchNormalization())\n#model.add(Dropout(0.5))\nmodel.add(Conv3D(32, (2, 3, 3), activation = \"relu\"))\nmodel.add(MaxPooling3D(pool_size=(1, 2, 2)))\nmodel.add(BatchNormalization())\n#model.add(Dropout(0.5))\nmodel.add(Conv3D(64, (2, 3, 3), activation = \"relu\"))#model.add(MaxPooling3D(pool_size=(1, 2, 2)))\nmodel.add(BatchNormalization())\n#model.add(Conv3D(64, (2, 3, 3), activation = \"relu\"))\n#model.add(MaxPooling3D(pool_size=(1, 2, 2)))\n#model.add(BatchNormalization())\nmodel.add(GlobalAveragePooling3D())\nmodel.add(Dense(64,  activation = \"relu\" ))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(1, activation = \"sigmoid\" ))\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-10-13T00:10:30.427863Z","iopub.execute_input":"2021-10-13T00:10:30.42812Z","iopub.status.idle":"2021-10-13T00:10:30.553847Z","shell.execute_reply.started":"2021-10-13T00:10:30.428092Z","shell.execute_reply":"2021-10-13T00:10:30.553121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"opt = tf.keras.optimizers.SGD(learning_rate=0.0003)\nmodel.compile( loss='binary_crossentropy' , metrics=['accuracy'], optimizer=opt)","metadata":{"execution":{"iopub.status.busy":"2021-10-12T22:42:53.461829Z","iopub.execute_input":"2021-10-12T22:42:53.462274Z","iopub.status.idle":"2021-10-12T22:42:53.473852Z","shell.execute_reply.started":"2021-10-12T22:42:53.462231Z","shell.execute_reply":"2021-10-12T22:42:53.473142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(Input_Values,Output_Values,validation_split=0.10, epochs=150, batch_size=32)\n\nprint(history.history.keys())\n\nplt.plot(history.history['accuracy'])\nplt.plot(history.history['val_accuracy'])\nplt.title('Model Accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['Training set', 'Validation set'], loc='upper left')\nplt.show()\n\nplt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title('Model Loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['Training set', 'Validation set'], loc='upper left')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-12T22:42:53.475142Z","iopub.execute_input":"2021-10-12T22:42:53.475581Z","iopub.status.idle":"2021-10-12T22:49:28.842693Z","shell.execute_reply.started":"2021-10-12T22:42:53.475544Z","shell.execute_reply":"2021-10-12T22:49:28.841987Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('./Model6')","metadata":{"execution":{"iopub.status.busy":"2021-10-12T22:49:28.844202Z","iopub.execute_input":"2021-10-12T22:49:28.844486Z","iopub.status.idle":"2021-10-12T22:49:28.848898Z","shell.execute_reply.started":"2021-10-12T22:49:28.844451Z","shell.execute_reply":"2021-10-12T22:49:28.848031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dir = \"../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/\"\ntest = os.listdir(test_dir)\ntest.sort()\n\nlayer_number=16\nc=1\nTest_Values = []\nfor p in test[:]:\n    scan=[]\n\n    flair_list = os.listdir(test_dir + p + '/FLAIR/')\n    flair_list.sort(key = lambda x : int(pydicom.read_file(test_dir + p + '/FLAIR/'+ x).ImagePositionPatient[2]))\n    flair = [\n        cv2.resize(pydicom.read_file(test_dir + p + '/FLAIR/'+ layer).pixel_array,(64,64)) \n        for layer in flair_list ]\n\n    new_flair=[]\n    flair = adjuster(flair)\n    layer_size = decider(len(flair) , layer_number)\n    for layer_chunk in layers(flair, layer_size):\n        layer_chunk = list(map(average, zip(*layer_chunk)))\n        new_flair.append(layer_chunk)\n    adjuster2(new_flair, layer_number)\n\n    T1w_list = os.listdir(test_dir + p + '/T1w/')\n    T1w_list.sort(key = lambda x : int(pydicom.read_file(test_dir + p + '/T1w/'+ x).ImagePositionPatient[2]))\n    T1w = [\n        cv2.resize(pydicom.read_file(test_dir + p + '/T1w/'+ layer).pixel_array,(64,64)) \n        for layer in T1w_list]\n\n    new_T1w = []\n    T1w=adjuster(T1w)\n    layer_size = decider(len(T1w) , layer_number)\n    for layer_chunk in layers(T1w, layer_size):\n        layer_chunk = list(map(average, zip(*layer_chunk)))\n        new_T1w.append(layer_chunk)\n    adjuster2(new_T1w, layer_number)\n\n    T1wCE_list = os.listdir(test_dir + p + '/T1wCE/')\n    T1wCE_list.sort(key = lambda x : int(pydicom.read_file(test_dir + p + '/T1wCE/'+ x).ImagePositionPatient[2]))\n    T1wCE = [\n        cv2.resize(pydicom.read_file(test_dir + p + '/T1wCE/'+ layer).pixel_array,(64,64)) \n        for layer in T1wCE_list]\n\n    new_T1wCE = []\n    T1wCE=adjuster(T1wCE)\n    layer_size = decider(len(T1wCE) , layer_number)\n    for layer_chunk in layers(T1wCE, layer_size):\n        layer_chunk = list(map(average, zip(*layer_chunk)))\n        new_T1wCE.append(layer_chunk)\n\n    adjuster2(new_T1wCE, layer_number)\n\n    T2w_list = os.listdir(test_dir + p + '/T2w/')\n    T2w_list.sort(key = lambda x : int(pydicom.read_file(test_dir + p + '/T2w/'+ x).ImagePositionPatient[2]))\n    T2w = [\n        cv2.resize(pydicom.read_file(test_dir + p + '/T2w/'+ layer).pixel_array,(64,64)) \n        for layer in T2w_list]\n\n    new_T2w=[]\n    T2w=adjuster(T2w)\n    layer_size = decider(len(T2w) , layer_number)\n    for layer_chunk in layers(T2w, layer_size):\n        layer_chunk = list(map(average, zip(*layer_chunk)))\n        new_T2w.append(layer_chunk)\n\n    adjuster2(new_T2w, layer_number)\n\n    for i in range(0,layer_number):\n        x=[]\n        for j in range(64):\n            y =[]\n            for k in range(64):\n                channel=[]\n                channel.append(new_flair[i][j][k])\n                channel.append(new_T1w[i][j][k])\n                channel.append(new_T1wCE[i][j][k])\n                channel.append(new_T2w[i][j][k])\n                y.append(channel)\n            x.append(y)\n        scan.append(np.array(x))\n    Test_Values.append(scan)\n    print(str(c))\n    c+=1\n\nTest_Values = np.array(Test_Values)\nnp.shape(Test_Values)","metadata":{"execution":{"iopub.status.busy":"2021-10-13T08:27:55.996031Z","iopub.execute_input":"2021-10-13T08:27:55.996451Z","iopub.status.idle":"2021-10-13T08:28:09.094554Z","shell.execute_reply.started":"2021-10-13T08:27:55.996415Z","shell.execute_reply":"2021-10-13T08:28:09.093912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.save('./Test_Values',Test_Values)","metadata":{"execution":{"iopub.status.busy":"2021-10-12T22:49:28.850365Z","iopub.execute_input":"2021-10-12T22:49:28.85073Z","iopub.status.idle":"2021-10-12T22:49:28.860742Z","shell.execute_reply.started":"2021-10-12T22:49:28.850694Z","shell.execute_reply":"2021-10-12T22:49:28.85956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Results = model.predict(Test_Values)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.DataFrame(columns=['BraTS21ID','MGMT_value'])\nsub.loc[:,'BraTS21ID'] = test\nsub.loc[:,'MGMT_value'] = Results\nsub.set_index('BraTS21ID', inplace = True)\nsub.to_csv('./submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-10-13T00:03:18.151264Z","iopub.execute_input":"2021-10-13T00:03:18.151722Z","iopub.status.idle":"2021-10-13T00:03:18.183396Z","shell.execute_reply.started":"2021-10-13T00:03:18.151674Z","shell.execute_reply":"2021-10-13T00:03:18.182365Z"},"trusted":true},"execution_count":null,"outputs":[]}]}