{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":52279,"databundleVersionId":5822112,"sourceType":"competition"},{"sourceId":7078094,"sourceType":"datasetVersion","datasetId":3876808}],"dockerImageVersionId":30559,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!mkdir pip_packages\n!cp /kaggle/input/hubmap/pip_packages/pip_packages/*.whl /kaggle/working/pip_packages\n!cp -r /kaggle/input/hubmap/Pytorch-UNet/Pytorch-UNet /kaggle/working\n!pip install pycocotools --no-index --find-links=file:///kaggle/working/pip_packages","metadata":{"execution":{"iopub.status.busy":"2023-11-28T11:32:02.583006Z","iopub.execute_input":"2023-11-28T11:32:02.583367Z","iopub.status.idle":"2023-11-28T11:32:45.500037Z","shell.execute_reply.started":"2023-11-28T11:32:02.583338Z","shell.execute_reply":"2023-11-28T11:32:45.499063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nos.chdir(\"/kaggle/working/Pytorch-UNet\")\n\nimport cv2\nimport zlib\nimport base64\nimport torch\nimport numpy as np\nfrom PIL import Image\nimport torch.nn.functional as F\nimport pandas as pd\nimport typing as t\nfrom pycocotools import _mask as coco_mask\nfrom unet import UNet\nfrom utils.data_loading import BasicDataset\n\n\ndef predict_img(net,\n                full_img,\n                device,\n                scale_factor=1,\n                out_threshold=0.5):\n    net.eval()\n    img = torch.from_numpy(BasicDataset.preprocess(None, full_img, scale_factor, is_mask=False))\n    img = img.unsqueeze(0)\n    img = img.to(device=device, dtype=torch.float32)\n\n    with torch.no_grad():\n        output = net(img).cpu()\n        output = F.interpolate(output, (full_img.size[1], full_img.size[0]), mode='bilinear')\n        if net.n_classes > 1:\n            mask = output.argmax(dim=1)\n        else:\n            mask = torch.sigmoid(output) > out_threshold\n\n    return mask[0].long().squeeze().cpu().numpy()\n\ndef encode_binary_mask(mask: np.ndarray) -> t.Text:\n  # check input mask --\n  if mask.dtype != bool:\n    raise ValueError(\n        \"encode_binary_mask expects a binary mask, received dtype == %s\" %\n        mask.dtype)\n\n  mask = np.squeeze(mask)\n  if len(mask.shape) != 2:\n    raise ValueError(\n        \"encode_binary_mask expects a 2d mask, received shape == %s\" %\n        mask.shape)\n\n  # convert input mask to expected COCO API input --\n  mask_to_encode = mask.reshape(mask.shape[0], mask.shape[1], 1)\n  mask_to_encode = mask_to_encode.astype(np.uint8)\n  mask_to_encode = np.asfortranarray(mask_to_encode)\n\n  # RLE encode mask --\n  encoded_mask = coco_mask.encode(mask_to_encode)[0][\"counts\"]\n\n  # compress and base64 encoding --\n  binary_str = zlib.compress(encoded_mask, zlib.Z_BEST_COMPRESSION)\n  base64_str = base64.b64encode(binary_str)\n  return base64_str.decode('utf-8')\n\nmodel = \"/kaggle/input/hubmap/pyunet.pth\"\nTEST_DIR = \"/kaggle/input/hubmap-hacking-the-human-vasculature/test\"\nmask_threshold = 0.5\nPROB_THRESHOLD = 0.7\nPIXEL_THRESHOLD = 10\nCONFD_THRESHOLD = 0.7\n\nnet = UNet(n_channels=3, n_classes=2)\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nnet.to(device=device)\nstate_dict = torch.load(model, map_location=device)\nmask_values = state_dict.pop('mask_values', [0, 1])\nnet.load_state_dict(state_dict)\n\noutput_data = []\nfor filename in os.listdir(TEST_DIR):\n    img = Image.open(os.path.join(TEST_DIR, filename))\n    pr_mask = predict_img(net=net,\n                        full_img=img,\n                        scale_factor=0.5,\n                        out_threshold=mask_threshold,\n                        device=device)\n    instance_strs = []\n    n_labels, labels_mat = cv2.connectedComponents((pr_mask > PROB_THRESHOLD).astype(np.uint8))\n    for label in range(0, n_labels):\n        label_bool = labels_mat == label\n        sum_label = np.sum(label_bool)\n        if sum_label >= PIXEL_THRESHOLD:\n            confidence = np.mean(pr_mask[label_bool])\n            if confidence > CONFD_THRESHOLD:\n                instance_strs.append(f\"0 {confidence} {encode_binary_mask(label_bool)}\")\n\n    output_data.append([filename.split(\".\")[0], 512, 512, \" \".join(instance_strs)])\n\ndf = pd.DataFrame(output_data, columns=[\"id\", \"height\", \"width\", \"prediction_string\"])\ndf.to_csv(\"../submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2023-11-28T11:40:20.591415Z","iopub.execute_input":"2023-11-28T11:40:20.592555Z","iopub.status.idle":"2023-11-28T11:40:21.041678Z","shell.execute_reply.started":"2023-11-28T11:40:20.592517Z","shell.execute_reply":"2023-11-28T11:40:21.040709Z"},"trusted":true},"execution_count":null,"outputs":[]}]}