{"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":"!cp -r ../input/pytorch-segmentation-models-lib/ ./\n!pip config set global.disable-pip-version-check true\n!pip install -q ./pytorch-segmentation-models-lib/pretrainedmodels-0.7.4/pretrainedmodels-0.7.4\n!pip install -q ./pytorch-segmentation-models-lib/efficientnet_pytorch-0.6.3/efficientnet_pytorch-0.6.3\n!pip install -q ./pytorch-segmentation-models-lib/timm-0.4.12-py3-none-any.whl\n!pip install -q ./pytorch-segmentation-models-lib/segmentation_models_pytorch-0.2.0-py3-none-any.whl","metadata":{"execution":{"iopub.status.busy":"2022-06-30T05:19:26.287018Z","iopub.execute_input":"2022-06-30T05:19:26.289522Z","iopub.status.idle":"2022-06-30T05:20:11.489537Z","shell.execute_reply.started":"2022-06-30T05:19:26.289274Z","shell.execute_reply":"2022-06-30T05:20:11.488407Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nimport tifffile as tiff\nimport cv2\nimport os\nimport gc\nfrom tqdm.notebook import tqdm\nimport rasterio\nfrom rasterio.windows import Window\nimport segmentation_models_pytorch as smp\nfrom fastai.vision.all import *\nfrom torch.utils.data import Dataset, DataLoader\nfrom skimage import io,img_as_float,transform\n# import sys\n# sys.path.append(\"../input/timm-pytorch-image-models/pytorch-image-models-master\")\n# import timm\n# sys.path.append(\"../input/timm-pytorch-image-models/pytorch-image-models-master\")\n# import timm\n# sys.path.append(\"../input/segmentation-models-pytorch/segmentation_models.pytorch\")\n# import segmentation_models_pytorch as smp\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2022-06-30T05:23:33.231818Z","iopub.execute_input":"2022-06-30T05:23:33.23219Z","iopub.status.idle":"2022-06-30T05:23:42.666186Z","shell.execute_reply.started":"2022-06-30T05:23:33.232159Z","shell.execute_reply":"2022-06-30T05:23:42.665171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_grid(idx,crop= False,train_directory = False):\n    '''\n    idx = 11\n    img_t = np.transpose(output[idx].to(torch.uint8).numpy(),(1,2,0))\n    print(img_t.dtype)\n    plt.imshow(img_t)\n    \n    return a tensor of shape = (no_of_image,3,grid_w,grid_h) and dtype torch.float32\n    '''\n    if not train_directory:\n        img = io.imread(f\"../input/hubmap-organ-segmentation/test_images/{idx}.tiff\")\n    else:\n        img = io.imread(f\"../input/hubmap-organ-segmentation/train_images/{idx}.tiff\")\n        \n    img = transform.resize(img,(2560,2560))\n\n    \n    if crop:\n        img = img[250:-250,250:-250,:]\n        \n    img_h,img_w = img.shape[0],img.shape[1]\n    \n    img = torch.tensor(np.transpose(img,(2,0,1))).unsqueeze(0).to(torch.float32)\n\n    grid_h,grid_w = 256,256\n    number_of_images = (img_h/grid_h)*(img_w/grid_w)\n    \n    unfold = torch.nn.Unfold(kernel_size = (grid_h,grid_w),stride = (grid_h,grid_w))\n\n    output = torch.transpose(unfold(img),2,1).reshape([1,int(number_of_images),3,grid_h,grid_w]).squeeze()\n\n    return output","metadata":{"execution":{"iopub.status.busy":"2022-06-30T05:23:42.668294Z","iopub.execute_input":"2022-06-30T05:23:42.668998Z","iopub.status.idle":"2022-06-30T05:23:42.679188Z","shell.execute_reply.started":"2022-06-30T05:23:42.66896Z","shell.execute_reply":"2022-06-30T05:23:42.678306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_df = pd.read_csv(\"../input/hubmap-organ-segmentation/train.csv\") \ntest_df = pd.read_csv(\"../input/hubmap-organ-segmentation/test.csv\")\n# test_df = train_df.head()\n# test_df.shape","metadata":{"execution":{"iopub.status.busy":"2022-06-30T05:23:42.680613Z","iopub.execute_input":"2022-06-30T05:23:42.681354Z","iopub.status.idle":"2022-06-30T05:23:42.702697Z","shell.execute_reply.started":"2022-06-30T05:23:42.681312Z","shell.execute_reply":"2022-06-30T05:23:42.701856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model():\n    model = smp.DeepLabV3Plus(encoder_name='timm-efficientnet-b2', \n                          encoder_depth=5, \n                          encoder_weights=None, \n                          encoder_output_stride=16, \n                          decoder_channels=256, \n                          decoder_atrous_rates=(12, 24, 36), \n                          in_channels=3, \n                          classes=1, \n                          activation=None, \n                          upsampling=4, \n                          aux_params=None).to(\"cuda\")\n    return model","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"PATH = \"../input/experiment-model-dumps-hubmap/model-0epoch-13.pth\"\nmodel = get_model()\nmodel.load_state_dict(torch.load(PATH))","metadata":{"execution":{"iopub.status.busy":"2022-06-30T05:23:42.704697Z","iopub.execute_input":"2022-06-30T05:23:42.705038Z","iopub.status.idle":"2022-06-30T05:23:43.053503Z","shell.execute_reply.started":"2022-06-30T05:23:42.705004Z","shell.execute_reply":"2022-06-30T05:23:43.052334Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def mask2enc(mask, n=1):\n    pixels = mask.T.flatten()\n    encs = []\n    for i in range(1,n+1):\n        p = (pixels == i).astype(np.int8)\n        if p.sum() == 0: encs.append(np.nan)\n        else:\n            p = np.concatenate([[0], p, [0]])\n            runs = np.where(p[1:] != p[:-1])[0] + 1\n            runs[1::2] -= runs[::2]\n            encs.append(' '.join(str(x) for x in runs))\n    return encs","metadata":{"execution":{"iopub.status.busy":"2022-06-29T19:29:08.812919Z","iopub.execute_input":"2022-06-29T19:29:08.813285Z","iopub.status.idle":"2022-06-29T19:29:08.822712Z","shell.execute_reply.started":"2022-06-29T19:29:08.81325Z","shell.execute_reply":"2022-06-29T19:29:08.821864Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle_encode_less_memory(img):\n    #the image should be transposed\n    pixels = img.T.flatten()\n    \n    # This simplified method requires first and last pixel to be zero\n    pixels[0] = 0\n    pixels[-1] = 0\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 2\n    runs[1::2] -= runs[::2]\n    \n    return ' '.join(str(x) for x in runs)","metadata":{"execution":{"iopub.status.busy":"2022-06-29T19:29:08.824315Z","iopub.execute_input":"2022-06-29T19:29:08.824998Z","iopub.status.idle":"2022-06-29T19:29:08.83909Z","shell.execute_reply.started":"2022-06-29T19:29:08.82495Z","shell.execute_reply":"2022-06-29T19:29:08.838104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %%timeit -r1 -n1\n\n\n# masks = None\n# rles = []\n# for idx,row in test_df.iterrows():\n#     op = make_grid(int(row['id']),train_directory = True).to('cuda')\n#     masks = model(op)\n#     m = masks\n#     m = m.reshape(10,10,1,256,256)\n#     rows = []\n#     for i in range(10):\n#         row = [m[i][j] for j in range(10)]\n#         rows.append(torch.concat(row,dim = 2))\n#     final_mask = torch.concat(rows,dim = 1)\n#     final_mask = torch.nn.Sigmoid()(final_mask)\n#     final_mask = final_mask.squeeze().detach().to('cpu').numpy()\n#     final_mask = final_mask>0.5\n#     rleee = mask2enc(final_mask) \n#     rles.append(rleee[0])","metadata":{"execution":{"iopub.status.busy":"2022-06-29T19:29:08.840328Z","iopub.execute_input":"2022-06-29T19:29:08.840585Z","iopub.status.idle":"2022-06-29T19:29:08.849403Z","shell.execute_reply.started":"2022-06-29T19:29:08.840561Z","shell.execute_reply":"2022-06-29T19:29:08.848291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %%timeit -r1 -n1\n\nmasks = None\nrles = []\nfor idx,row in test_df.iterrows():\n    op = make_grid(int(row['id']),train_directory = False).to('cuda')\n    masks = model(op)\n    m = masks\n    m = m.reshape(10,10,1,256,256)\n    rows = []\n    for i in range(10):\n        row = [m[i][j] for j in range(10)]\n        rows.append(torch.concat(row,dim = 2))\n    final_mask = torch.concat(rows,dim = 1)\n    final_mask = torch.nn.Sigmoid()(final_mask)\n    final_mask = final_mask.squeeze().detach().to('cpu').numpy()\n    \n    final_mask = transform.resize(final_mask,(2560,2560))\n    final_mask = final_mask>0.5\n    \n    rleee = rle_encode_less_memory(final_mask) \n    rles.append(rleee)","metadata":{"execution":{"iopub.status.busy":"2022-06-29T19:29:08.853887Z","iopub.execute_input":"2022-06-29T19:29:08.854728Z","iopub.status.idle":"2022-06-29T19:29:16.913533Z","shell.execute_reply.started":"2022-06-29T19:29:08.854677Z","shell.execute_reply":"2022-06-29T19:29:16.911923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(rles)","metadata":{"execution":{"iopub.status.busy":"2022-06-29T19:29:16.91462Z","iopub.status.idle":"2022-06-29T19:29:16.915662Z","shell.execute_reply.started":"2022-06-29T19:29:16.91541Z","shell.execute_reply":"2022-06-29T19:29:16.915435Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df['rle'] = rles\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-06-29T19:29:16.916891Z","iopub.status.idle":"2022-06-29T19:29:16.917744Z","shell.execute_reply.started":"2022-06-29T19:29:16.917507Z","shell.execute_reply":"2022-06-29T19:29:16.917531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-06-29T19:29:16.919219Z","iopub.status.idle":"2022-06-29T19:29:16.920061Z","shell.execute_reply.started":"2022-06-29T19:29:16.919788Z","shell.execute_reply":"2022-06-29T19:29:16.919812Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = test_df[[\"id\", \"rle\"]]\ntest_df.to_csv(\"submission.csv\", index=False)\ndisplay(test_df)","metadata":{"execution":{"iopub.status.busy":"2022-06-29T19:29:16.921491Z","iopub.status.idle":"2022-06-29T19:29:16.922041Z","shell.execute_reply.started":"2022-06-29T19:29:16.921775Z","shell.execute_reply":"2022-06-29T19:29:16.921798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}