{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":61446,"databundleVersionId":6962461,"sourceType":"competition"},{"sourceType":"kernelVersion","sourceId":147979963}],"dockerImageVersionId":30587,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport gc\nimport glob\nimport torch\nimport numpy as np\nimport cv2\nimport tqdm\n\nTESTING = True\n\ndef load_volume(dataset):\n    path = os.path.join(dataset, \"labels\", \"*.tif\")\n    dataset = sorted(glob.glob(path))\n    volume = None\n    target = None\n\n    for z, path in enumerate(tqdm.tqdm(dataset)):\n        label = cv2.imread(path, cv2.IMREAD_ANYDEPTH)\n        label = np.array(label,dtype=np.uint8)\n        if target is None:\n            target = np.zeros((len(dataset), *label.shape[-2:]), dtype=np.uint8)\n        if volume is None:\n            volume = np.zeros((len(dataset), *label.shape[-2:]), dtype=np.uint16)\n        target[z] = label\n        \n        path = path.replace(\"/labels/\",\"/images/\")\n        path = path.replace(\"kidney_3_dense\",\"kidney_3_sparse\")\n        image = cv2.imread(path, cv2.IMREAD_ANYDEPTH)\n        image = np.array(image,dtype=np.uint16)\n        volume[z] = image\n    return volume, target\n\n\ndef save_volume(volume, target, dataset):\n    if not os.path.exists(dataset): os.mkdir(dataset)\n    if not os.path.exists(os.path.join(dataset, \"labels\")): os.mkdir(os.path.join(dataset, \"labels\"))\n    if not os.path.exists(os.path.join(dataset, \"images\")): os.mkdir(os.path.join(dataset, \"images\"))\n        \n    for z in tqdm.tqdm(range(volume.shape[0])):       \n        cv2.imwrite(os.path.join(dataset, \"images\",f\"{z:04d}.tif\"), volume[z])\n        cv2.imwrite(os.path.join(dataset, \"labels\",f\"{z:04d}.tif\"), target[z])\n        \n\nfor dataset in (\"/kaggle/input/blood-vessel-segmentation/train/kidney_1_dense\", ):\n    dataset_xz = dataset + \"_xz\"\n    dataset_zy = dataset + \"_zy\"\n    skip_xz = os.path.exists(dataset_xz) \n    skip_zy = os.path.exists(dataset_zy)\n    if not skip_xz or not skip_zy:\n        print(\"load\",dataset)\n        volume, target = load_volume(dataset)\n    if not skip_xz:\n        print(\"save\",dataset_xz)\n        volume_xz, target_xz = volume.transpose((1,2,0)), target.transpose((1,2,0))\n        if not TESTING: save_volume(volume_xz, target_xz, dataset_xz)\n    else:\n        print(\"skipping\", dataset_xz)\n    if not skip_zy:\n        print(\"save\", dataset_zy)\n        volume_zy, target_zy = volume.transpose(2,0,1), target.transpose(2,0,1)\n        if not TESTING: save_volume(volume_zy, target_zy, dataset_zy)\n    else:\n        print(\"skipping\", dataset_zy)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-20T00:07:04.124266Z","iopub.execute_input":"2023-11-20T00:07:04.124653Z","iopub.status.idle":"2023-11-20T00:09:51.348569Z","shell.execute_reply.started":"2023-11-20T00:07:04.124621Z","shell.execute_reply":"2023-11-20T00:09:51.347306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# inline works with torch tensors\nimport inline\n\n# Visualize the volume\nt_xy = torch.from_numpy((target.argmax(0) / target.shape[0]).astype(np.float32))\nt_xy[-1] = 1\ninline.plot(t_xy, \"XY\")","metadata":{"execution":{"iopub.status.busy":"2023-11-20T00:09:51.351051Z","iopub.execute_input":"2023-11-20T00:09:51.351428Z","iopub.status.idle":"2023-11-20T00:10:37.816423Z","shell.execute_reply.started":"2023-11-20T00:09:51.351393Z","shell.execute_reply":"2023-11-20T00:10:37.814931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot single slice\ninline.plot(torch.from_numpy(volume[500]/65535).float())\n\n# Plot 32 slices for XZ and ZY\ninline.plot(torch.from_numpy(volume_xz[500:532]/65535).float())\ninline.plot(torch.from_numpy(volume_zy[500:532]/65535).float())","metadata":{"execution":{"iopub.status.busy":"2023-11-20T00:13:01.416512Z","iopub.execute_input":"2023-11-20T00:13:01.417419Z","iopub.status.idle":"2023-11-20T00:13:13.628197Z","shell.execute_reply.started":"2023-11-20T00:13:01.417380Z","shell.execute_reply":"2023-11-20T00:13:13.626869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}