{"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 re\nimport cv2\nimport sys\nimport glob\nimport time\nimport shutil\nimport random\nimport pydicom\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nfrom tqdm import tqdm\n# import nibabel as nib\nimport SimpleITK as sitk\nimport matplotlib.pyplot as plt\n# from statistics import mean, median, mode","metadata":{"execution":{"iopub.status.busy":"2021-08-19T17:31:33.288003Z","iopub.execute_input":"2021-08-19T17:31:33.288295Z","iopub.status.idle":"2021-08-19T17:31:35.005117Z","shell.execute_reply.started":"2021-08-19T17:31:33.288230Z","shell.execute_reply":"2021-08-19T17:31:35.004079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DATA_PATH = '../input/rsna-miccai-brain-tumor-radiogenomic-classification'\n\nIMG_DIM = 512\nNUM_SLICES = 64\nmri_types = ['FLAIR','T1wCE','T2w']","metadata":{"execution":{"iopub.status.busy":"2021-08-19T17:31:35.008945Z","iopub.execute_input":"2021-08-19T17:31:35.009246Z","iopub.status.idle":"2021-08-19T17:31:35.013940Z","shell.execute_reply.started":"2021-08-19T17:31:35.009215Z","shell.execute_reply":"2021-08-19T17:31:35.012858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"reader = sitk.ImageSeriesReader()\nreader.LoadPrivateTagsOn()\ndef get_sitk(path):\n    filenamesDICOM = reader.GetGDCMSeriesFileNames(path)\n    reader.SetFileNames(filenamesDICOM)\n    return reader.Execute()\n\nresampler = sitk.ResampleImageFilter()\nresampler.SetInterpolator(sitk.sitkLinear)\ndef resample(image, ref_image):\n    resampler.SetReferenceImage(ref_image)\n    resampler.SetTransform(sitk.AffineTransform(image.GetDimension()))\n    resampler.SetOutputSpacing(ref_image.GetSpacing())\n    resampler.SetSize(ref_image.GetSize())\n    resampler.SetOutputDirection(ref_image.GetDirection())\n    resampler.SetOutputOrigin(ref_image.GetOrigin())\n    resampler.SetDefaultPixelValue(image.GetPixelIDValue())\n    resamped_image = resampler.Execute(image)\n    return resamped_image\n\ndef normalize(data):\n    return (data - np.min(data)) / (np.max(data) - np.min(data))\n\ndef img_norm(img):\n    '''\n    Input : image as a numpy array\n    Output : normalized and resized image with pad and aspect ratio preserved\n    '''\n    ratio = IMG_DIM/max(img.shape)\n    lst = [round(x*ratio) for x in img.shape]\n    new_size = lst[::-1]\n    pad = [abs((x-IMG_DIM)//2) for x in new_size]\n    pad = [i for i in pad if i != 0]\n    img = cv2.resize(img, tuple(new_size), interpolation=cv2.INTER_LANCZOS4)\n    if img.shape[0] < img.shape[1]:\n        if img.shape[0]%2 == 0 and img.shape[1]%2 == 0:\n            return cv2.copyMakeBorder(img, pad[0], pad[0], 0, 0, cv2.BORDER_CONSTANT, value=0)\n        else:\n            return cv2.copyMakeBorder(img, pad[0], pad[0]-1, 0, 0, cv2.BORDER_CONSTANT, value=0)\n    elif img.shape[0] > img.shape[1]:\n        if img.shape[0]%2 == 0 and img.shape[1]%2 == 0:\n            return cv2.copyMakeBorder(img, 0, 0, pad[0], pad[0], cv2.BORDER_CONSTANT, value=0)\n        else:\n            return cv2.copyMakeBorder(img, 0, 0, pad[0], pad[0]-1, cv2.BORDER_CONSTANT, value=0)\n    else:\n        return img\n\ndef gen_3d_array(scan_id, num_imgs=NUM_SLICES, img_size=IMG_DIM, mri_type=mri_types[0], ref_type='T1w', split='train'):\n    reference = get_sitk(f'{DATA_PATH}/{split}/{scan_id}/{ref_type}')\n    mri = get_sitk(f'{DATA_PATH}/{split}/{scan_id}/{mri_type}')\n    mri_res = resample(mri, reference)\n    mri_res = normalize(sitk.GetArrayFromImage(mri_res))\n    mri_re = np.zeros((mri_res.shape[0], img_size, img_size), dtype=np.float16)\n    for j in range(mri_res.shape[0]):\n        mri_re[j] = img_norm(mri_res[j])\n#         mri_re[j] = cv2.resize(img_norm(mri_res[j]), (img_size, img_size))\n    mri_re = mri_re.transpose(1,2,0)\n    middle = mri_re.shape[-1]//2\n    num_imgs2 = num_imgs//2\n    if mri_re.shape[-1] < num_imgs:\n        n_zero = np.zeros((img_size, img_size, num_imgs - mri_re.shape[-1]))\n        mri_re = np.concatenate((mri_re,  n_zero), axis = -1)\n    elif mri_re.shape[-1] > num_imgs:\n        mri_re = mri_re[:, :, middle-num_imgs2: middle+num_imgs2]\n    mri_re = mri_re - np.min(mri_re)\n    mri_re = mri_re / np.max(mri_re)\n#     mri_re = (mri_re * 255).astype(np.uint8)\n    return np.expand_dims(mri_re, 0)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-08-19T17:31:35.015317Z","iopub.execute_input":"2021-08-19T17:31:35.015620Z","iopub.status.idle":"2021-08-19T17:31:35.046825Z","shell.execute_reply.started":"2021-08-19T17:31:35.015590Z","shell.execute_reply":"2021-08-19T17:31:35.046089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def ignore_files(dir, files):\n    return [f for f in files if os.path.isfile(os.path.join(dir, f))]\nshutil.copytree('../input/rsna-miccai-brain-tumor-radiogenomic-classification/train',\n                './train', ignore=ignore_files)\nshutil.copytree('../input/rsna-miccai-brain-tumor-radiogenomic-classification/test',\n                './test', ignore=ignore_files)","metadata":{"execution":{"iopub.status.busy":"2021-08-19T17:31:35.047991Z","iopub.execute_input":"2021-08-19T17:31:35.048529Z","iopub.status.idle":"2021-08-19T17:32:59.797387Z","shell.execute_reply.started":"2021-08-19T17:31:35.048489Z","shell.execute_reply":"2021-08-19T17:32:59.796340Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dirs = sorted(os.listdir(f'{DATA_PATH}/train/'))\nfor i, path in enumerate(train_dirs):\n    BASE_PATH = f'./train/{path}'\n    for mri_type in mri_types:\n        num_arr = gen_3d_array(path, mri_type=mri_type)\n#         print(num_arr.dtype, sys.getsizeof(num_arr))\n        file_name = f'{mri_type}'\n        np.savez_compressed(os.path.join(BASE_PATH, file_name), num_arr, allow_pickle=False)\n#     print(path)\n#     if i == 2:\n#         break","metadata":{"execution":{"iopub.status.busy":"2021-08-19T17:32:59.798666Z","iopub.execute_input":"2021-08-19T17:32:59.799235Z","iopub.status.idle":"2021-08-19T17:33:46.953498Z","shell.execute_reply.started":"2021-08-19T17:32:59.799191Z","shell.execute_reply":"2021-08-19T17:33:46.952222Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dirs = sorted(os.listdir(f'{DATA_PATH}/test/'))\nfor i, path in enumerate(test_dirs):\n    BASE_PATH = f'./test/{path}'\n    for mri_type in mri_types:\n        num_arr = gen_3d_array(path, mri_type=mri_type, split='test')\n#         print(num_arr.dtype, sys.getsizeof(num_arr))\n        file_name = f'{mri_type}'\n        np.savez_compressed(os.path.join(BASE_PATH, file_name), num_arr, allow_pickle=False)\n#     print(path)\n#     if i == 2:\n#         break","metadata":{"execution":{"iopub.status.busy":"2021-08-19T17:33:46.954767Z","iopub.execute_input":"2021-08-19T17:33:46.955129Z"}},"execution_count":null,"outputs":[]}]}