{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":47317,"databundleVersionId":5799376,"sourceType":"competition"},{"sourceId":699609,"sourceType":"datasetVersion","datasetId":255887},{"sourceId":3492503,"sourceType":"datasetVersion","datasetId":2102274},{"sourceId":5395414,"sourceType":"datasetVersion","datasetId":3127116},{"sourceId":6125024,"sourceType":"datasetVersion","datasetId":3292166,"isSourceIdPinned":true},{"sourceId":6125037,"sourceType":"datasetVersion","datasetId":3321252,"isSourceIdPinned":true},{"sourceId":6125057,"sourceType":"datasetVersion","datasetId":3343886,"isSourceIdPinned":true},{"sourceId":6125080,"sourceType":"datasetVersion","datasetId":3379925,"isSourceIdPinned":true},{"sourceId":6125111,"sourceType":"datasetVersion","datasetId":3270244,"isSourceIdPinned":true}],"dockerImageVersionId":30408,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# tf_efficientnet","metadata":{}},{"cell_type":"code","source":"%%python\n\n#1.导入包和设置配置文件\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\n#2.CFG\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\n#3. judgement\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#4. Aug\n\n# Albumentations\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\naug\n\n\n#5. 准备数据和数据集\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\n#6. 模型\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\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\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\n#6.1 模型加载\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\n#7.inference func\ndef inference(images):\n    preds = np.mean([model(images) for model in allmodels],axis=0)\n    return preds           \n\n\n#8.main\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\nif cfg.debug:\n    judge = True\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":{"iopub.status.busy":"2023-12-26T00:43:52.903537Z","iopub.execute_input":"2023-12-26T00:43:52.903896Z","iopub.status.idle":"2023-12-26T00:44:52.229701Z","shell.execute_reply.started":"2023-12-26T00:43:52.903866Z","shell.execute_reply":"2023-12-26T00:44:52.228601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# segformer","metadata":{}},{"cell_type":"code","source":"%%python\n\n\n#1.导入和设置\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\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\n# 2.CFG\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\n#3. judgement\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\n#4. Aug\n\n\n# Albumentations\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\naug\n\n\n#5. 准备数据\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\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\n#6. 模型\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\n#6.1 模型加载\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\nfragment_ids = sorted(os.listdir(cfg.inputpath))\nfragment_ids\n\n\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# 8.main\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        del mask_count\n        \n        return mask_pred\n\n\nif cfg.debug:\n    judge = True\n\nif judge:\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    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    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_exp143\",mask_pred)","metadata":{"execution":{"iopub.status.busy":"2023-12-26T00:44:52.231984Z","iopub.execute_input":"2023-12-26T00:44:52.232326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}