{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import sys\nsys.path.append('/kaggle/input/ink-00/my_lib')\nsys.path.append('/kaggle/input/pretrainedmodels/pretrainedmodels-0.7.4')\nsys.path.append('/kaggle/input/efficientnet-pytorch/EfficientNet-PyTorch-master')\nsys.path.append('/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master')\nsys.path.append('/kaggle/input/segmentation-models-pytorch/segmentation_models.pytorch-master')\nsys.path.append('/kaggle/input/einops/einops-master')\n\nfrom helper import *\nimport hashlib\nimport numpy as np\nimport pandas as pd\n\nfrom collections import defaultdict\nfrom glob import glob\nimport PIL.Image as Image\nImage.MAX_IMAGE_PIXELS = 10000000000  # Ignore PIL warnings about large images\n\nimport cv2\nimport gc\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nimport matplotlib\nimport matplotlib.pyplot as plt\n#matplotlib.use('TkAgg')\n%matplotlib inline \n  \nprint('import ok !!!')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-07-11T20:41:08.955099Z","iopub.execute_input":"2023-07-11T20:41:08.955844Z","iopub.status.idle":"2023-07-11T20:41:13.773700Z","shell.execute_reply.started":"2023-07-11T20:41:08.955807Z","shell.execute_reply":"2023-07-11T20:41:13.772732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mode = [\n    #'train', #\n    'test', #'skip_fake_test',\n]\n\n\n## dataset ##\nif 'train' in mode:\n    data_dir = '/kaggle/input/vesuvius-challenge-ink-detection/train'\n    valid_id =[\n        '1',#'2b',\n    ]\n\nif 'test' in mode: \n    data_dir = '/kaggle/input/vesuvius-challenge-ink-detection/test'\n    valid_id = glob(f'{data_dir}/*')\n    valid_id = sorted(valid_id)\n    valid_id = [f.split('/')[-1] for f in valid_id]\n\n    # https://www.kaggle.com/competitions/vesuvius-challenge-ink-detection/discussion/410985\n    a_file = f'{data_dir}/a/mask.png'\n    with open(a_file,'rb') as f:\n        hash_md5 = hashlib.md5(f.read()).hexdigest()\n    is_skip_test = hash_md5 == '0b0fffdc0e88be226673846a143bb3e0'\n    print('is_skip_test:',is_skip_test)\n\n#---\nprint('data_dir', data_dir)\nprint('valid_id', valid_id)\n\ndef do_binarise(m, threshold=0.5):\n    m = m-m.min()\n    m = m/(m.max()+1e-7)\n    m = (m>threshold).astype(np.float32)\n    return m\n\ndef read_data(fragment_id, z0, z1):\n    volume = []\n    start_timer = timer()\n    for i in range(z0,z1):\n        v = np.array(Image.open(f'{data_dir}/{fragment_id}/surface_volume/{i:02d}.tif'), dtype=np.uint16)\n        v = (v >> 8).astype(np.uint8)\n        #v = (v / 65535.0 * 255).astype(np.uint8)\n        volume.append(v)\n        print(f'\\r @ read_data(): volume{fragment_id}  {time_to_str(timer() - start_timer, \"sec\")}', end='', flush=True)\n    #print('')\n    volume = np.stack(volume, -1)\n    height, width, depth = volume.shape\n    #print(f'fragment_id={fragment_id} volume: {volume.shape}')\n\n    #---\n    mask = cv2.imread(f'{data_dir}/{fragment_id}/mask.png',cv2.IMREAD_GRAYSCALE)\n    mask = do_binarise(mask)\n\n    if 'train' in mode:\n        ir    = cv2.imread(f'{data_dir}/{fragment_id}/ir.png',cv2.IMREAD_GRAYSCALE)\n        label = cv2.imread(f'{data_dir}/{fragment_id}/inklabels.png',cv2.IMREAD_GRAYSCALE)\n        ir    = ir/255\n        label = do_binarise(label)\n\n    if 'test' in mode:\n        ir = None\n        label = None\n\n    d = dotdict(\n        fragment_id = fragment_id,\n        volume = volume,\n        ir     = ir,\n        label  = label,\n        mask   = mask,\n    )\n    return d\n\ndef read_data1(fragment_id, z0, z1):\n    if fragment_id=='2a':\n        y = 9456\n        d = read_data('2', z0, z1)\n        d = dotdict(\n            fragment_id=fragment_id,\n            volume  = d.volume[:y],\n            ir      = d.ir[:y],\n            label   = d.label[:y],\n            mask    = d.mask[:y],\n        )\n    elif  fragment_id=='2b':\n        y = 9456\n        d = read_data('2', z0, z1)\n        d = dotdict(\n            fragment_id=fragment_id,\n            volume  = d.volume[y:],\n            ir      = d.ir[y:],\n            label   = d.label[y:],\n            mask    = d.mask[y:],\n        )\n    elif  fragment_id=='2aa':\n        y0,y1 = 0, 7074\n        d = read_data('2', z0, z1)\n        d = dotdict(\n            fragment_id=fragment_id,\n            volume  = d.volume[y0:y1],\n            ir      = d.ir[y0:y1],\n            label   = d.label[y0:y1],\n            mask    = d.mask[y0:y1],\n        )\n\n\n    else:\n        d = read_data(fragment_id, z0, z1)\n    return d\n\n\ndef run_check_data():\n    d=read_data1('1', z0=32-16, z1=32+16)\n    print('')\n    print('fragment_id:', d.fragment_id)\n    print('volume:', d.volume.shape, d.volume.min(), d.volume.max())\n    print('ir    :', d.ir.shape, d.ir.min(), d.ir.max())\n    print('label :', d.label.shape, d.label.min(), d.label.max())\n    print('mask  :', d.mask.shape, d.mask.min(), d.mask.max())\n\n#run_check_data()\nprint('data ok !!!')","metadata":{"execution":{"iopub.status.busy":"2023-07-11T20:41:13.779584Z","iopub.execute_input":"2023-07-11T20:41:13.782978Z","iopub.status.idle":"2023-07-11T20:41:13.862604Z","shell.execute_reply.started":"2023-07-11T20:41:13.782940Z","shell.execute_reply":"2023-07-11T20:41:13.861705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"###### infer here !!!!\ndef print_cfg(cfg):\n    print('cfg')\n    for key, value in cfg.items():\n        print('\\t' + str(key), ':', value)\n\ndef make_infer_mask(cfg):\n    s = cfg.crop_size\n    f = cfg.crop_fade\n    x = np.linspace(-1, 1, s)\n    y = np.linspace(-1, 1, s)\n    xx, yy = np.meshgrid(x, y)\n    d = 1 - np.maximum(np.abs(xx), np.abs(yy))\n    d1 = np.clip(d, 0, f / s * 2)\n    d1 = d1 / d1.max()\n    infer_mask = d1\n    return infer_mask\n\n\ndef infer_one_ms(net, d, cfg):\n    infer_mask = make_infer_mask(cfg)\n\n    d_volume = np.ascontiguousarray(d.volume[..., cfg.z0:cfg.z1])\n    #print(d_volume.sum(0).sum(0)); exit(0)\n    H,W,D = d_volume.shape\n\n    probability = np.zeros((H, W))\n    count = np.zeros((H, W))\n    for s in cfg.tta_scale:  #\n        print(f'\\nscale @ {s}')\n        if s == 1:\n            scale_volume = d_volume\n        else:\n            scale_volume = cv2.resize(d_volume, dsize=None, fx=s, fy=s)\n\n        ##pad #assume H,W >size\n        sH, sW, D = scale_volume.shape\n        px, py = sW % cfg.stride, sH % cfg.stride\n        if (px != 0) or (py != 0):\n            px = cfg.stride - px\n            py = cfg.stride - py\n            pad_volume = np.pad(scale_volume, [(0, py), (0, px), (0, 0)], constant_values=0)\n        else:\n            pad_volume = scale_volume\n\n\n        pH, pW, _ = pad_volume.shape\n        x = np.arange(0, pW - cfg.crop_size + 1, cfg.stride)\n        y = np.arange(0, pH - cfg.crop_size + 1, cfg.stride)\n        x, y = np.meshgrid(x, y)\n        xy = np.stack([x, y], -1).reshape(-1, 2)\n        print('H,W -> sH,sW ->  pH,pW,len(xy) : ',H,W,'->',sH,sW,'->',pH,pW,len(xy))\n\n        batch_iter = []\n        for t in range(0,len(xy),cfg.batch_size):\n            batch_iter.append(xy[t:t+cfg.batch_size])\n\n        #----\n        scale_probability = np.zeros((pH,pW))\n        scale_count = np.zeros((pH,pW))\n\n        start_timer = timer()\n        for t, xy0 in enumerate(batch_iter):\n            #print('\\r', t, len(batch_iter), end='')\n\n            volume =[]\n            for x0,y0 in xy0 :\n                v = pad_volume[y0:y0 + cfg.crop_size, x0:x0 + cfg.crop_size]\n                volume.append(v)\n            volume = np.stack(volume)\n            volume = np.ascontiguousarray(volume.transpose(0,3,1,2))\n            volume = volume/255\n            volume = torch.from_numpy(volume).float().cuda()\n            ##print(volume.shape)\n\n            batch = { 'volume': volume }\n\n            with torch.no_grad():\n                with torch.cuda.amp.autocast(enabled=cfg.amp):\n\n                    if not cfg.tta_rot:\n                        output = net(batch)\n                        ink = output['ink'] \n                        k = ink.data.cpu().numpy()\n\n\n                    #--\n                    if cfg.tta_rot: #tta\n                        pass\n\n                        batch = {\n                            'volume': torch.cat([\n                                volume,\n                                torch.rot90(volume, k=1, dims=(-2, -1)),\n                                torch.rot90(volume, k=2, dims=(-2, -1)),\n                                torch.rot90(volume, k=3, dims=(-2, -1)),\n                            ],0)\n                        }\n                        output = net(batch)\n                        ink = output['ink']\n\n                        B,_,h,w = volume.shape\n                        ink = ink.reshape(4, B, 1, h, w)\n                        ink = torch.stack([\n                            ink[0],\n                            torch.rot90(ink[1], k=-1, dims=(-2, -1)),\n                            torch.rot90(ink[2], k=-2, dims=(-2, -1)),\n                            torch.rot90(ink[3], k=-3, dims=(-2, -1)),\n                        ], dim=0).mean(0)\n                        k = ink.data.cpu().numpy()\n\n            ##print(k.shape)\n            for b in range(len(k)):\n                x0,y0 = xy0[b]\n                scale_probability[y0:y0 + cfg.crop_size, x0:x0 + cfg.crop_size] += k[b,0]*infer_mask\n                scale_count[y0:y0 + cfg.crop_size, x0:x0 + cfg.crop_size] += infer_mask\n            print(f'\\r @infer_one(): {t} / {len(batch_iter)} : {time_to_str(timer() - start_timer, \"sec\")}', end='', flush=True)\n            \n            torch.cuda.empty_cache()\n            del volume, ink, k, v, batch['volume'], batch\n            del output['ink'], output\n            gc.collect()\n            \n        ##-----------------\n        scale_probability = scale_probability / (scale_count + 0.000001)\n        scale_probability = scale_probability[:sH, :sW]\n        if s == 1:\n            p = scale_probability\n        else:\n            p = cv2.resize(scale_probability, dsize=(W, H))\n        probability = probability + p\n        count = count + 1\n\n    print('')\n    probability = probability/(count+0.000001)\n    probability = probability*d.mask\n    return probability\n","metadata":{"execution":{"iopub.status.busy":"2023-07-11T20:41:13.874630Z","iopub.execute_input":"2023-07-11T20:41:13.875012Z","iopub.status.idle":"2023-07-11T20:41:13.909729Z","shell.execute_reply.started":"2023-07-11T20:41:13.874980Z","shell.execute_reply":"2023-07-11T20:41:13.908506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nsys.path.append('/kaggle/input/ink-00')\n\nfrom my_model_09b import Net as Pvt2b3MeanPool\nfrom my_model_07b import Net as Resnet34UnetPool\nfrom my_model_10b import Net as EffVitB3Pool\nfrom my_model_11b import Net as Pvt2b3MeanPoolDaformer\n\nfrom my_model_09b import *\nrun_check_net()\n\n\n######################################\nif ('skip_fake_test' in mode) and (is_skip_test):\n    submit_df = pd.DataFrame({\n        'Id': valid_id,\n        'Predicted':['1 2', '1 2']\n    })\nelse:\n     \n    configure = [\n        \n        dotdict(\n            Net = Pvt2b3MeanPoolDaformer,\n            checkpoint = '/kaggle/input/ink-weight-05a/fold1-Pvt2b3MeanPoolDaformer-00029376.model.pth',\n            batch_size = 4,\n            z0 = 8,\n            z1 = 24,\n            crop_size = 384,\n            crop_fade = 32,\n            stride = 192,\n            amp=False,\n            tta_scale = [1, 1.20, 0.80],\n            tta_rot = True,\n            enabled = True,\n        ),\n        dotdict(\n            Net = Pvt2b3MeanPoolDaformer,\n            checkpoint = '/kaggle/input/ink-weight-05a/fold2aa-Pvt2b3MeanPoolDaformer-00009159.model.pth',\n            batch_size = 4,\n            z0 = 8,\n            z1 = 24,\n            crop_size = 384,\n            crop_fade = 32,\n            stride = 192,\n            amp=False,\n            tta_scale = [1, 1.20, 0.80],\n            tta_rot = True,\n            enabled = True,\n        ),\n        \n  \n        #-----\n \n        dotdict(\n            Net = Resnet34UnetPool,\n            checkpoint = '/kaggle/input/ink-weight-05a/fold1-Resnet34MeanPool.00018924.model.pth',\n            batch_size = 8,\n            z0 = 0,\n            z1 = 32,\n            crop_size = 256,\n            crop_fade = 32,\n            stride = 128,\n            amp=True,\n            tta_scale = [1, 1.10, 0.90],\n            tta_rot = True,\n            enabled = True,#False,\n        ),\n        dotdict(\n            Net = Resnet34UnetPool,\n            checkpoint = '/kaggle/input/ink-weight-05a/fold-2aa-Resnet34MeanPool-00014850.model.pth',\n            batch_size = 8,\n            z0 = 0,\n            z1 = 32,\n            crop_size = 256,\n            crop_fade = 32,\n            stride = 128,\n            amp=True,\n            tta_scale = [1, 1.10, 0.90],\n            tta_rot = True,\n            enabled = True,#False,\n        ),\n \n \n    ]\n    \n    for i, cfg in enumerate(configure):\n        pass\n        #configure[i].tta_scale=[1]\n  \n    #----\n    submission = defaultdict(list)\n    for fragment_id in valid_id:\n        d = read_data1(fragment_id, z0=32-16, z1=32+16)\n\n        print('==================================')\n        print('fragment_id', d.fragment_id)\n        print('\\tmask', d.mask.shape)\n        print('\\tvolume', d.volume.shape)\n        print('')\n        \n        # if fragment_id=='b':\n        #    rle ='1 2'\n        # else:\n        if 1:\n            probability = 0\n            count = 0\n            for i, cfg in enumerate(configure):\n                if not cfg.enabled: continue\n                if 'train' in mode:\n                    pass\n                    #cfg.tta_scale=[1]\n                    #cfg.tta_rot=False\n\n                print_cfg(cfg)\n                net = cfg.Net()\n                f = torch.load(cfg.checkpoint, map_location=lambda storage, loc: storage)\n                print(net.load_state_dict(f['state_dict'], strict=True))  # True\n                net.cuda()\n                net.eval()\n\n                p = infer_one_ms(net, d, cfg)\n                probability = probability+p\n                count = count +1\n\n                #---\n                torch.cuda.empty_cache()\n                del p\n                gc.collect()\n\n\n            probability = probability/count\n            probability = d.mask*probability\n            print('probability', probability.shape)\n\n            #---- \n            th = 0.55  \n            predict = (probability>th).astype(np.uint8) \n            rle = mask_to_rle(predict)\n\n        #----\n        submission['Id'].append(fragment_id)\n        submission['Predicted'].append(rle)\n        #----\n        probability8 = (probability * 255).astype(np.uint8)\n        plt.imshow(probability8, cmap='gray')\n        plt.waitforbuttonpress(1)\n        cv2.imwrite('probability8.png',probability8)\n\n            \n        if 'train' in mode:\n            text = metric_to_text(probability, d.label, d.mask)\n            print(text)\n        print('')\n        \n        del d\n        gc.collect()\n\n    print('')\n    print('mode',mode)\n    submit_df = pd.DataFrame.from_dict(submission)\n    submit_df.to_csv('submission.csv', index=False)\n    print(submit_df)\n    print('submission.csv ok!!!')\n\n \n\n ","metadata":{"execution":{"iopub.status.busy":"2023-07-11T20:41:13.911455Z","iopub.execute_input":"2023-07-11T20:41:13.912380Z","iopub.status.idle":"2023-07-11T21:26:51.977385Z","shell.execute_reply.started":"2023-07-11T20:41:13.912326Z","shell.execute_reply":"2023-07-11T21:26:51.976346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\n\n'''","metadata":{"execution":{"iopub.status.busy":"2023-07-11T21:26:51.978793Z","iopub.execute_input":"2023-07-11T21:26:51.979156Z","iopub.status.idle":"2023-07-11T21:26:51.987070Z","shell.execute_reply.started":"2023-07-11T21:26:51.979122Z","shell.execute_reply":"2023-07-11T21:26:51.986047Z"},"trusted":true},"execution_count":null,"outputs":[]}]}