{"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":"!mkdir pip_packages\n!cd /kaggle/input/hubmap/pip_packages/pip_packages/pretrainedmodels-0.7.4 && tar -cvzf /kaggle/working/pip_packages/pretrainedmodels-0.7.4.tar.gz pretrainedmodels-0.7.4\n!cd /kaggle/input/hubmap/pip_packages/pip_packages/efficientnet_pytorch-0.7.1 && tar -cvzf /kaggle/working/pip_packages/efficientnet_pytorch-0.7.1.tar.gz efficientnet_pytorch-0.7.1\n!cp /kaggle/input/hubmap/pip_packages/pip_packages/*.whl /kaggle/working/pip_packages\n!pip install segmentation-models-pytorch pycocotools --no-index --find-links=file:///kaggle/working/pip_packages","metadata":{"execution":{"iopub.status.busy":"2023-10-20T03:00:02.855111Z","iopub.execute_input":"2023-10-20T03:00:02.855356Z","iopub.status.idle":"2023-10-20T03:00:46.136184Z","shell.execute_reply.started":"2023-10-20T03:00:02.855333Z","shell.execute_reply":"2023-10-20T03:00:46.135126Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cv2\nimport zlib\nimport torch\nimport base64\nimport numpy as np\nimport pandas as pd\nimport typing as t\nfrom pycocotools import _mask as coco_mask\nfrom segmentation_models_pytorch.encoders import get_preprocessing_fn\n\n\nMODEL_PATH = \"/kaggle/input/hubmap/best_model.pth\"\nTEST_DIR = \"/kaggle/input/hubmap-hacking-the-human-vasculature/test\"\nENCODER = \"resnet50\"\nENCODER_WEIGHTS = \"imagenet\"\nPROB_THRESHOLD = 0.7\nPIXEL_THRESHOLD = 10\nCONFD_THRESHOLD = 0.7\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\n\nbest_model = torch.load(MODEL_PATH)\npreprocess_input = get_preprocessing_fn(ENCODER, pretrained=ENCODER_WEIGHTS)\noutput_data = []\n\nfor filename in os.listdir(TEST_DIR):\n    image = cv2.imread(os.path.join(TEST_DIR, filename))\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    image = preprocess_input(image).transpose(2, 0, 1).astype('float32')\n\n    img_tensor = torch.from_numpy(image).to(\"cuda\").unsqueeze(0)\n    pr_mask = best_model.predict(img_tensor).squeeze().cpu().numpy()\n\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-10-20T03:01:02.301173Z","iopub.execute_input":"2023-10-20T03:01:02.301651Z","iopub.status.idle":"2023-10-20T03:01:22.850425Z","shell.execute_reply.started":"2023-10-20T03:01:02.301609Z","shell.execute_reply":"2023-10-20T03:01:22.849411Z"},"trusted":true},"execution_count":null,"outputs":[]}]}