{"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":"# Install Package","metadata":{}},{"cell_type":"code","source":"# !pip uninstall -y opencv-python\n# !pip install -qq /kaggle/input/yolov8-requirments/opencv_python-4.7.0.72-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\n# !pip install -qq /kaggle/input/yolov8-requirments/ultralytics-8.0.117-py3-none-any.whl","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:25:57.625712Z","iopub.execute_input":"2023-07-31T01:25:57.626281Z","iopub.status.idle":"2023-07-31T01:25:57.632717Z","shell.execute_reply.started":"2023-07-31T01:25:57.626224Z","shell.execute_reply":"2023-07-31T01:25:57.631441Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -qq /kaggle/input/mmdet-pkg/addict-2.4.0-py3-none-any.whl\n!pip install -qq /kaggle/input/mmdet-pkg/mmengine-0.7.3-py3-none-any.whl\n!pip install -qq /kaggle/input/mmdet-pkg/mmcv-2.0.0-cp310-cp310-linux_x86_64.whl\n!pip install -qq /kaggle/input/mmdetection/pycocotools-2.0-cp310-cp310-linux_x86_64.whl\n!pip install -qq /kaggle/input/mmdet-pkg/terminaltables-3.1.10-py2.py3-none-any.whl\n!pip install -qq /kaggle/input/mmdet-pkg/mmdet-3.0.0-py3-none-any.whl","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:25:57.635464Z","iopub.execute_input":"2023-07-31T01:25:57.636139Z","iopub.status.idle":"2023-07-31T01:29:08.081400Z","shell.execute_reply.started":"2023-07-31T01:25:57.636107Z","shell.execute_reply":"2023-07-31T01:29:08.080107Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import mmcv\nimport mmdet\nimport torch\nprint('torch version', torch.__version__)\nprint(\"mmcv version:\", mmcv.__version__)\nprint(\"mmdet version:\", mmdet.__version__)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:08.084501Z","iopub.execute_input":"2023-07-31T01:29:08.084903Z","iopub.status.idle":"2023-07-31T01:29:11.690229Z","shell.execute_reply.started":"2023-07-31T01:29:08.084862Z","shell.execute_reply":"2023-07-31T01:29:11.689278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2\nimport pandas as pd\nimport base64\nimport numpy as np\nimport pycocotools\nfrom pycocotools import _mask as coco_mask\nimport typing as t\nimport zlib\nimport matplotlib.pyplot as plt\nimport glob\nimport gc\nfrom skimage.morphology import binary_dilation\n# from ultralytics import YOLO\nimport time","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:11.691637Z","iopub.execute_input":"2023-07-31T01:29:11.692787Z","iopub.status.idle":"2023-07-31T01:29:12.303654Z","shell.execute_reply.started":"2023-07-31T01:29:11.692738Z","shell.execute_reply":"2023-07-31T01:29:12.302655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmdet.engine.hooks.utils import trigger_visualization_hook\nfrom mmengine.config import Config, ConfigDict, DictAction\nfrom mmengine.evaluator import DumpResults\nfrom mmengine.runner import Runner\nfrom mmdet.apis import inference_detector, init_detector","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:12.306962Z","iopub.execute_input":"2023-07-31T01:29:12.307485Z","iopub.status.idle":"2023-07-31T01:29:14.020750Z","shell.execute_reply.started":"2023-07-31T01:29:12.307448Z","shell.execute_reply":"2023-07-31T01:29:14.019800Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import mmdet.apis\nimport glob","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:14.022166Z","iopub.execute_input":"2023-07-31T01:29:14.022544Z","iopub.status.idle":"2023-07-31T01:29:14.028074Z","shell.execute_reply.started":"2023-07-31T01:29:14.022511Z","shell.execute_reply":"2023-07-31T01:29:14.027025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# baseline_config = '/kaggle/input/mmdet-weight/resnet101_maskrcnn/custom_config_1536f2.py'\n# weights = glob.glob('/kaggle/input/mmdet-weight/resnet101_maskrcnn/*.pth')\n\n\n# models = []\n# for w in weights:\n#     model = init_detector(baseline_config, w, device='cuda:0')\n#     model.cfg.model.test_cfg.rcnn.score_thr = 0.001\n#     models.append(model)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:14.029763Z","iopub.execute_input":"2023-07-31T01:29:14.030406Z","iopub.status.idle":"2023-07-31T01:29:37.555319Z","shell.execute_reply.started":"2023-07-31T01:29:14.030373Z","shell.execute_reply":"2023-07-31T01:29:37.554353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nmodels = []\nweights = glob.glob('/kaggle/input/mmdet-weight/resnet101_maskrcnn/*.pth')\nfor w in weights:\n    baseline_config = '/kaggle/input/mmdet-weight/resnet101_maskrcnn/custom_config_1536f2.py'\n    model = init_detector(baseline_config, w, device='cuda:0')\n    model.cfg.model.test_cfg.rcnn.score_thr = 0.001\n    models.append(model)\n\nweights = glob.glob('/kaggle/input/mmdet-weight/cascade_resnet101_1536/*.pth')\nfor w in weights:\n    baseline_config = '/kaggle/input/mmdet-weight/cascade_resnet101_1536/cascade_resnet101_1536_f1.py'\n    model = init_detector(baseline_config, w, device='cuda:0')\n    model.cfg.model.test_cfg.rcnn.score_thr = 0.001\n    models.append(model)\n    \nprint(len(models))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!nvidia-smi","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:37.556744Z","iopub.execute_input":"2023-07-31T01:29:37.557127Z","iopub.status.idle":"2023-07-31T01:29:38.697066Z","shell.execute_reply.started":"2023-07-31T01:29:37.557092Z","shell.execute_reply":"2023-07-31T01:29:38.695893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# yolov8lmodels = []\n# for w in glob.glob('/kaggle/input/yolov8/ylov8l/*.pt'):\n#     yolov8lmodels.append(YOLO(w))","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:38.698915Z","iopub.execute_input":"2023-07-31T01:29:38.699608Z","iopub.status.idle":"2023-07-31T01:29:38.705052Z","shell.execute_reply.started":"2023-07-31T01:29:38.699567Z","shell.execute_reply":"2023-07-31T01:29:38.703788Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !nvidia-smi","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:38.706937Z","iopub.execute_input":"2023-07-31T01:29:38.707295Z","iopub.status.idle":"2023-07-31T01:29:38.718251Z","shell.execute_reply.started":"2023-07-31T01:29:38.707254Z","shell.execute_reply":"2023-07-31T01:29:38.717284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle_encode(img):\n    '''\n    img: numpy array, 1 - mask, 0 - background\n    Returns run length as string formated\n    '''\n    pixels = img.flatten()\n    pixels = np.concatenate([[0], pixels, [0]])\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n    runs[1::2] -= runs[::2]\n    return ' '.join(str(x) for x in runs)\n\n\ndef encode_binary_mask(mask: np.ndarray) -> t.Text:\n    # check input mask --\n    if mask.dtype != bool:\n        raise ValueError(\n            \"encode_binary_mask expects a binary mask, received dtype == %s\" %\n            mask.dtype)\n\n    mask = np.squeeze(mask)\n    if len(mask.shape) != 2:\n        raise ValueError(\n            \"encode_binary_mask expects a 2d mask, received shape == %s\" %\n            mask.shape)\n\n    # convert input mask to expected COCO API input --\n    mask_to_encode = mask.reshape(mask.shape[0], mask.shape[1], 1)\n    mask_to_encode = mask_to_encode.astype(np.uint8)\n    mask_to_encode = np.asfortranarray(mask_to_encode)\n\n    # RLE encode mask --\n    encoded_mask = coco_mask.encode(mask_to_encode)[0][\"counts\"]\n\n    # compress and base64 encoding --\n    binary_str = zlib.compress(encoded_mask, zlib.Z_BEST_COMPRESSION)\n    base64_str = base64.b64encode(binary_str)\n    return base64_str","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:38.719613Z","iopub.execute_input":"2023-07-31T01:29:38.719889Z","iopub.status.idle":"2023-07-31T01:29:38.732353Z","shell.execute_reply.started":"2023-07-31T01:29:38.719866Z","shell.execute_reply":"2023-07-31T01:29:38.731149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 矩形aと、複数の矩形bのIoUを計算\ndef iou_np(a, b, a_area, b_area):\n    # aは1つの矩形を表すshape=(4,)のnumpy配列\n    # array([xmin, ymin, xmax, ymax])\n    # bは任意のN個の矩形を表すshape=(N, 4)のnumpy配列\n    # 2次元目の4は、array([xmin, ymin, xmax, ymax])\n    \n    # a_areaは矩形aの面積\n    # b_areaはbに含まれる矩形のそれぞれの面積\n    # shape=(N,)のnumpy配列。Nは矩形の数\n    \n    # aとbの矩形の共通部分(intersection)の面積を計算するために、\n    # N個のbについて、aとの共通部分のxmin, ymin, xmax, ymaxを一気に計算\n    abx_mn = np.maximum(a[0], b[:,0]) # xmin\n    aby_mn = np.maximum(a[1], b[:,1]) # ymin\n    abx_mx = np.minimum(a[2], b[:,2]) # xmax\n    aby_mx = np.minimum(a[3], b[:,3]) # ymax\n    # 共通部分の幅を計算。共通部分が無ければ0\n    w = np.maximum(0, abx_mx - abx_mn + 1)\n    # 共通部分の高さを計算。共通部分が無ければ0\n    h = np.maximum(0, aby_mx - aby_mn + 1)\n    # 共通部分の面積を計算。共通部分が無ければ0\n    intersect = w*h\n    \n    # N個のbについて、aとのIoUを一気に計算\n    iou_np = intersect / (a_area + b_area - intersect)\n    return iou_np\n\n\n# NMSの計算\ndef nms_fast(bboxes, scores, masks, encoded_masks, iou_threshold=0.5):\n    # bboxesは任意のN個の矩形を格納したshape=(N, 4)のnumpy配列\n    # 2次元目の4要素は、array([xmin, ymin, xmax, ymax])\n    # scoresは任意のN個の信頼度を格納したshape=(N,)のnumpy配列\n    # classesは任意のN個のクラスを格納したshape=(N,)のnumpy配列\n    \n    # bboxesの矩形の面積を一気に計算\n    areas = (bboxes[:,2] - bboxes[:,0] + 1) \\\n             * (bboxes[:,3] - bboxes[:,1] + 1)\n    \n    # scoreの昇順(小さい順)の矩形インデックスのリストを取得\n    sort_index = np.argsort(scores)\n    \n    i = -1 # 未処理の矩形のindex\n    while(len(sort_index) >= 2 - i):\n        # score最大のindexを取得\n        max_scr_ind = sort_index[i]\n        # score最大以外のindexを取得\n        ind_list = sort_index[:i]\n        # score最大の矩形それ以外の矩形のIoUを計算\n        iou = iou_np(bboxes[max_scr_ind], bboxes[ind_list], \\\n                     areas[max_scr_ind], areas[ind_list])\n        \n        # IoUが閾値iou_threshold以上の矩形を計算\n        del_index = np.where(iou >= iou_threshold)\n        # IoUが閾値iou_threshold以上の矩形を削除\n        sort_index = np.delete(sort_index, del_index)\n        #print(len(sort_index), i, flush=True)\n        i -= 1 # 未処理の矩形のindexを1減らす\n    \n    # bboxes, scores, classesから削除されなかった矩形のindexのみを抽出\n    bboxes = bboxes[sort_index]\n    scores = scores[sort_index]\n    \n#     masks = masks[sort_index]\n    _masks = [masks[i] for i in sort_index]\n#     encoded_masks = encoded_masks[sort_index]\n    _encoded_masks = [encoded_masks[i] for i in sort_index]\n#     classes = classes[sort_index]\n    \n    return bboxes, scores, _masks, _encoded_masks","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:38.733937Z","iopub.execute_input":"2023-07-31T01:29:38.734557Z","iopub.status.idle":"2023-07-31T01:29:38.749733Z","shell.execute_reply.started":"2023-07-31T01:29:38.734524Z","shell.execute_reply":"2023-07-31T01:29:38.748620Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def resize_mask(mask, target_size=(512, 512)):\n    resized_mask = cv2.resize(mask, target_size, interpolation=cv2.INTER_NEAREST)\n    return resized_mask","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:38.751256Z","iopub.execute_input":"2023-07-31T01:29:38.751845Z","iopub.status.idle":"2023-07-31T01:29:38.765153Z","shell.execute_reply.started":"2023-07-31T01:29:38.751810Z","shell.execute_reply":"2023-07-31T01:29:38.764110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def infer():\n    files = glob.glob('/kaggle/input/hubmap-hacking-the-human-vasculature/test/*')\n#     files = files+files+files+files+files+files\n\n    sub = pd.DataFrame()\n\n    idxes = []\n    predict_string = []\n    _class = '0'\n    img_size = [1536, 1920]\n    # img_size = [1536]\n    for file in files:\n        r = ''\n\n        idx = file.split('/')[-1][:-4]\n        idxes.append(idx)\n        img = cv2.imread(file)\n\n        scores = []\n        masks = []\n        bboxes = []\n        encoded_masks = []\n        \n        for sz in img_size:\n            img = cv2.resize(img, (sz, sz))\n            for model in models:\n\n                result = inference_detector(model, img)\n                _scores = result.pred_instances.scores.cpu().numpy()\n                _bboxes = result.pred_instances.bboxes.cpu().numpy()/sz * 512\n                _masks = result.pred_instances.masks.cpu().numpy().astype(np.float32)\n                scores.append(_scores)\n                bboxes.append(_bboxes)\n                for index, score in enumerate(_scores):\n                    n = resize_mask(_masks[index])\n                    n = (n > 0.35)\n                    n = binary_dilation(n)\n                    encoded_mask = encode_binary_mask(n)\n                    encoded_masks.append(encoded_mask)\n                    masks.append(pycocotools.mask.encode(np.asarray(n, order='F')))\n\n                del result\n                del _scores\n                del _masks\n                gc.collect()\n                torch.cuda.empty_cache()\n\n\n\n        bboxes = np.concatenate(bboxes)\n        scores = np.concatenate(scores)\n\n        bboxes, scores, masks, encoded_masks  = nms_fast(bboxes, scores, masks, encoded_masks, 0.6)\n \n\n        sorted_indices = np.argsort(scores)[::-1]\n        \n        sorted_rle_list = [masks[i] for i in sorted_indices]\n        scores = scores[sorted_indices]\n        _encoded_masks = [encoded_masks[i] for i in sorted_indices]\n\n\n        ious = pycocotools.mask.iou(sorted_rle_list, sorted_rle_list, [0] * len(sorted_rle_list))\n\n        picks = []\n        idxs = list(range(len(ious)))\n        threshold = 0.6\n\n        while len(idxs) > 0:\n            idx = idxs[0]\n            overlapping = np.where(ious[idx] > threshold)[0]\n            # removed += [v for v in overlapping if v > idx]\n            if len(overlapping):\n                picks.append(idx)\n                idxs = [i for i in idxs if i not in overlapping]\n            else:\n                idxs = idxs[1:]\n        \n        _encoded_masks_picks = [_encoded_masks[i] for i in picks]\n        scores = scores[picks]\n        bboxes = bboxes[picks]\n        print(len(scores))\n\n        for index, score in enumerate(scores):\n            encoded_mask = _encoded_masks_picks[index]\n\n            if index == 0:\n                r += f\"{_class} {score} {encoded_mask.decode('utf-8')}\"\n            else:\n                r += f\" {_class} {score} {encoded_mask.decode('utf-8')}\"\n\n        del masks\n        gc.collect()\n        predict_string.append(r)\n\n    sub['id'] = idxes\n    sub['height'] = 512\n    sub['width'] = 512\n    sub['prediction_string'] = predict_string\n\n    return sub","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:49.095397Z","iopub.execute_input":"2023-07-31T01:29:49.095799Z","iopub.status.idle":"2023-07-31T01:29:49.116646Z","shell.execute_reply.started":"2023-07-31T01:29:49.095763Z","shell.execute_reply":"2023-07-31T01:29:49.115446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = infer()\nsub.to_csv(\"submission.csv\", index=False)\nsub.head()","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:49.537293Z","iopub.execute_input":"2023-07-31T01:29:49.537683Z","iopub.status.idle":"2023-07-31T01:30:12.706476Z","shell.execute_reply.started":"2023-07-31T01:29:49.537650Z","shell.execute_reply":"2023-07-31T01:30:12.705425Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Config","metadata":{}},{"cell_type":"code","source":"# from mmdet.registry import VISUALIZERS\n# # init visualizer(run the block only once in jupyter notebook)\n# visualizer = VISUALIZERS.build(model.cfg.visualizer)\n# # the dataset_meta is loaded from the checkpoint and\n# # then pass to the model in init_detector\n# visualizer.dataset_meta = model.dataset_meta","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:38.840235Z","iopub.execute_input":"2023-07-31T01:29:38.840697Z","iopub.status.idle":"2023-07-31T01:29:38.850182Z","shell.execute_reply.started":"2023-07-31T01:29:38.840665Z","shell.execute_reply":"2023-07-31T01:29:38.849244Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show the results\n# visualizer.add_datasample(\n#     'result',\n#     img,\n#     data_sample=result,\n#     draw_gt = None,\n#     wait_time=0,\n# )\n# visualizer.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-31T01:29:38.851782Z","iopub.execute_input":"2023-07-31T01:29:38.852231Z","iopub.status.idle":"2023-07-31T01:29:38.860232Z","shell.execute_reply.started":"2023-07-31T01:29:38.852141Z","shell.execute_reply":"2023-07-31T01:29:38.859188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}