{"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":"markdown","source":"# 1. exp93 tf_efficientnet_b7_ns ","metadata":{}},{"cell_type":"code","source":"%%python\n# ## \n\n# %% [markdown]\n# # 1.import and setting\n\n# %%\n\nfrom sklearn.metrics import roc_auc_score, accuracy_score, f1_score, log_loss\nimport pickle\nfrom torch.utils.data import DataLoader\nfrom torch.cuda.amp import autocast, GradScaler\nimport warnings\nimport sys\nimport pandas as pd\nimport os\nimport gc\nimport sys\nimport math\nimport time\nimport random\nimport shutil\nfrom pathlib import Path\nfrom contextlib import contextmanager\nfrom collections import defaultdict, Counter\nimport cv2\n\nimport scipy as sp\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nfrom tqdm.auto import tqdm\nfrom functools import partial\n\nimport argparse\nimport importlib\nimport torch\nimport torch.nn as nn\nfrom torch.optim import Adam, SGD, AdamW\n\nimport datetime\nimport wandb\n\n# %%\nsys.path.append('/kaggle/input/pretrainedmodels/pretrainedmodels-0.7.4')\nsys.path.append('/kaggle/input/efficientnet-pytorch/EfficientNet-PyTorch-master')\n#sys.path.append('/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master')\nsys.path.append('/kaggle/input/d/chumajin/segmentation-models-pytorch/segmentation_models.pytorch-master')\n\nimport segmentation_models_pytorch as smp\n\n# %%\nimport numpy as np\nfrom torch.utils.data import DataLoader, Dataset\nimport cv2\nimport torch\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import ImageOnlyTransform\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ndevice\n\n# %% [markdown]\n# # 2.CFG\n\n# %%\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\nclass CFG:\n    \n    # ============== 1. inference set =============\n    \n    inputpath = \"/kaggle/input/vesuvius-challenge-ink-detection/test\"\n    \n    modelpath = \"/kaggle/input/kazan-exp93\"\n    \n    tta1 = True\n    tta2 = False\n    tta3 = False\n    \n    debug = False\n    \n    usemodels = [11,12,5,6,4,13,14,10]\n\n    batch_size = 4 # 32\n    \n    TH = 0.96\n    \n    size = 608\n    tile_size = 608\n    stride = tile_size // 4\n    in_chans = 6 # 65\n\n    num_workers = 2\n\n    # ============== 3. model =============\n    \n    target_size = 1\n    \n    modeltype = \"segmentation_models_pytorch\" # huggingface, timm-unet,segmentation_models_pytorch\n\n    modelname = \"tu-tf_efficientnet_b7_ns\" #  segmentation_models_pytorchの場合tuをつける 'tu-tf_efficientnetv2_xl_in21ft1k'\n\ncfg = CFG()\n\n# %% [markdown]\n# # 3. judgement (easy commit)\n\n# %%\nimg = cv2.imread(\"/kaggle/input/vesuvius-challenge-ink-detection/test/a/mask.png\",0)\nnp.sum(img)\n\n# %%\nori_h_fraga = img.shape[0]\nori_w_fraga = img.shape[1]\n\n# %%\njudge = np.sum(img) != 2758825365\njudge\n\n# %% [markdown]\n# # 4. Aug\n\n# %%\n# Albumentations for augmentations\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\n# %%\nif cfg.in_chans != 3:\n\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n              mean= [0] * cfg.in_chans,\n              std= [1] * cfg.in_chans\n          ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\nelse:\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n                mean=[0.485, 0.456, 0.406], \n                std=[0.229, 0.224, 0.225], \n                max_pixel_value=255.0, \n                p=1.0\n            ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\n\n\n# %%\naug\n\n# %% [markdown]\n# # 5. Prepare Data and Dataset\n\n# %%\ndef read_image(mid):\n    images = []\n\n    # idxs = range(65)\n#    mid = 28\n\n    amari = CFG.in_chans % 2\n    start = mid - CFG.in_chans // 2\n    end = mid + CFG.in_chans // 2 + amari\n    idxs = range(start, end)\n\n    for i in tqdm(idxs):\n        \n        image = cv2.imread(f\"{cfg.inputpath}/a/surface_volume/{i:02}.tif\", 0)\n        image2 = cv2.imread(f\"{cfg.inputpath}/b/surface_volume/{i:02}.tif\", 0)\n\n        if cfg.debug:\n            image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            image2 = cv2.rotate(image2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        \n        image = np.concatenate([image,image2],axis=1)\n        \n        del image2\n        \n        # 追加\n        image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)\n\n        pad0 = (CFG.tile_size - image.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - image.shape[1] % CFG.tile_size)\n\n        image = np.pad(image, [(0, pad0), (0, pad1)], constant_values=0)\n\n        images.append(image)\n    images = np.stack(images, axis=2)\n    \n    ## mask make\n    mask2 = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    mask2_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        mask2 = cv2.rotate(mask2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        mask2_2 = cv2.rotate(mask2_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    mask2 = np.concatenate([mask2,mask2_2],axis=1)\n\n    del mask2_2\n    \n    \n    \n    \n    #　追加\n    mask2 = cv2.rotate(mask2, cv2.ROTATE_90_CLOCKWISE)\n    mask2 = np.pad(mask2, [(0, pad0), (0, pad1)], constant_values=0)\n\n    mask2 = mask2.astype('float32')\n    mask2 /= 255.0 # 正規化 ?\n    \n    return images,mask2\n\n# %%\ndef make_test_dataset(mid):\n    test_images,mask2 = read_image(mid)\n    \n    \n    x1_list = list(range(0, test_images.shape[1]-CFG.tile_size+1, CFG.stride))\n    y1_list = list(range(0, test_images.shape[0]-CFG.tile_size+1, CFG.stride))\n    \n    test_images_list = []\n    xyxys = []\n    valid_masks2 = []\n    for y1 in y1_list:\n        for x1 in x1_list:\n            y2 = y1 + CFG.tile_size\n            x2 = x1 + CFG.tile_size\n            \n            test_images_list.append(test_images[y1:y2, x1:x2])\n            xyxys.append((x1, y1, x2, y2))\n            \n            valid_masks2.append(np.sum(mask2[y1:y2, x1:x2]))\n            \n            \n    test_images_list = [image for image,judge in tqdm(zip(test_images_list,valid_masks2)) if judge != 0]\n    xyxys = [xyxy for xyxy,judge in tqdm(zip(xyxys,valid_masks2)) if judge != 0]\n            \n    xyxys = np.stack(xyxys)\n    \n    \n            \n    test_dataset = PytorchDataSet(test_images_list, transform=aug[\"valid\"])\n    \n    test_loader = DataLoader(test_dataset,\n                          batch_size=CFG.batch_size,\n                          shuffle=False,\n                          num_workers=CFG.num_workers, pin_memory=True, drop_last=False)\n    \n    return test_loader, xyxys\n\n# %%\nclass PytorchDataSet(Dataset):\n    \n    def __init__(self, images, transform=None):\n        self.images = images\n        self.transform = transform\n\n    def __len__(self):\n        # return len(self.df)\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        image = self.images[idx]\n\n        if self.transform:\n            data = self.transform(image=image)\n            image = data['image']\n\n        return image\n\n# %% [markdown]\n# # 6. model\n\n# %%\n# シグモイド関数の定義\ndef sigmoid(a):\n    return 1 / (1 + np.exp(-a))\n\n\ndef softmax(x):\n    \n    f_x = np.exp(x) / np.sum(np.exp(x))\n    return f_x\n\n# %%\nfrom transformers import AutoTokenizer, UperNetForSemanticSegmentation,SegformerForSemanticSegmentation\n\n# %%\nclass HugNet(nn.Module):\n\n\n    def __init__(self):\n        super(HugNet,self).__init__() \n        self.cfg = cfg\n\n        self.model = SegformerForSemanticSegmentation.from_pretrained(cfg.modelpath,num_labels=1,ignore_mismatched_sizes=True)\n        \n   #     self.model = UperNetForSemanticSegmentation.from_pretrained(cfg.modelpath)\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.model(img)\n        output = output[\"logits\"]\n        output = nn.functional.interpolate(output, size=img.shape[-2:], mode=\"bilinear\", align_corners=False) # 4倍にする\n\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %%\nclass Net(nn.Module):\n\n\n    def __init__(self):\n        super(Net,self).__init__() \n        self.encoder = smp.Unet(\n            encoder_name=cfg.modelname, \n            encoder_weights=None,\n            in_channels=cfg.in_chans,\n            classes=cfg.target_size,\n            activation=None,\n        )\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.encoder(img)\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %% [markdown]\n# ## 6.1 model load\n\n# %%\n\n\n# %%\nallmodels = []\n\n\nif cfg.debug:\n        cfg.usemodels = [cfg.usemodels[0]]\n        \n    \nfor fold in cfg.usemodels:\n    \n    print(fold)\n    \n    if cfg.modeltype == \"huggingface\":\n        model = HugNet()\n    else:\n        model = Net()\n    model.to(device)\n    \n    model_path = f\"{cfg.modelpath}/model{fold}.pth\"\n    state = torch.load(model_path)['state_dict']\n    model.load_state_dict(state)\n    model.eval()\n        \n    allmodels.append(model)\n    \n    del state\n    del model\n    \n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n# %%\nfragment_ids = sorted(os.listdir(cfg.inputpath))\nfragment_ids\n\n# %% [markdown]\n# # 7.inference func\n\n# %%\ndef inference(images):\n    preds = np.mean([model(images) for model in allmodels],axis=0)\n    return preds           \n\n# %% [markdown]\n# # 8.main\n\n# %%\ndef make_maskpred(test_loader,xyxys):\n    \n        binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n        binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n        \n        if cfg.debug:\n            binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n        binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n        del binary_mask_2\n\n        \n        \n        \n        # 追加\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n        binary_mask = (binary_mask / 255).astype(int)\n\n        ori_h = binary_mask.shape[0]\n        ori_w = binary_mask.shape[1]\n        # mask = mask / 255\n\n        pad0 = (CFG.tile_size - binary_mask.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - binary_mask.shape[1] % CFG.tile_size)\n\n        binary_mask = np.pad(binary_mask, [(0, pad0), (0, pad1)], constant_values=0)\n\n        mask_pred = np.zeros(binary_mask.shape)\n        mask_count = np.zeros(binary_mask.shape)\n\n        for step, (images) in tqdm(enumerate(test_loader), total=len(test_loader)):\n\n            allpreds = []\n\n            images = images.to(device)\n            batch_size = images.size(0)\n\n            with torch.no_grad():\n                               \n                y_preds = inference(images)\n                allpreds.append(y_preds)\n\n            if cfg.tta1:\n\n                images2 =  torch.flip(images,[2])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,:]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            if cfg.tta2:\n\n                images2 =  torch.flip(images,[3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,:,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n\n            if cfg.tta3:\n\n                images2 =  torch.flip(images,[2,3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            y_preds = np.mean(np.array(allpreds),axis=0)\n\n            del images\n            \n            if cfg.tta1 + cfg.tta2 + cfg.tta3 >0:\n                del images2\n            \n            gc.collect()\n            torch.cuda.empty_cache()\n\n            start_idx = step*CFG.batch_size\n            end_idx = start_idx + batch_size\n            for i, (x1, y1, x2, y2) in enumerate(xyxys[start_idx:end_idx]):\n                mask_pred[y1:y2, x1:x2] += y_preds[i].squeeze(0)\n                mask_count[y1:y2, x1:x2] += np.ones((CFG.tile_size, CFG.tile_size))\n\n      #  plt.imshow(mask_count)\n      #  plt.show()\n\n        print(f'mask_count_min: {mask_count.min()}')\n        mask_pred /= mask_count\n\n        mask_pred = mask_pred[:ori_h, :ori_w]\n        binary_mask = binary_mask[:ori_h, :ori_w]\n\n        \n        del mask_count\n        \n        \n        return mask_pred\n\n\n# %%\nif cfg.debug:\n    judge = True\n\n# %%\nif judge:\n    \n    \n\n    results = []\n    binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n    del binary_mask_2\n    \n    \n\n    #追加\n    binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n\n    test_loader, xyxys = make_test_dataset(28)        \n    mask_pred = make_maskpred(test_loader,xyxys) * 1/3\n    del test_loader\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader2, xyxys = make_test_dataset(30)\n    mask_pred += make_maskpred(test_loader2,xyxys) * 1/3\n    del test_loader2\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader3, xyxys = make_test_dataset(32)\n    mask_pred += make_maskpred(test_loader3,xyxys) * 1/3\n    del test_loader3\n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n\n    # 追加\n    mask_pred = np.where(binary_mask==0,0,mask_pred)\n    mask_pred = np.where(np.isnan(mask_pred),0,mask_pred)\n    mask_pred = cv2.rotate(mask_pred, cv2.ROTATE_90_COUNTERCLOCKWISE) # もとに戻して保存\n\n    np.save(f\"mask_pred_exp93\",mask_pred)\n    \n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. exp129 tf_efficientnet_b6_ns ","metadata":{}},{"cell_type":"code","source":"%%python\n# %% [markdown]\n# ## \n\n# %% [markdown]\n# # 1.import and setting\n\n# %%\n\nfrom sklearn.metrics import roc_auc_score, accuracy_score, f1_score, log_loss\nimport pickle\nfrom torch.utils.data import DataLoader\nfrom torch.cuda.amp import autocast, GradScaler\nimport warnings\nimport sys\nimport pandas as pd\nimport os\nimport gc\nimport sys\nimport math\nimport time\nimport random\nimport shutil\nfrom pathlib import Path\nfrom contextlib import contextmanager\nfrom collections import defaultdict, Counter\nimport cv2\n\nimport scipy as sp\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nfrom tqdm.auto import tqdm\nfrom functools import partial\n\nimport argparse\nimport importlib\nimport torch\nimport torch.nn as nn\nfrom torch.optim import Adam, SGD, AdamW\n\nimport datetime\nimport wandb\n\n# %%\nsys.path.append('/kaggle/input/pretrainedmodels/pretrainedmodels-0.7.4')\nsys.path.append('/kaggle/input/efficientnet-pytorch/EfficientNet-PyTorch-master')\n#sys.path.append('/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master')\nsys.path.append('/kaggle/input/d/chumajin/segmentation-models-pytorch/segmentation_models.pytorch-master')\n\nimport segmentation_models_pytorch as smp\n\n# %%\nimport numpy as np\nfrom torch.utils.data import DataLoader, Dataset\nimport cv2\nimport torch\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import ImageOnlyTransform\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ndevice\n\n# %% [markdown]\n# # 2.CFG\n\n# %%\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\nclass CFG:\n    \n    # ============== 1. inference set =============\n    \n    inputpath = \"/kaggle/input/vesuvius-challenge-ink-detection/test\"\n    \n    modelpath = \"/kaggle/input/kazan-exp129\"\n    \n    tta1 = True\n    tta2 = False\n    tta3 = False\n    \n    debug = False\n    \n    usemodels = [11,12,4,5,6,13,14,10]\n\n    batch_size = 4 # 32\n    \n    TH = 0.96\n    \n    size = 544\n    tile_size = 544\n    stride = tile_size // 4\n    in_chans = 6 # 65\n\n    num_workers = 2\n\n    # ============== 3. model =============\n    \n    target_size = 1\n    \n    modeltype = \"segmentation_models_pytorch\" # huggingface, timm-unet,segmentation_models_pytorch\n\n    modelname = \"tu-tf_efficientnet_b6_ns\" #  segmentation_models_pytorchの場合tuをつける 'tu-tf_efficientnetv2_xl_in21ft1k'\n\ncfg = CFG()\n\n# %% [markdown]\n# # 3. judgement (easy commit)\n\n# %%\nimg = cv2.imread(\"/kaggle/input/vesuvius-challenge-ink-detection/test/a/mask.png\",0)\nnp.sum(img)\n\n# %%\nori_h_fraga = img.shape[0]\nori_w_fraga = img.shape[1]\n\n# %%\njudge = np.sum(img) != 2758825365\njudge\n\n# %% [markdown]\n# # 4. Aug\n\n# %%\n# Albumentations for augmentations\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\n# %%\nif cfg.in_chans != 3:\n\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n              mean= [0] * cfg.in_chans,\n              std= [1] * cfg.in_chans\n          ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\nelse:\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n                mean=[0.485, 0.456, 0.406], \n                std=[0.229, 0.224, 0.225], \n                max_pixel_value=255.0, \n                p=1.0\n            ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\n\n\n# %%\naug\n\n# %% [markdown]\n# # 5. Prepare Data and Dataset\n\n# %%\ndef read_image(mid):\n    images = []\n\n    # idxs = range(65)\n#    mid = 28\n\n    amari = CFG.in_chans % 2\n    start = mid - CFG.in_chans // 2\n    end = mid + CFG.in_chans // 2 + amari\n    idxs = range(start, end)\n\n    for i in tqdm(idxs):\n        \n        image = cv2.imread(f\"{cfg.inputpath}/a/surface_volume/{i:02}.tif\", 0)\n        image2 = cv2.imread(f\"{cfg.inputpath}/b/surface_volume/{i:02}.tif\", 0)\n\n        if cfg.debug:\n            image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            image2 = cv2.rotate(image2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        \n        image = np.concatenate([image,image2],axis=1)\n        \n        del image2\n        \n        # 追加\n        image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)\n\n        pad0 = (CFG.tile_size - image.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - image.shape[1] % CFG.tile_size)\n\n        image = np.pad(image, [(0, pad0), (0, pad1)], constant_values=0)\n\n        images.append(image)\n    images = np.stack(images, axis=2)\n    \n    ## mask make\n    mask2 = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    mask2_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        mask2 = cv2.rotate(mask2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        mask2_2 = cv2.rotate(mask2_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    mask2 = np.concatenate([mask2,mask2_2],axis=1)\n\n    del mask2_2\n    \n    \n    \n    \n    #　追加\n    mask2 = cv2.rotate(mask2, cv2.ROTATE_90_CLOCKWISE)\n    mask2 = np.pad(mask2, [(0, pad0), (0, pad1)], constant_values=0)\n\n    mask2 = mask2.astype('float32')\n    mask2 /= 255.0 # 正規化 ?\n    \n    return images,mask2\n\n# %%\ndef make_test_dataset(mid):\n    test_images,mask2 = read_image(mid)\n    \n    \n    x1_list = list(range(0, test_images.shape[1]-CFG.tile_size+1, CFG.stride))\n    y1_list = list(range(0, test_images.shape[0]-CFG.tile_size+1, CFG.stride))\n    \n    test_images_list = []\n    xyxys = []\n    valid_masks2 = []\n    for y1 in y1_list:\n        for x1 in x1_list:\n            y2 = y1 + CFG.tile_size\n            x2 = x1 + CFG.tile_size\n            \n            test_images_list.append(test_images[y1:y2, x1:x2])\n            xyxys.append((x1, y1, x2, y2))\n            \n            valid_masks2.append(np.sum(mask2[y1:y2, x1:x2]))\n            \n            \n    test_images_list = [image for image,judge in tqdm(zip(test_images_list,valid_masks2)) if judge != 0]\n    xyxys = [xyxy for xyxy,judge in tqdm(zip(xyxys,valid_masks2)) if judge != 0]\n            \n    xyxys = np.stack(xyxys)\n    \n    \n            \n    test_dataset = PytorchDataSet(test_images_list, transform=aug[\"valid\"])\n    \n    test_loader = DataLoader(test_dataset,\n                          batch_size=CFG.batch_size,\n                          shuffle=False,\n                          num_workers=CFG.num_workers, pin_memory=True, drop_last=False)\n    \n    return test_loader, xyxys\n\n# %%\nclass PytorchDataSet(Dataset):\n    \n    def __init__(self, images, transform=None):\n        self.images = images\n        self.transform = transform\n\n    def __len__(self):\n        # return len(self.df)\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        image = self.images[idx]\n\n        if self.transform:\n            data = self.transform(image=image)\n            image = data['image']\n\n        return image\n\n# %% [markdown]\n# # 6. model\n\n# %%\n# シグモイド関数の定義\ndef sigmoid(a):\n    return 1 / (1 + np.exp(-a))\n\n\ndef softmax(x):\n    \n    f_x = np.exp(x) / np.sum(np.exp(x))\n    return f_x\n\n# %%\nfrom transformers import AutoTokenizer, UperNetForSemanticSegmentation,SegformerForSemanticSegmentation\n\n# %%\nclass HugNet(nn.Module):\n\n\n    def __init__(self):\n        super(HugNet,self).__init__() \n        self.cfg = cfg\n\n        self.model = SegformerForSemanticSegmentation.from_pretrained(cfg.modelpath,num_labels=1,ignore_mismatched_sizes=True)\n        \n   #     self.model = UperNetForSemanticSegmentation.from_pretrained(cfg.modelpath)\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.model(img)\n        output = output[\"logits\"]\n        output = nn.functional.interpolate(output, size=img.shape[-2:], mode=\"bilinear\", align_corners=False) # 4倍にする\n\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %%\nclass Net(nn.Module):\n\n\n    def __init__(self):\n        super(Net,self).__init__() \n        self.encoder = smp.Unet(\n            encoder_name=cfg.modelname, \n            encoder_weights=None,\n            in_channels=cfg.in_chans,\n            classes=cfg.target_size,\n            activation=None,\n        )\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.encoder(img)\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %% [markdown]\n# ## 6.1 model load\n\n# %%\n\n\n# %%\nallmodels = []\n\n\nif cfg.debug:\n        cfg.usemodels = [cfg.usemodels[0]]\n        \n    \nfor fold in cfg.usemodels:\n    \n    print(fold)\n    \n    if cfg.modeltype == \"huggingface\":\n        model = HugNet()\n    else:\n        model = Net()\n    model.to(device)\n    \n    model_path = f\"{cfg.modelpath}/model{fold}.pth\"\n    state = torch.load(model_path)['state_dict']\n    model.load_state_dict(state)\n    model.eval()\n        \n    allmodels.append(model)\n    \n    del state\n    del model\n    \n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n# %%\nfragment_ids = sorted(os.listdir(cfg.inputpath))\nfragment_ids\n\n# %% [markdown]\n# # 7.inference func\n\n# %%\ndef inference(images):\n    preds = np.mean([model(images) for model in allmodels],axis=0)\n    return preds           \n\n# %% [markdown]\n# # 8.main\n\n# %%\ndef make_maskpred(test_loader,xyxys):\n    \n        binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n        binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n        \n        if cfg.debug:\n            binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n        binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n        del binary_mask_2\n\n        \n        \n        \n        # 追加\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n        binary_mask = (binary_mask / 255).astype(int)\n\n        ori_h = binary_mask.shape[0]\n        ori_w = binary_mask.shape[1]\n        # mask = mask / 255\n\n        pad0 = (CFG.tile_size - binary_mask.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - binary_mask.shape[1] % CFG.tile_size)\n\n        binary_mask = np.pad(binary_mask, [(0, pad0), (0, pad1)], constant_values=0)\n\n        mask_pred = np.zeros(binary_mask.shape)\n        mask_count = np.zeros(binary_mask.shape)\n\n        for step, (images) in tqdm(enumerate(test_loader), total=len(test_loader)):\n\n            allpreds = []\n\n            images = images.to(device)\n            batch_size = images.size(0)\n\n            with torch.no_grad():\n                               \n                y_preds = inference(images)\n                allpreds.append(y_preds)\n\n            if cfg.tta1:\n\n                images2 =  torch.flip(images,[2])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,:]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            if cfg.tta2:\n\n                images2 =  torch.flip(images,[3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,:,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n\n            if cfg.tta3:\n\n                images2 =  torch.flip(images,[2,3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            y_preds = np.mean(np.array(allpreds),axis=0)\n\n            del images\n            \n            if cfg.tta1 + cfg.tta2 + cfg.tta3 >0:\n                del images2\n            \n            gc.collect()\n            torch.cuda.empty_cache()\n\n            start_idx = step*CFG.batch_size\n            end_idx = start_idx + batch_size\n            for i, (x1, y1, x2, y2) in enumerate(xyxys[start_idx:end_idx]):\n                mask_pred[y1:y2, x1:x2] += y_preds[i].squeeze(0)\n                mask_count[y1:y2, x1:x2] += np.ones((CFG.tile_size, CFG.tile_size))\n\n      #  plt.imshow(mask_count)\n      #  plt.show()\n\n        print(f'mask_count_min: {mask_count.min()}')\n        mask_pred /= mask_count\n\n        mask_pred = mask_pred[:ori_h, :ori_w]\n        binary_mask = binary_mask[:ori_h, :ori_w]\n\n        \n        del mask_count\n        \n        \n        return mask_pred\n\n\n# %%\nif cfg.debug:\n    judge = True\n\n# %%\nif judge:\n    \n    \n\n    results = []\n    binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n    del binary_mask_2\n    \n    \n\n    #追加\n    binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n\n    test_loader, xyxys = make_test_dataset(28)        \n    mask_pred = make_maskpred(test_loader,xyxys) * 1/3\n    del test_loader\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader2, xyxys = make_test_dataset(30)\n    mask_pred += make_maskpred(test_loader2,xyxys) * 1/3\n    del test_loader2\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader3, xyxys = make_test_dataset(32)\n    mask_pred += make_maskpred(test_loader3,xyxys) * 1/3\n    del test_loader3\n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n\n    # 追加\n    mask_pred = np.where(binary_mask==0,0,mask_pred)\n    mask_pred = np.where(np.isnan(mask_pred),0,mask_pred)\n    mask_pred = cv2.rotate(mask_pred, cv2.ROTATE_90_COUNTERCLOCKWISE) # もとに戻して保存\n\n    np.save(f\"mask_pred_exp129\",mask_pred)\n    \n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. exp177 tf_efficientnetv2_l_in21ft1k","metadata":{}},{"cell_type":"code","source":"%%python\n\n# %% [markdown]\n# ## \n\n# %% [markdown]\n# # 1.import and setting\n\n# %%\n\nfrom sklearn.metrics import roc_auc_score, accuracy_score, f1_score, log_loss\nimport pickle\nfrom torch.utils.data import DataLoader\nfrom torch.cuda.amp import autocast, GradScaler\nimport warnings\nimport sys\nimport pandas as pd\nimport os\nimport gc\nimport sys\nimport math\nimport time\nimport random\nimport shutil\nfrom pathlib import Path\nfrom contextlib import contextmanager\nfrom collections import defaultdict, Counter\nimport cv2\n\nimport scipy as sp\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nfrom tqdm.auto import tqdm\nfrom functools import partial\n\nimport argparse\nimport importlib\nimport torch\nimport torch.nn as nn\nfrom torch.optim import Adam, SGD, AdamW\n\nimport datetime\nimport wandb\n\n# %%\nsys.path.append('/kaggle/input/pretrainedmodels/pretrainedmodels-0.7.4')\nsys.path.append('/kaggle/input/efficientnet-pytorch/EfficientNet-PyTorch-master')\n#sys.path.append('/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master')\nsys.path.append('/kaggle/input/d/chumajin/segmentation-models-pytorch/segmentation_models.pytorch-master')\n\nimport segmentation_models_pytorch as smp\n\n# %%\nimport numpy as np\nfrom torch.utils.data import DataLoader, Dataset\nimport cv2\nimport torch\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import ImageOnlyTransform\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ndevice\n\n# %% [markdown]\n# # 2.CFG\n\n# %%\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\nclass CFG:\n    \n    # ============== 1. inference set =============\n    \n    inputpath = \"/kaggle/input/vesuvius-challenge-ink-detection/test\"\n    \n    modelpath = \"/kaggle/input/kazan-exp177\"\n    \n    tta1 = True\n    tta2 = False\n    tta3 = False\n    \n    debug = False\n    \n    usemodels = [11,12,4,5,6,13,14]\n\n    batch_size = 4 # 32\n    \n    TH = 0.96\n    \n    size = 480\n    tile_size = 480\n    stride = tile_size // 4\n    in_chans = 6 # 65\n\n    num_workers = 2\n\n    # ============== 3. model =============\n    \n    target_size = 1\n    \n    modeltype = \"segmentation_models_pytorch\" # huggingface, timm-unet,segmentation_models_pytorch\n\n    modelname = \"tu-tf_efficientnetv2_l_in21ft1k\" #  segmentation_models_pytorchの場合tuをつける 'tu-tf_efficientnetv2_xl_in21ft1k'\n\ncfg = CFG()\n\n# %% [markdown]\n# # 3. judgement (easy commit)\n\n# %%\nimg = cv2.imread(\"/kaggle/input/vesuvius-challenge-ink-detection/test/a/mask.png\",0)\nnp.sum(img)\n\n# %%\nori_h_fraga = img.shape[0]\nori_w_fraga = img.shape[1]\n\n# %%\njudge = np.sum(img) != 2758825365\njudge\n\n# %% [markdown]\n# # 4. Aug\n\n# %%\n# Albumentations for augmentations\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\n# %%\nif cfg.in_chans != 3:\n\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n              mean= [0] * cfg.in_chans,\n              std= [1] * cfg.in_chans\n          ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\nelse:\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n                mean=[0.485, 0.456, 0.406], \n                std=[0.229, 0.224, 0.225], \n                max_pixel_value=255.0, \n                p=1.0\n            ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\n\n\n# %%\naug\n\n# %% [markdown]\n# # 5. Prepare Data and Dataset\n\n# %%\ndef read_image(mid):\n    images = []\n\n    # idxs = range(65)\n#    mid = 28\n\n    amari = CFG.in_chans % 2\n    start = mid - CFG.in_chans // 2\n    end = mid + CFG.in_chans // 2 + amari\n    idxs = range(start, end)\n\n    for i in tqdm(idxs):\n        \n        image = cv2.imread(f\"{cfg.inputpath}/a/surface_volume/{i:02}.tif\", 0)\n        image2 = cv2.imread(f\"{cfg.inputpath}/b/surface_volume/{i:02}.tif\", 0)\n\n        if cfg.debug:\n            image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            image2 = cv2.rotate(image2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        \n        image = np.concatenate([image,image2],axis=1)\n        \n        del image2\n        \n        # 追加\n        image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)\n\n        pad0 = (CFG.tile_size - image.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - image.shape[1] % CFG.tile_size)\n\n        image = np.pad(image, [(0, pad0), (0, pad1)], constant_values=0)\n\n        images.append(image)\n    images = np.stack(images, axis=2)\n    \n    ## mask make\n    mask2 = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    mask2_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        mask2 = cv2.rotate(mask2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        mask2_2 = cv2.rotate(mask2_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    mask2 = np.concatenate([mask2,mask2_2],axis=1)\n\n    del mask2_2\n    \n    \n    \n    \n    #　追加\n    mask2 = cv2.rotate(mask2, cv2.ROTATE_90_CLOCKWISE)\n    mask2 = np.pad(mask2, [(0, pad0), (0, pad1)], constant_values=0)\n\n    mask2 = mask2.astype('float32')\n    mask2 /= 255.0 # 正規化 ?\n    \n    return images,mask2\n\n# %%\ndef make_test_dataset(mid):\n    test_images,mask2 = read_image(mid)\n    \n    \n    x1_list = list(range(0, test_images.shape[1]-CFG.tile_size+1, CFG.stride))\n    y1_list = list(range(0, test_images.shape[0]-CFG.tile_size+1, CFG.stride))\n    \n    test_images_list = []\n    xyxys = []\n    valid_masks2 = []\n    for y1 in y1_list:\n        for x1 in x1_list:\n            y2 = y1 + CFG.tile_size\n            x2 = x1 + CFG.tile_size\n            \n            test_images_list.append(test_images[y1:y2, x1:x2])\n            xyxys.append((x1, y1, x2, y2))\n            \n            valid_masks2.append(np.sum(mask2[y1:y2, x1:x2]))\n            \n            \n    test_images_list = [image for image,judge in tqdm(zip(test_images_list,valid_masks2)) if judge != 0]\n    xyxys = [xyxy for xyxy,judge in tqdm(zip(xyxys,valid_masks2)) if judge != 0]\n            \n    xyxys = np.stack(xyxys)\n    \n    \n            \n    test_dataset = PytorchDataSet(test_images_list, transform=aug[\"valid\"])\n    \n    test_loader = DataLoader(test_dataset,\n                          batch_size=CFG.batch_size,\n                          shuffle=False,\n                          num_workers=CFG.num_workers, pin_memory=True, drop_last=False)\n    \n    return test_loader, xyxys\n\n# %%\nclass PytorchDataSet(Dataset):\n    \n    def __init__(self, images, transform=None):\n        self.images = images\n        self.transform = transform\n\n    def __len__(self):\n        # return len(self.df)\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        image = self.images[idx]\n\n        if self.transform:\n            data = self.transform(image=image)\n            image = data['image']\n\n        return image\n\n# %% [markdown]\n# # 6. model\n\n# %%\n# シグモイド関数の定義\ndef sigmoid(a):\n    return 1 / (1 + np.exp(-a))\n\n\ndef softmax(x):\n    \n    f_x = np.exp(x) / np.sum(np.exp(x))\n    return f_x\n\n# %%\nfrom transformers import AutoTokenizer, UperNetForSemanticSegmentation,SegformerForSemanticSegmentation\n\n# %%\nclass HugNet(nn.Module):\n\n\n    def __init__(self):\n        super(HugNet,self).__init__() \n        self.cfg = cfg\n\n        self.model = SegformerForSemanticSegmentation.from_pretrained(cfg.modelpath,num_labels=1,ignore_mismatched_sizes=True)\n        \n   #     self.model = UperNetForSemanticSegmentation.from_pretrained(cfg.modelpath)\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.model(img)\n        output = output[\"logits\"]\n        output = nn.functional.interpolate(output, size=img.shape[-2:], mode=\"bilinear\", align_corners=False) # 4倍にする\n\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %%\nclass Net(nn.Module):\n\n\n    def __init__(self):\n        super(Net,self).__init__() \n        self.encoder = smp.Unet(\n            encoder_name=cfg.modelname, \n            encoder_weights=None,\n            in_channels=cfg.in_chans,\n            classes=cfg.target_size,\n            activation=None,\n        )\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.encoder(img)\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %% [markdown]\n# ## 6.1 model load\n\n# %%\n\n\n# %%\nallmodels = []\n\n\nif cfg.debug:\n        cfg.usemodels = [cfg.usemodels[0]]\n        \n    \nfor fold in cfg.usemodels:\n    \n    print(fold)\n    \n    if cfg.modeltype == \"huggingface\":\n        model = HugNet()\n    else:\n        model = Net()\n    model.to(device)\n    \n    model_path = f\"{cfg.modelpath}/model{fold}.pth\"\n    state = torch.load(model_path)['state_dict']\n    model.load_state_dict(state)\n    model.eval()\n        \n    allmodels.append(model)\n    \n    del state\n    del model\n    \n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n# %%\nfragment_ids = sorted(os.listdir(cfg.inputpath))\nfragment_ids\n\n# %% [markdown]\n# # 7.inference func\n\n# %%\ndef inference(images):\n    preds = np.mean([model(images) for model in allmodels],axis=0)\n    return preds           \n\n# %% [markdown]\n# # 8.main\n\n# %%\ndef make_maskpred(test_loader,xyxys):\n    \n        binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n        binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n        \n        if cfg.debug:\n            binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n        binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n        del binary_mask_2\n\n        \n        \n        \n        # 追加\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n        binary_mask = (binary_mask / 255).astype(int)\n\n        ori_h = binary_mask.shape[0]\n        ori_w = binary_mask.shape[1]\n        # mask = mask / 255\n\n        pad0 = (CFG.tile_size - binary_mask.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - binary_mask.shape[1] % CFG.tile_size)\n\n        binary_mask = np.pad(binary_mask, [(0, pad0), (0, pad1)], constant_values=0)\n\n        mask_pred = np.zeros(binary_mask.shape)\n        mask_count = np.zeros(binary_mask.shape)\n\n        for step, (images) in tqdm(enumerate(test_loader), total=len(test_loader)):\n\n            allpreds = []\n\n            images = images.to(device)\n            batch_size = images.size(0)\n\n            with torch.no_grad():\n                               \n                y_preds = inference(images)\n                allpreds.append(y_preds)\n\n            if cfg.tta1:\n\n                images2 =  torch.flip(images,[2])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,:]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            if cfg.tta2:\n\n                images2 =  torch.flip(images,[3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,:,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n\n            if cfg.tta3:\n\n                images2 =  torch.flip(images,[2,3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            y_preds = np.mean(np.array(allpreds),axis=0)\n\n            del images\n            \n            if cfg.tta1 + cfg.tta2 + cfg.tta3 >0:\n                del images2\n            \n            gc.collect()\n            torch.cuda.empty_cache()\n\n            start_idx = step*CFG.batch_size\n            end_idx = start_idx + batch_size\n            for i, (x1, y1, x2, y2) in enumerate(xyxys[start_idx:end_idx]):\n                mask_pred[y1:y2, x1:x2] += y_preds[i].squeeze(0)\n                mask_count[y1:y2, x1:x2] += np.ones((CFG.tile_size, CFG.tile_size))\n\n      #  plt.imshow(mask_count)\n      #  plt.show()\n\n        print(f'mask_count_min: {mask_count.min()}')\n        mask_pred /= mask_count\n\n        mask_pred = mask_pred[:ori_h, :ori_w]\n        binary_mask = binary_mask[:ori_h, :ori_w]\n\n        \n        del mask_count\n        \n        \n        return mask_pred\n\n\n# %%\nif cfg.debug:\n    judge = True\n\n# %%\nif judge:\n    \n    \n\n    results = []\n    binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n    del binary_mask_2\n    \n    \n\n    #追加\n    binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n\n    test_loader, xyxys = make_test_dataset(28)        \n    mask_pred = make_maskpred(test_loader,xyxys) * 1/3\n    del test_loader\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader2, xyxys = make_test_dataset(30)\n    mask_pred += make_maskpred(test_loader2,xyxys) * 1/3\n    del test_loader2\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader3, xyxys = make_test_dataset(32)\n    mask_pred += make_maskpred(test_loader3,xyxys) * 1/3\n    del test_loader3\n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n\n    # 追加\n    mask_pred = np.where(binary_mask==0,0,mask_pred)\n    mask_pred = np.where(np.isnan(mask_pred),0,mask_pred)\n    mask_pred = cv2.rotate(mask_pred, cv2.ROTATE_90_COUNTERCLOCKWISE) # もとに戻して保存\n\n    np.save(f\"mask_pred_exp177\",mask_pred)\n\n    \n","metadata":{"execution":{"iopub.status.busy":"2023-06-05T22:53:53.848329Z","iopub.execute_input":"2023-06-05T22:53:53.849331Z","iopub.status.idle":"2023-06-05T23:08:50.079044Z","shell.execute_reply.started":"2023-06-05T22:53:53.849291Z","shell.execute_reply":"2023-06-05T23:08:50.077862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4. exp208  tf_tf_efficientnet_b8\n","metadata":{}},{"cell_type":"code","source":"%%python\n\n# %% [markdown]\n# ## \n\n# %% [markdown]\n# # 1.import and setting\n\n# %%\n\nfrom sklearn.metrics import roc_auc_score, accuracy_score, f1_score, log_loss\nimport pickle\nfrom torch.utils.data import DataLoader\nfrom torch.cuda.amp import autocast, GradScaler\nimport warnings\nimport sys\nimport pandas as pd\nimport os\nimport gc\nimport sys\nimport math\nimport time\nimport random\nimport shutil\nfrom pathlib import Path\nfrom contextlib import contextmanager\nfrom collections import defaultdict, Counter\nimport cv2\n\nimport scipy as sp\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nfrom tqdm.auto import tqdm\nfrom functools import partial\n\nimport argparse\nimport importlib\nimport torch\nimport torch.nn as nn\nfrom torch.optim import Adam, SGD, AdamW\n\nimport datetime\nimport wandb\n\n# %%\nsys.path.append('/kaggle/input/pretrainedmodels/pretrainedmodels-0.7.4')\nsys.path.append('/kaggle/input/efficientnet-pytorch/EfficientNet-PyTorch-master')\n#sys.path.append('/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master')\nsys.path.append('/kaggle/input/d/chumajin/segmentation-models-pytorch/segmentation_models.pytorch-master')\n\nimport segmentation_models_pytorch as smp\n\n# %%\nimport numpy as np\nfrom torch.utils.data import DataLoader, Dataset\nimport cv2\nimport torch\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import ImageOnlyTransform\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ndevice\n\n# %% [markdown]\n# # 2.CFG\n\n# %%\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\nclass CFG:\n    \n    # ============== 1. inference set =============\n    \n    inputpath = \"/kaggle/input/vesuvius-challenge-ink-detection/test\"\n    \n    modelpath = \"/kaggle/input/kazan-exp208\"\n    \n    tta1 = True\n    tta2 = False\n    tta3 = False\n    \n    debug = False\n    \n    usemodels = [11,12,4,5,6,13,14]\n\n    batch_size = 4 # 32\n    \n    TH = 0.96\n    \n    size = 672\n    tile_size = 672\n    stride = tile_size // 4\n    in_chans = 6 # 65\n\n    num_workers = 2\n\n    # ============== 3. model =============\n    \n    target_size = 1\n    \n    modeltype = \"segmentation_models_pytorch\" # huggingface, timm-unet,segmentation_models_pytorch\n\n    modelname = \"tu-tf_efficientnet_b8\" #  segmentation_models_pytorchの場合tuをつける 'tu-tf_efficientnetv2_xl_in21ft1k'\n\ncfg = CFG()\n\n# %% [markdown]\n# # 3. judgement (easy commit)\n\n# %%\nimg = cv2.imread(\"/kaggle/input/vesuvius-challenge-ink-detection/test/a/mask.png\",0)\nnp.sum(img)\n\n# %%\nori_h_fraga = img.shape[0]\nori_w_fraga = img.shape[1]\n\n# %%\njudge = np.sum(img) != 2758825365\njudge\n\n# %% [markdown]\n# # 4. Aug\n\n# %%\n# Albumentations for augmentations\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\n# %%\nif cfg.in_chans != 3:\n\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n              mean= [0] * cfg.in_chans,\n              std= [1] * cfg.in_chans\n          ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\nelse:\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n                mean=[0.485, 0.456, 0.406], \n                std=[0.229, 0.224, 0.225], \n                max_pixel_value=255.0, \n                p=1.0\n            ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\n\n\n# %%\naug\n\n# %% [markdown]\n# # 5. Prepare Data and Dataset\n\n# %%\ndef read_image(mid):\n    images = []\n\n    # idxs = range(65)\n#    mid = 28\n\n    amari = CFG.in_chans % 2\n    start = mid - CFG.in_chans // 2\n    end = mid + CFG.in_chans // 2 + amari\n    idxs = range(start, end)\n\n    for i in tqdm(idxs):\n        \n        image = cv2.imread(f\"{cfg.inputpath}/a/surface_volume/{i:02}.tif\", 0)\n        image2 = cv2.imread(f\"{cfg.inputpath}/b/surface_volume/{i:02}.tif\", 0)\n\n        if cfg.debug:\n            image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            image2 = cv2.rotate(image2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        \n        image = np.concatenate([image,image2],axis=1)\n        \n        del image2\n        \n        # 追加\n        image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)\n\n        pad0 = (CFG.tile_size - image.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - image.shape[1] % CFG.tile_size)\n\n        image = np.pad(image, [(0, pad0), (0, pad1)], constant_values=0)\n\n        images.append(image)\n    images = np.stack(images, axis=2)\n    \n    ## mask make\n    mask2 = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    mask2_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        mask2 = cv2.rotate(mask2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        mask2_2 = cv2.rotate(mask2_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    mask2 = np.concatenate([mask2,mask2_2],axis=1)\n\n    del mask2_2\n    \n    \n    \n    \n    #　追加\n    mask2 = cv2.rotate(mask2, cv2.ROTATE_90_CLOCKWISE)\n    mask2 = np.pad(mask2, [(0, pad0), (0, pad1)], constant_values=0)\n\n    mask2 = mask2.astype('float32')\n    mask2 /= 255.0 # 正規化 ?\n    \n    return images,mask2\n\n# %%\ndef make_test_dataset(mid):\n    test_images,mask2 = read_image(mid)\n    \n    \n    x1_list = list(range(0, test_images.shape[1]-CFG.tile_size+1, CFG.stride))\n    y1_list = list(range(0, test_images.shape[0]-CFG.tile_size+1, CFG.stride))\n    \n    test_images_list = []\n    xyxys = []\n    valid_masks2 = []\n    for y1 in y1_list:\n        for x1 in x1_list:\n            y2 = y1 + CFG.tile_size\n            x2 = x1 + CFG.tile_size\n            \n            test_images_list.append(test_images[y1:y2, x1:x2])\n            xyxys.append((x1, y1, x2, y2))\n            \n            valid_masks2.append(np.sum(mask2[y1:y2, x1:x2]))\n            \n            \n    test_images_list = [image for image,judge in tqdm(zip(test_images_list,valid_masks2)) if judge != 0]\n    xyxys = [xyxy for xyxy,judge in tqdm(zip(xyxys,valid_masks2)) if judge != 0]\n            \n    xyxys = np.stack(xyxys)\n    \n    \n            \n    test_dataset = PytorchDataSet(test_images_list, transform=aug[\"valid\"])\n    \n    test_loader = DataLoader(test_dataset,\n                          batch_size=CFG.batch_size,\n                          shuffle=False,\n                          num_workers=CFG.num_workers, pin_memory=True, drop_last=False)\n    \n    return test_loader, xyxys\n\n# %%\nclass PytorchDataSet(Dataset):\n    \n    def __init__(self, images, transform=None):\n        self.images = images\n        self.transform = transform\n\n    def __len__(self):\n        # return len(self.df)\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        image = self.images[idx]\n\n        if self.transform:\n            data = self.transform(image=image)\n            image = data['image']\n\n        return image\n\n# %% [markdown]\n# # 6. model\n\n# %%\n# シグモイド関数の定義\ndef sigmoid(a):\n    return 1 / (1 + np.exp(-a))\n\n\ndef softmax(x):\n    \n    f_x = np.exp(x) / np.sum(np.exp(x))\n    return f_x\n\n# %%\nfrom transformers import AutoTokenizer, UperNetForSemanticSegmentation,SegformerForSemanticSegmentation\n\n# %%\nclass HugNet(nn.Module):\n\n\n    def __init__(self):\n        super(HugNet,self).__init__() \n        self.cfg = cfg\n\n        self.model = SegformerForSemanticSegmentation.from_pretrained(cfg.modelpath,num_labels=1,ignore_mismatched_sizes=True)\n        \n   #     self.model = UperNetForSemanticSegmentation.from_pretrained(cfg.modelpath)\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.model(img)\n        output = output[\"logits\"]\n        output = nn.functional.interpolate(output, size=img.shape[-2:], mode=\"bilinear\", align_corners=False) # 4倍にする\n\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %%\nclass Net(nn.Module):\n\n\n    def __init__(self):\n        super(Net,self).__init__() \n        self.encoder = smp.Unet(\n            encoder_name=cfg.modelname, \n            encoder_weights=None,\n            in_channels=cfg.in_chans,\n            classes=cfg.target_size,\n            activation=None,\n        )\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.encoder(img)\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %% [markdown]\n# ## 6.1 model load\n\n# %%\n\n\n# %%\nallmodels = []\n\n\nif cfg.debug:\n        cfg.usemodels = [11,12,4,5,6,13,14,10]\n        \n    \nfor fold in cfg.usemodels:\n    \n    print(fold)\n    \n    if cfg.modeltype == \"huggingface\":\n        model = HugNet()\n    else:\n        model = Net()\n    model.to(device)\n    \n    model_path = f\"{cfg.modelpath}/model{fold}.pth\"\n    state = torch.load(model_path)['state_dict']\n    model.load_state_dict(state)\n    model.eval()\n        \n    allmodels.append(model)\n    \n    del state\n    del model\n    \n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n# %%\nfragment_ids = sorted(os.listdir(cfg.inputpath))\nfragment_ids\n\n# %% [markdown]\n# # 7.inference func\n\n# %%\ndef inference(images):\n    preds = np.mean([model(images) for model in allmodels],axis=0)\n    return preds           \n\n# %% [markdown]\n# # 8.main\n\n# %%\ndef make_maskpred(test_loader,xyxys):\n    \n        binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n        binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n        \n        if cfg.debug:\n            binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n        binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n        del binary_mask_2\n\n        \n        \n        \n        # 追加\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n        binary_mask = (binary_mask / 255).astype(int)\n\n        ori_h = binary_mask.shape[0]\n        ori_w = binary_mask.shape[1]\n        # mask = mask / 255\n\n        pad0 = (CFG.tile_size - binary_mask.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - binary_mask.shape[1] % CFG.tile_size)\n\n        binary_mask = np.pad(binary_mask, [(0, pad0), (0, pad1)], constant_values=0)\n\n        mask_pred = np.zeros(binary_mask.shape)\n        mask_count = np.zeros(binary_mask.shape)\n\n        for step, (images) in tqdm(enumerate(test_loader), total=len(test_loader)):\n\n            allpreds = []\n\n            images = images.to(device)\n            batch_size = images.size(0)\n\n            with torch.no_grad():\n                               \n                y_preds = inference(images)\n                allpreds.append(y_preds)\n\n            if cfg.tta1:\n\n                images2 =  torch.flip(images,[2])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,:]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            if cfg.tta2:\n\n                images2 =  torch.flip(images,[3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,:,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n\n            if cfg.tta3:\n\n                images2 =  torch.flip(images,[2,3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            y_preds = np.mean(np.array(allpreds),axis=0)\n\n            del images\n            \n            if cfg.tta1 + cfg.tta2 + cfg.tta3 >0:\n                del images2\n            \n            gc.collect()\n            torch.cuda.empty_cache()\n\n            start_idx = step*CFG.batch_size\n            end_idx = start_idx + batch_size\n            for i, (x1, y1, x2, y2) in enumerate(xyxys[start_idx:end_idx]):\n                mask_pred[y1:y2, x1:x2] += y_preds[i].squeeze(0)\n                mask_count[y1:y2, x1:x2] += np.ones((CFG.tile_size, CFG.tile_size))\n\n      #  plt.imshow(mask_count)\n      #  plt.show()\n\n        print(f'mask_count_min: {mask_count.min()}')\n        mask_pred /= mask_count\n\n        mask_pred = mask_pred[:ori_h, :ori_w]\n        binary_mask = binary_mask[:ori_h, :ori_w]\n\n        \n        del mask_count\n        \n        \n        return mask_pred\n\n\n# %%\nif cfg.debug:\n    judge = True\n\n# %%\nif judge:\n    \n    \n\n    results = []\n    binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n    del binary_mask_2\n    \n    \n\n    #追加\n    binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n\n    test_loader, xyxys = make_test_dataset(28)        \n    mask_pred = make_maskpred(test_loader,xyxys) * 1/3\n    del test_loader\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader2, xyxys = make_test_dataset(30)\n    mask_pred += make_maskpred(test_loader2,xyxys) * 1/3\n    del test_loader2\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader3, xyxys = make_test_dataset(32)\n    mask_pred += make_maskpred(test_loader3,xyxys) * 1/3\n    del test_loader3\n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n\n    # 追加\n    mask_pred = np.where(binary_mask==0,0,mask_pred)\n    mask_pred = np.where(np.isnan(mask_pred),0,mask_pred)\n    mask_pred = cv2.rotate(mask_pred, cv2.ROTATE_90_COUNTERCLOCKWISE) # もとに戻して保存\n\n    np.save(f\"mask_pred_exp208\",mask_pred)\n\n    \n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 5. exp143 segformer b3 1024","metadata":{}},{"cell_type":"code","source":"%%python\n\n\n# %% [markdown]\n# # 1.import and setting\n\n# %%\n\nfrom sklearn.metrics import roc_auc_score, accuracy_score, f1_score, log_loss\nimport pickle\nfrom torch.utils.data import DataLoader\nfrom torch.cuda.amp import autocast, GradScaler\nimport warnings\nimport sys\nimport pandas as pd\nimport os\nimport gc\nimport sys\nimport math\nimport time\nimport random\nimport shutil\nfrom pathlib import Path\nfrom contextlib import contextmanager\nfrom collections import defaultdict, Counter\nimport cv2\n\nimport scipy as sp\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nfrom tqdm.auto import tqdm\nfrom functools import partial\n\nimport argparse\nimport importlib\nimport torch\nimport torch.nn as nn\nfrom torch.optim import Adam, SGD, AdamW\n\nimport datetime\nimport wandb\n\n# %%\nsys.path.append('/kaggle/input/pretrainedmodels/pretrainedmodels-0.7.4')\nsys.path.append('/kaggle/input/efficientnet-pytorch/EfficientNet-PyTorch-master')\n#sys.path.append('/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master')\nsys.path.append('/kaggle/input/d/chumajin/segmentation-models-pytorch/segmentation_models.pytorch-master')\n\nimport segmentation_models_pytorch as smp\n\n# %%\nimport numpy as np\nfrom torch.utils.data import DataLoader, Dataset\nimport cv2\nimport torch\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import ImageOnlyTransform\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ndevice\n\n# %% [markdown]\n# # 2.CFG\n\n# %%\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\nclass CFG:\n    \n    # ============== 1. inference set =============\n    \n    inputpath = \"/kaggle/input/vesuvius-challenge-ink-detection/test\"\n    \n    modelpath = \"/kaggle/input/kazan-exp143\"\n    \n    tta1 = True\n    tta2 = False\n    tta3 = False\n    \n    debug = False\n    \n    usemodels = [11,12,4,5,6,13,14]\n\n    batch_size = 4 # 32\n    \n    TH = 0.96\n    \n    size = 1024\n    tile_size = 1024\n    stride = tile_size // 4\n    in_chans = 3 # 65\n\n    num_workers = 2\n\n    # ============== 3. model =============\n    \n    target_size = 1\n    \n    modeltype = \"huggingface\" # huggingface, timm-unet,segmentation_models_pytorch\n\n    modelname = \"nvidia/segformer-b3-finetuned-cityscapes-1024-1024\" #  segmentation_models_pytorchの場合tuをつける 'tu-tf_efficientnetv2_xl_in21ft1k'\n\ncfg = CFG()\n\n# %% [markdown]\n# # 3. judgement (easy commit)\n\n# %%\nimg = cv2.imread(\"/kaggle/input/vesuvius-challenge-ink-detection/test/a/mask.png\",0)\nnp.sum(img)\n\n# %%\nori_h_fraga = img.shape[0]\nori_w_fraga = img.shape[1]\n\n# %%\njudge = np.sum(img) != 2758825365\njudge\n\n# %% [markdown]\n# # 4. Aug\n\n# %%\n# Albumentations for augmentations\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\n# %%\nif cfg.in_chans != 3:\n\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n              mean= [0] * cfg.in_chans,\n              std= [1] * cfg.in_chans\n          ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\nelse:\n  aug = {\n      \"valid\": A.Compose([\n          A.Resize(cfg.size, cfg.size),\n          A.Normalize(\n                mean=[0.485, 0.456, 0.406], \n                std=[0.229, 0.224, 0.225], \n                max_pixel_value=255.0, \n                p=1.0\n            ),\n        \n          ToTensorV2(transpose_mask=True)], p=1.)\n  }\n\n\n\n# %%\naug\n\n# %% [markdown]\n# # 5. Prepare Data and Dataset\n\n# %%\ndef read_image(mid):\n    images = []\n\n    # idxs = range(65)\n#    mid = 28\n\n    amari = CFG.in_chans % 2\n    start = mid - CFG.in_chans // 2\n    end = mid + CFG.in_chans // 2 + amari\n    idxs = range(start, end)\n\n    for i in tqdm(idxs):\n        \n        image = cv2.imread(f\"{cfg.inputpath}/a/surface_volume/{i:02}.tif\", 0)\n        image2 = cv2.imread(f\"{cfg.inputpath}/b/surface_volume/{i:02}.tif\", 0)\n\n        if cfg.debug:\n            image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            image2 = cv2.rotate(image2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        \n        image = np.concatenate([image,image2],axis=1)\n        \n        del image2\n        \n        # 追加\n        image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)\n\n        pad0 = (CFG.tile_size - image.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - image.shape[1] % CFG.tile_size)\n\n        image = np.pad(image, [(0, pad0), (0, pad1)], constant_values=0)\n\n        images.append(image)\n    images = np.stack(images, axis=2)\n    \n    ## mask make\n    mask2 = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    mask2_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        mask2 = cv2.rotate(mask2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        mask2_2 = cv2.rotate(mask2_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    mask2 = np.concatenate([mask2,mask2_2],axis=1)\n\n    del mask2_2\n    \n    \n    \n    \n    #　追加\n    mask2 = cv2.rotate(mask2, cv2.ROTATE_90_CLOCKWISE)\n    mask2 = np.pad(mask2, [(0, pad0), (0, pad1)], constant_values=0)\n\n    mask2 = mask2.astype('float32')\n    mask2 /= 255.0 # 正規化 ?\n    \n    return images,mask2\n\n# %%\ndef make_test_dataset(mid):\n    test_images,mask2 = read_image(mid)\n    \n    \n    x1_list = list(range(0, test_images.shape[1]-CFG.tile_size+1, CFG.stride))\n    y1_list = list(range(0, test_images.shape[0]-CFG.tile_size+1, CFG.stride))\n    \n    test_images_list = []\n    xyxys = []\n    valid_masks2 = []\n    for y1 in y1_list:\n        for x1 in x1_list:\n            y2 = y1 + CFG.tile_size\n            x2 = x1 + CFG.tile_size\n            \n            test_images_list.append(test_images[y1:y2, x1:x2])\n            xyxys.append((x1, y1, x2, y2))\n            \n            valid_masks2.append(np.sum(mask2[y1:y2, x1:x2]))\n            \n            \n    test_images_list = [image for image,judge in tqdm(zip(test_images_list,valid_masks2)) if judge != 0]\n    xyxys = [xyxy for xyxy,judge in tqdm(zip(xyxys,valid_masks2)) if judge != 0]\n            \n    xyxys = np.stack(xyxys)\n    \n    \n            \n    test_dataset = PytorchDataSet(test_images_list, transform=aug[\"valid\"])\n    \n    test_loader = DataLoader(test_dataset,\n                          batch_size=CFG.batch_size,\n                          shuffle=False,\n                          num_workers=CFG.num_workers, pin_memory=True, drop_last=False)\n    \n    return test_loader, xyxys\n\n# %%\nclass PytorchDataSet(Dataset):\n    \n    def __init__(self, images, transform=None):\n        self.images = images\n        self.transform = transform\n\n    def __len__(self):\n        # return len(self.df)\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        image = self.images[idx]\n\n        if self.transform:\n            data = self.transform(image=image)\n            image = data['image']\n\n        return image\n\n# %% [markdown]\n# # 6. model\n\n# %%\n# シグモイド関数の定義\ndef sigmoid(a):\n    return 1 / (1 + np.exp(-a))\n\n\ndef softmax(x):\n    \n    f_x = np.exp(x) / np.sum(np.exp(x))\n    return f_x\n\n# %%\nfrom transformers import AutoTokenizer, UperNetForSemanticSegmentation,SegformerForSemanticSegmentation\n\n# %%\nclass HugNet(nn.Module):\n\n\n    def __init__(self):\n        super(HugNet,self).__init__() \n        self.cfg = cfg\n\n        self.model = SegformerForSemanticSegmentation.from_pretrained(cfg.modelpath)\n        \n   #     self.model = UperNetForSemanticSegmentation.from_pretrained(cfg.modelpath)\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.model(img)\n        output = output[\"logits\"]\n        output = nn.functional.interpolate(output, size=img.shape[-2:], mode=\"bilinear\", align_corners=False) # 4倍にする\n\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %%\nclass Net(nn.Module):\n\n\n    def __init__(self):\n        super(Net,self).__init__() \n        self.encoder = smp.Unet(\n            encoder_name=cfg.modelname, \n            encoder_weights=None,\n            in_channels=cfg.in_chans,\n            classes=cfg.target_size,\n            activation=None,\n        )\n\n    \n    def forward(self,img,targets=None,mode=None): \n\n        output = self.encoder(img)\n        return sigmoid(output.detach().cpu().numpy())\n\n\n# %% [markdown]\n# ## 6.1 model load\n\n# %%\n\n\n# %%\nallmodels = []\n\n\nif cfg.debug:\n        cfg.usemodels = [11,12,4,5,6,13,14]\n        \n    \nfor fold in cfg.usemodels:\n    \n    print(fold)\n    \n    if cfg.modeltype == \"huggingface\":\n        model = HugNet()\n    else:\n        model = Net()\n    model.to(device)\n    \n    model_path = f\"{cfg.modelpath}/model{fold}.pth\"\n    state = torch.load(model_path)['state_dict']\n    model.load_state_dict(state)\n    model.eval()\n        \n    allmodels.append(model)\n    \n    del state\n    del model\n    \n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n# %%\nfragment_ids = sorted(os.listdir(cfg.inputpath))\nfragment_ids\n\n# %% [markdown]\n# # 7.inference func\n\n# %%\ndef inference(images):\n    preds = np.mean([model(images) for model in allmodels],axis=0)\n    return preds           \n\n# %% [markdown]\n# # 8.main\n\n# %%\ndef make_maskpred(test_loader,xyxys):\n    \n        binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n        binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n        \n        if cfg.debug:\n            binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n            binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n        binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n        del binary_mask_2\n\n        \n        \n        \n        # 追加\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n        binary_mask = (binary_mask / 255).astype(int)\n\n        ori_h = binary_mask.shape[0]\n        ori_w = binary_mask.shape[1]\n        # mask = mask / 255\n\n        pad0 = (CFG.tile_size - binary_mask.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - binary_mask.shape[1] % CFG.tile_size)\n\n        binary_mask = np.pad(binary_mask, [(0, pad0), (0, pad1)], constant_values=0)\n\n        mask_pred = np.zeros(binary_mask.shape)\n        mask_count = np.zeros(binary_mask.shape)\n\n        for step, (images) in tqdm(enumerate(test_loader), total=len(test_loader)):\n\n            allpreds = []\n\n            images = images.to(device)\n            batch_size = images.size(0)\n\n            with torch.no_grad():\n                               \n                y_preds = inference(images)\n                allpreds.append(y_preds)\n\n            if cfg.tta1:\n\n                images2 =  torch.flip(images,[2])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,:]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            if cfg.tta2:\n\n                images2 =  torch.flip(images,[3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,:,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n\n            if cfg.tta3:\n\n                images2 =  torch.flip(images,[2,3])\n                with torch.no_grad():\n                    y_preds = inference(images2)\n                    y_preds = y_preds[:,:,::-1,::-1]\n\n                # make whole mask\n                allpreds.append(y_preds)\n\n            y_preds = np.mean(np.array(allpreds),axis=0)\n\n            del images\n            \n            if cfg.tta1 + cfg.tta2 + cfg.tta3 >0:\n                del images2\n            \n            gc.collect()\n            torch.cuda.empty_cache()\n\n            start_idx = step*CFG.batch_size\n            end_idx = start_idx + batch_size\n            for i, (x1, y1, x2, y2) in enumerate(xyxys[start_idx:end_idx]):\n                mask_pred[y1:y2, x1:x2] += y_preds[i].squeeze(0)\n                mask_count[y1:y2, x1:x2] += np.ones((CFG.tile_size, CFG.tile_size))\n\n      #  plt.imshow(mask_count)\n      #  plt.show()\n\n        print(f'mask_count_min: {mask_count.min()}')\n        mask_pred /= mask_count\n\n        mask_pred = mask_pred[:ori_h, :ori_w]\n        binary_mask = binary_mask[:ori_h, :ori_w]\n\n        \n        del mask_count\n        \n        \n        return mask_pred\n\n\n# %%\nif cfg.debug:\n    judge = True\n\n# %%\nif judge:\n    \n    \n\n    results = []\n    binary_mask = cv2.imread(f\"{cfg.inputpath}/a/mask.png\", 0)\n    binary_mask_2 = cv2.imread(f\"{cfg.inputpath}/b/mask.png\", 0)\n\n    if cfg.debug:\n        binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_COUNTERCLOCKWISE)\n        binary_mask_2 = cv2.rotate(binary_mask_2, cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n    binary_mask = np.concatenate([binary_mask,binary_mask_2],axis=1)\n\n    del binary_mask_2\n    \n    \n\n    #追加\n    binary_mask = cv2.rotate(binary_mask, cv2.ROTATE_90_CLOCKWISE)\n\n    test_loader, xyxys = make_test_dataset(26)        \n    mask_pred = make_maskpred(test_loader,xyxys) * 1/3\n    del test_loader\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader2, xyxys = make_test_dataset(29)\n    mask_pred += make_maskpred(test_loader2,xyxys) * 1/3\n    del test_loader2\n    gc.collect()\n    torch.cuda.empty_cache()\n\n    test_loader3, xyxys = make_test_dataset(32)\n    mask_pred += make_maskpred(test_loader3,xyxys) * 1/3\n    del test_loader3\n    gc.collect()\n    torch.cuda.empty_cache()\n\n\n\n    # 追加\n    mask_pred = np.where(binary_mask==0,0,mask_pred)\n    mask_pred = np.where(np.isnan(mask_pred),0,mask_pred)\n    mask_pred = cv2.rotate(mask_pred, cv2.ROTATE_90_COUNTERCLOCKWISE) # もとに戻して保存\n    \n    \n    ## ここから下を削除して以下を追加\n    \n    np.save(f\"mask_pred_exp143\",mask_pred)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 6 ensemble","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport cv2\nimport matplotlib.pyplot as plt\nimport os","metadata":{"execution":{"iopub.status.busy":"2023-06-05T23:08:50.081956Z","iopub.execute_input":"2023-06-05T23:08:50.08229Z","iopub.status.idle":"2023-06-05T23:08:50.088861Z","shell.execute_reply.started":"2023-06-05T23:08:50.082252Z","shell.execute_reply":"2023-06-05T23:08:50.087735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TH = 0.96\ndebug = False","metadata":{"execution":{"iopub.status.busy":"2023-06-05T23:08:50.090008Z","iopub.execute_input":"2023-06-05T23:08:50.091239Z","iopub.status.idle":"2023-06-05T23:08:50.102477Z","shell.execute_reply.started":"2023-06-05T23:08:50.091199Z","shell.execute_reply":"2023-06-05T23:08:50.101404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = cv2.imread(\"/kaggle/input/vesuvius-challenge-ink-detection/test/a/mask.png\",0)\n\n# %%\nori_h_fraga = img.shape[0]\nori_w_fraga = img.shape[1]\n\nfragment_ids = sorted(os.listdir(\"/kaggle/input/vesuvius-challenge-ink-detection/test\"))\nprint(fragment_ids)\n\n\n\n# %%\njudge = np.sum(img) != 2758825365\njudge\n","metadata":{"execution":{"iopub.status.busy":"2023-06-05T23:14:45.562089Z","iopub.execute_input":"2023-06-05T23:14:45.562763Z","iopub.status.idle":"2023-06-05T23:14:45.665463Z","shell.execute_reply.started":"2023-06-05T23:14:45.562721Z","shell.execute_reply":"2023-06-05T23:14:45.664355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if debug:\n    judge = False","metadata":{"execution":{"iopub.status.busy":"2023-06-05T23:14:47.060694Z","iopub.execute_input":"2023-06-05T23:14:47.061671Z","iopub.status.idle":"2023-06-05T23:14:47.066978Z","shell.execute_reply.started":"2023-06-05T23:14:47.061613Z","shell.execute_reply":"2023-06-05T23:14:47.06591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle(img):\n    '''\n    img: numpy array, 1 - mask, 0 - background\n    Returns run length as string formated\n    '''\n    pixels = img.flatten()\n    # pixels = (pixels >= thr).astype(int)\n    \n    pixels = np.concatenate([[0], pixels, [0]])\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n    runs[1::2] -= runs[::2]\n    \n    runs[::2] = np.where(runs[::2]>0,runs[::2]-1,runs[::2])\n    \n    \n    return ' '.join(str(x) for x in runs)\n\n# %%\ndef get_ranking(array):\n     org_shape = array.shape\n     array = array.reshape(-1)\n     array = np.arange(len(array))[array.argsort().argsort()]\n     array = array / array.max()\n     array = array.reshape(org_shape)\n     return array","metadata":{"execution":{"iopub.status.busy":"2023-06-05T23:14:47.382423Z","iopub.execute_input":"2023-06-05T23:14:47.383549Z","iopub.status.idle":"2023-06-05T23:14:47.393447Z","shell.execute_reply.started":"2023-06-05T23:14:47.383465Z","shell.execute_reply":"2023-06-05T23:14:47.392391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_rank_pred(exp):\n    mask_pred = np.load(f\"mask_pred_exp{exp}.npy\")\n    mask_pred = get_ranking(mask_pred)\n    return mask_pred","metadata":{"execution":{"iopub.status.busy":"2023-06-05T23:14:48.132021Z","iopub.execute_input":"2023-06-05T23:14:48.133012Z","iopub.status.idle":"2023-06-05T23:14:48.138923Z","shell.execute_reply.started":"2023-06-05T23:14:48.132957Z","shell.execute_reply":"2023-06-05T23:14:48.137743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %%\nif judge:\n    \n    pred1 = load_rank_pred(143)\n    pred2 = load_rank_pred(177)\n    pred3 = load_rank_pred(93)\n    pred4 = load_rank_pred(129)\n    pred5 = load_rank_pred(208)\n    \n    mask_pred = pred1 * 1/5 + pred2 * 1/5 + pred3 * 1/5 + pred4 * 1/5 + pred5 * 1/5\n    mask_pred = get_ranking(mask_pred)\n    \n    mask_pred = (mask_pred > TH).astype(int)\n    results = []\n\n\n    for num,fragment_id in enumerate(fragment_ids):\n\n        if num == 0:\n            mask_pred_new = mask_pred[:,:ori_w_fraga]\n        else:\n            mask_pred_new = mask_pred[:,ori_w_fraga:]\n\n        print(mask_pred_new.shape)\n\n        inklabels_rle = rle(mask_pred_new)\n        results.append((fragment_id, inklabels_rle))","metadata":{"execution":{"iopub.status.busy":"2023-06-05T23:14:48.542964Z","iopub.execute_input":"2023-06-05T23:14:48.543355Z","iopub.status.idle":"2023-06-05T23:15:15.762795Z","shell.execute_reply.started":"2023-06-05T23:14:48.54332Z","shell.execute_reply":"2023-06-05T23:15:15.761568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %%\nif judge:\n    \n    sub = pd.DataFrame(results, columns=['Id', 'Predicted'])\n    sample_sub = pd.read_csv(\"/kaggle/input/vesuvius-challenge-ink-detection/sample_submission.csv\")\n    sample_sub = pd.merge(sample_sub[['Id']], sub, on='Id', how='left')\n    sample_sub.to_csv(\"submission.csv\", index=False)\nelse:\n    sample = pd.read_csv(\"/kaggle/input/vesuvius-challenge-ink-detection/sample_submission.csv\")\n    sample.to_csv(\"submission.csv\", index=False)\n\n# %%","metadata":{"execution":{"iopub.status.busy":"2023-06-05T23:15:15.764852Z","iopub.execute_input":"2023-06-05T23:15:15.765919Z","iopub.status.idle":"2023-06-05T23:15:15.804031Z","shell.execute_reply.started":"2023-06-05T23:15:15.765874Z","shell.execute_reply":"2023-06-05T23:15:15.803053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}