{"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":"!pip install \"/kaggle/input/pretrained-models/pretrainedmodels-0.7.4-py3-none-any.whl\"\n!pip install \"/kaggle/input/efficientnet-pytorch/efficientnet_pytorch-0.7.1-py3-none-any.whl\"\n!pip install \"/kaggle/input/pycocotool-library/pycocotools-2.0-cp310-cp310-linux_x86_64.whl\"\n!pip install \"/kaggle/input/segmentation-model-torch/segmentation_models_pytorch-0.3.3-py3-none-any.whl\"","metadata":{"execution":{"iopub.status.busy":"2023-07-10T06:15:21.113390Z","iopub.execute_input":"2023-07-10T06:15:21.114109Z","iopub.status.idle":"2023-07-10T06:17:28.038176Z","shell.execute_reply.started":"2023-07-10T06:15:21.114080Z","shell.execute_reply":"2023-07-10T06:17:28.036985Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom glob import glob\nimport json\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchmetrics import AveragePrecision\nimport torchvision\nfrom torchvision.transforms import transforms\nimport albumentations as A\nfrom albumentations.pytorch.transforms import ToTensorV2\nimport os\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom tqdm.notebook import tqdm\nimport torch.nn.functional as F\nimport time\nimport segmentation_models_pytorch as smp\nimport base64\nimport typing as t\nimport zlib\nfrom pycocotools import _mask as coco_mask\n    ","metadata":{"execution":{"iopub.status.busy":"2023-07-10T06:18:13.147546Z","iopub.execute_input":"2023-07-10T06:18:13.148746Z","iopub.status.idle":"2023-07-10T06:18:28.339733Z","shell.execute_reply.started":"2023-07-10T06:18:13.148705Z","shell.execute_reply":"2023-07-10T06:18:28.338764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nbatch_size = 1\nmodel_path = '/kaggle/input/weight-file/mitb1_12_june.pth'\nmodel = smp.Unet(\n        encoder_name='mit_b1',  # choose encoder, e.g. mobilenet_v2 or efficientnet-b7 or timm-efficientnet-b4\n        encoder_weights=None,  # use `imagenet` or 'noisy-student' pre-trained weights for encoder initialization\n        in_channels=3,  # model input channels (1 for gray-scale images, 3 for RGB, etc.)\n        classes=2,  # model output channels (number of classes in your dataset)\n    )\nmodel_weights=torch.load(model_path,map_location=torch.device('cpu'))\nmodel.load_state_dict(model_weights)\nmodel.to(device)","metadata":{"execution":{"iopub.status.busy":"2023-07-10T06:18:32.824289Z","iopub.execute_input":"2023-07-10T06:18:32.824667Z","iopub.status.idle":"2023-07-10T06:18:39.042275Z","shell.execute_reply.started":"2023-07-10T06:18:32.824635Z","shell.execute_reply":"2023-07-10T06:18:39.041210Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nclass ImageHuBMAPDatasetTest(Dataset):\n\n    def __init__(self, testFiles, testFolder, transforms):\n        self.testFiles = testFiles\n        self.testFolder = testFolder\n        self.transforms = transforms\n        print(testFiles)\n\n    def __getitem__(self, idx):\n        testId = self.testFiles[idx]\n        inputPath = os.path.join(self.testFolder, testId)\n        im = Image.open(inputPath)\n        if self.transforms is not None:\n            transformed = self.transforms(image=np.array(im))\n            return testId.split(\".\")[0], transformed['image']\n\n    def __len__(self):\n        return len(self.testFiles)\n\n\ntest_image_folder = '/kaggle/input/hubmap-hacking-the-human-vasculature/test/'","metadata":{"execution":{"iopub.status.busy":"2023-07-10T06:26:23.229274Z","iopub.execute_input":"2023-07-10T06:26:23.229873Z","iopub.status.idle":"2023-07-10T06:26:23.237557Z","shell.execute_reply.started":"2023-07-10T06:26:23.229832Z","shell.execute_reply":"2023-07-10T06:26:23.236630Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nclass Test:\n\n    def encode_binary_mask(self, 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        mask_to_encode = mask.reshape(mask.shape[0], mask.shape[1], 1)\n        mask_to_encode = mask_to_encode.astype(np.uint8) *255\n        #plt.imshow(mask_to_encode)\n        mask_to_encode = np.asfortranarray(mask_to_encode)\n        encoded_mask = coco_mask.encode(mask_to_encode)[0][\"counts\"]\n        binary_str = zlib.compress(encoded_mask, zlib.Z_BEST_COMPRESSION)\n        base64_str = base64.b64encode(binary_str)\n        return base64_str\n\n    def encode_output(self, outputs, idx):\n        blood_vessel = torch.argmax(outputs, 1)\n        blood_vessel = blood_vessel == 1\n        blood_vessel = blood_vessel * 1\n\n        blood_vessel = blood_vessel.cpu().numpy()\n        all_encode = {}\n        for i in range(blood_vessel.shape[0]):\n            list_encode = []\n            sliceImage = blood_vessel[i, :, :]\n            binarized = sliceImage > 0\n            coded_len = self.encode_binary_mask(binarized)\n            list_encode.append(coded_len)\n            all_encode[idx[i]] = list_encode\n        return all_encode\n\n    def get_test_transforms(self):\n        return A.Compose([A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)), ToTensorV2()])\n\n    def test_dataloader(self, image_folder):\n        dataset = ImageHuBMAPDatasetTest(os.listdir(test_image_folder),\n                                         test_image_folder, self.get_test_transforms())\n        return DataLoader(dataset, batch_size=batch_size)\n\n    def evaluate(self, model,device):\n        model.eval()\n        predictions = []\n        outputdict = {}\n        outputsoftmax = torch.nn.Softmax2d()\n        with torch.no_grad():\n            for idx, images in tqdm(self.test_dataloader(test_image_folder)):\n                images = images.to(device)\n                outputs = model(images)\n                outputs = outputsoftmax(outputs)\n                encoded = self.encode_output(outputs, idx)\n                for key in encoded:\n                    outputdict[key] = \" \".join([f\"0 1.0 {x.decode('utf-8')}\" for x in encoded[key]])\n        return outputdict\n\n\ntest = Test()\noutputdict = test.evaluate(model,device)\n\n\nclass Submission:\n\n    def submit_results(self, outputdict):\n        submission = pd.DataFrame(outputdict.items(), columns=[\"id\", \"prediction_string\"])\n        submission[\"height\"] = 512\n        submission[\"width\"] = 512\n        submission = submission[[\"id\", \"height\", \"width\", \"prediction_string\"]]\n        submission.to_csv(\"submission.csv\", index=False)\n        \n        #print(\"Submission Completed!!!\")\n\n\nsubmit = Submission()\nsubmit.submit_results(outputdict)","metadata":{"execution":{"iopub.status.busy":"2023-07-10T06:27:42.770728Z","iopub.execute_input":"2023-07-10T06:27:42.771083Z","iopub.status.idle":"2023-07-10T06:27:42.850869Z","shell.execute_reply.started":"2023-07-10T06:27:42.771053Z","shell.execute_reply":"2023-07-10T06:27:42.849819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}