{"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":"# **Ensembling Boxes [NMS-Soft_NMS-NMW-WBF] Yolov5**","metadata":{"papermill":{"duration":0.016483,"end_time":"2022-02-07T08:36:29.375485","exception":false,"start_time":"2022-02-07T08:36:29.359002","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"### Hi kagglers, This is `Ensembling Boxes methods` notebook using `YOLOv5`.\n\n\n\n### Please if this kernel is useful, <font color='red'>please upvote !!</font>","metadata":{"papermill":{"duration":0.014774,"end_time":"2022-02-07T08:36:29.405673","exception":false,"start_time":"2022-02-07T08:36:29.390899","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# Impotring libraries ","metadata":{"papermill":{"duration":0.014861,"end_time":"2022-02-07T08:36:29.435616","exception":false,"start_time":"2022-02-07T08:36:29.420755","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")\nimport numpy as np\nfrom tqdm.notebook import tqdm\ntqdm.pandas()\nimport pandas as pd\nimport os\nimport cv2\nimport matplotlib.pyplot as plt\nfrom tqdm.notebook import tqdm\nimport glob\nimport shutil\nimport sys\nimport torch\nfrom PIL import Image\nimport ast","metadata":{"papermill":{"duration":1.694084,"end_time":"2022-02-07T08:36:31.144634","exception":false,"start_time":"2022-02-07T08:36:29.45055","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:10.403783Z","iopub.execute_input":"2022-02-13T17:42:10.404114Z","iopub.status.idle":"2022-02-13T17:42:11.980958Z","shell.execute_reply.started":"2022-02-13T17:42:10.404044Z","shell.execute_reply":"2022-02-13T17:42:11.980205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"CONF=0.15","metadata":{"execution":{"iopub.status.busy":"2022-02-13T17:42:11.982562Z","iopub.execute_input":"2022-02-13T17:42:11.982813Z","iopub.status.idle":"2022-02-13T17:42:11.987258Z","shell.execute_reply.started":"2022-02-13T17:42:11.98278Z","shell.execute_reply":"2022-02-13T17:42:11.986645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sys.path.append('../input/ensemble-boxes-104/ensemble_boxes-1.0.4')\nfrom ensemble_boxes import *","metadata":{"papermill":{"duration":0.663258,"end_time":"2022-02-07T08:36:31.823325","exception":false,"start_time":"2022-02-07T08:36:31.160067","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:11.988417Z","iopub.execute_input":"2022-02-13T17:42:11.989092Z","iopub.status.idle":"2022-02-13T17:42:12.699515Z","shell.execute_reply.started":"2022-02-13T17:42:11.989056Z","shell.execute_reply":"2022-02-13T17:42:12.698776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir -p /root/.config/Ultralytics\n!cp /kaggle/input/yolo-arial/Arial.ttf /root/.config/Ultralytics/","metadata":{"_kg_hide-input":true,"papermill":{"duration":1.511819,"end_time":"2022-02-07T08:36:33.350937","exception":false,"start_time":"2022-02-07T08:36:31.839118","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:12.701424Z","iopub.execute_input":"2022-02-13T17:42:12.702087Z","iopub.status.idle":"2022-02-13T17:42:14.103452Z","shell.execute_reply.started":"2022-02-13T17:42:12.702047Z","shell.execute_reply":"2022-02-13T17:42:14.102473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Functions","metadata":{"papermill":{"duration":0.015724,"end_time":"2022-02-07T08:36:33.383113","exception":false,"start_time":"2022-02-07T08:36:33.367389","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def voc2yolo(bboxes, image_height=720, image_width=1280):\n    \"\"\"\n    voc  => [x1, y1, x2, y1]\n    yolo => [xmid, ymid, w, h] (normalized)\n    \"\"\"\n    bboxes = bboxes.copy().astype(float) # otherwise all value will be 0 as voc_pascal dtype is np.int\n    bboxes[..., [0, 2]] = bboxes[..., [0, 2]]/ image_width\n    bboxes[..., [1, 3]] = bboxes[..., [1, 3]]/ image_height\n    w = bboxes[..., 2] - bboxes[..., 0]\n    h = bboxes[..., 3] - bboxes[..., 1]\n    bboxes[..., 0] = bboxes[..., 0] + w/2\n    bboxes[..., 1] = bboxes[..., 1] + h/2\n    bboxes[..., 2] = w\n    bboxes[..., 3] = h\n    return bboxes\n\ndef yolo2voc(bboxes, image_height=720, image_width=1280):\n    \"\"\"\n    yolo => [xmid, ymid, w, h] (normalized)\n    voc  => [x1, y1, x2, y1]\n\n    \"\"\"\n    bboxes = bboxes.copy().astype(float) # otherwise all value will be 0 as voc_pascal dtype is np.int\n    bboxes[..., [0, 2]] = bboxes[..., [0, 2]]* image_width\n    bboxes[..., [1, 3]] = bboxes[..., [1, 3]]* image_height\n    bboxes[..., [0, 1]] = bboxes[..., [0, 1]] - bboxes[..., [2, 3]]/2\n    bboxes[..., [2, 3]] = bboxes[..., [0, 1]] + bboxes[..., [2, 3]]\n    return bboxes\n\ndef coco2yolo(bboxes, image_height=720, image_width=1280):\n    \"\"\"\n    coco => [xmin, ymin, w, h]\n    yolo => [xmid, ymid, w, h] (normalized)\n    \"\"\"\n    bboxes = bboxes.copy().astype(float) # otherwise all value will be 0 as voc_pascal dtype is np.int\n    # normolizinig\n    bboxes[..., [0, 2]]= bboxes[..., [0, 2]]/ image_width\n    bboxes[..., [1, 3]]= bboxes[..., [1, 3]]/ image_height\n    # converstion (xmin, ymin) => (xmid, ymid)\n    bboxes[..., [0, 1]] = bboxes[..., [0, 1]] + bboxes[..., [2, 3]]/2\n    return bboxes\n\ndef yolo2coco(bboxes, image_height=720, image_width=1280):\n    \"\"\"\n    yolo => [xmid, ymid, w, h] (normalized)\n    coco => [xmin, ymin, w, h]\n    \"\"\"\n    bboxes = bboxes.copy().astype(float) # otherwise all value will be 0 as voc_pascal dtype is np.int\n    # denormalizing\n    bboxes[..., [0, 2]]= bboxes[..., [0, 2]]* image_width\n    bboxes[..., [1, 3]]= bboxes[..., [1, 3]]* image_height\n    # converstion (xmid, ymid) => (xmin, ymin)\n    bboxes[..., [0, 1]] = bboxes[..., [0, 1]] - bboxes[..., [2, 3]]/2\n    return bboxes\n\ndef voc2coco(bboxes, image_height=720, image_width=1280):\n    bboxes  = voc2yolo(bboxes, image_height, image_width)\n    bboxes  = yolo2coco(bboxes, image_height, image_width)\n    return bboxes\n\ndef load_image(image_path):\n    return cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2RGB)\n\ndef plot_one_box(x, img, color=None, label=None, line_thickness=None):\n    # Plots one bounding box on image img\n    tl = line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1  # line/font thickness\n    color = color or [random.randint(0, 255) for _ in range(3)]\n    c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3]))\n    cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)\n    if label:\n        tf = max(tl - 1, 1)  # font thickness\n        t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]\n        c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3\n        cv2.rectangle(img, c1, c2, color, -1, cv2.LINE_AA)  # filled\n        cv2.putText(img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA)\n\ndef draw_bboxes(img, bboxes, classes, class_ids, colors = None, show_classes = None, bbox_format = 'yolo', class_name = False, line_thickness = 2):\n\n    image = img.copy()\n    show_classes = classes if show_classes is None else show_classes\n    colors = (0, 255 ,0) if colors is None else colors\n\n    if bbox_format == 'yolo':\n\n        for idx in range(len(bboxes)):\n\n            bbox  = bboxes[idx]\n            cls   = classes[idx]\n            cls_id = class_ids[idx]\n            color = colors[cls_id] if type(colors) is list else colors\n\n            if cls in show_classes:\n\n                x1 = round(float(bbox[0])*image.shape[1])\n                y1 = round(float(bbox[1])*image.shape[0])\n                w  = round(float(bbox[2])*image.shape[1]/2) #w/2\n                h  = round(float(bbox[3])*image.shape[0]/2)\n\n                voc_bbox = (x1-w, y1-h, x1+w, y1+h)\n                plot_one_box(voc_bbox,\n                             image,\n                             color = color,\n                             label = cls if class_name else str(get_label(cls)),\n                             line_thickness = line_thickness)\n\n    elif bbox_format == 'coco':\n\n        for idx in range(len(bboxes)):\n\n            bbox  = bboxes[idx]\n            cls   = classes[idx]\n            cls_id = class_ids[idx]\n            color = colors[cls_id] if type(colors) is list else colors\n\n            if cls in show_classes:\n                x1 = int(round(bbox[0]))\n                y1 = int(round(bbox[1]))\n                w  = int(round(bbox[2]))\n                h  = int(round(bbox[3]))\n\n                voc_bbox = (x1, y1, x1+w, y1+h)\n                plot_one_box(voc_bbox,\n                             image,\n                             color = color,\n                             label = cls if class_name else str(cls_id),\n                             line_thickness = line_thickness)\n\n    elif bbox_format == 'voc_pascal':\n\n        for idx in range(len(bboxes)):\n\n            bbox  = bboxes[idx]\n            cls   = classes[idx]\n            cls_id = class_ids[idx]\n            color = colors[cls_id] if type(colors) is list else colors\n\n            if cls in show_classes:\n                x1 = int(round(bbox[0]))\n                y1 = int(round(bbox[1]))\n                x2 = int(round(bbox[2]))\n                y2 = int(round(bbox[3]))\n                voc_bbox = (x1, y1, x2, y2)\n                plot_one_box(voc_bbox,\n                             image,\n                             color = color,\n                             label = cls if class_name else str(cls_id),\n                             line_thickness = line_thickness)\n    else:\n        raise ValueError('wrong bbox format')\n\n    return image\n\ndef show_img(img, bboxes, bbox_format='yolo', bbox_colors = None):\n    names  = ['starfish']*len(bboxes)\n    labels = [0]*len(bboxes)\n    img    = draw_bboxes(img = img,\n                           bboxes = bboxes,\n                           classes = names,\n                           class_ids = labels,\n                           class_name = True,\n                           colors = colors if bbox_colors is None else bbox_colors,\n                           bbox_format = bbox_format,\n                           line_thickness = 2)\n    return Image.fromarray(img).resize((800, 400))\n\ndef get_bbox(annots):\n    bboxes = [list(annot.values()) for annot in annots]\n    return bboxes\n\ndef get_imgsize(row):\n    row['width'], row['height'] = imagesize.get(row['image_path'])\n    return row\n\nnp.random.seed(32)\ncolors = [(np.random.randint(255), np.random.randint(255), np.random.randint(255))\\\n          for idx in range(1)]","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.059523,"end_time":"2022-02-07T08:36:33.458057","exception":false,"start_time":"2022-02-07T08:36:33.398534","status":"completed"},"pycharm":{"name":"#%%\n"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:14.105861Z","iopub.execute_input":"2022-02-13T17:42:14.106201Z","iopub.status.idle":"2022-02-13T17:42:14.175097Z","shell.execute_reply.started":"2022-02-13T17:42:14.106159Z","shell.execute_reply":"2022-02-13T17:42:14.174156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_model(ckpt_path, conf=0.25, iou=0.50):\n    model = torch.hub.load('/kaggle/input/yolov5-lib-ds',\n                           'custom',\n                           path=ckpt_path,\n                           source='local',\n                           force_reload=True)  # local repo\n    model.conf = conf  # NMS confidence threshold\n    model.iou  = iou  # NMS IoU threshold\n    model.classes = None   # (optional list) filter by class, i.e. = [0, 15, 16] for persons, cats and dogs\n    model.multi_label = False  # NMS multiple labels per box\n    model.max_det = 1000 \n    return model\n\ndef predict(model, img, size=768, augment=False):\n    height, width = img.shape[:2]\n    results = model(img, size=size, augment=augment)  # custom inference size\n    preds   = results.pandas().xyxy[0]\n    bboxes  = preds[['xmin','ymin','xmax','ymax']].values\n    if len(bboxes):\n        bboxes  = voc2coco(bboxes,height,width).astype(int)\n        confs   = preds.confidence.values\n        classes  = preds.name.values\n        return bboxes, confs,classes\n    else:\n        return [],[],[]\n\ndef format_prediction(bboxes, confs):\n    annot = ''\n    if len(bboxes)>0:\n        for idx in range(len(bboxes)):\n            xmin, ymin, w, h = bboxes[idx]\n            conf= confs[idx]\n#             if conf>0.15:\n            annot += f'{conf} {xmin} {ymin} {w} {h}'\n            annot +=' '\n        annot = annot.strip(' ')\n    return annot\n\n# def format_prediction(bboxes):\n#     pred_strings = []\n#     if len(bboxes)>0:\n#         for bb in bboxes:\n#             pred_strings.append(f'{bb[4]:.2f} {int(bb[0])} {int(bb[1])} {int(bb[2])} {int(bb[3])}')\n#     return ' '.join(pred_strings)\n\n","metadata":{"_kg_hide-input":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"papermill":{"duration":0.027144,"end_time":"2022-02-07T08:36:33.500557","exception":false,"start_time":"2022-02-07T08:36:33.473413","status":"completed"},"pycharm":{"name":"#%%\n"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:14.179032Z","iopub.execute_input":"2022-02-13T17:42:14.179242Z","iopub.status.idle":"2022-02-13T17:42:14.192283Z","shell.execute_reply.started":"2022-02-13T17:42:14.179215Z","shell.execute_reply":"2022-02-13T17:42:14.191389Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Ensembling 3 Models","metadata":{"papermill":{"duration":0.014851,"end_time":"2022-02-07T08:36:33.531537","exception":false,"start_time":"2022-02-07T08:36:33.516686","status":"completed"},"tags":[]}},{"cell_type":"code","source":"CKPT_PATH1 = '../input/reefbaselinefold12v2/l6_3600_uflip_vm5_f12_up/f1/best.pt'\nCONF1      = 0.45\nIOU1       = 0.5\nCKPT_PATH2 = '../input/yolov5s6/f2_sub2.pt'\nCONF2      = 0.45\nIOU2       = 0.5\nCKPT_PATH3 = '../input/yolov5/3000_fold0_all_10.pt'\nCONF3      = 0.45\nIOU3       = 0.5\nCKPT_PATH4 = '../input/reefbaselinefold12v2/l6_3600_uflip_vm5_f12_up/f2/best.pt'\nCONF4      = 0.45\nIOU4       = 0.5\nMIN_SZ    = 4\n#--------------------------------------------------------------------------\nmodel1 = load_model(CKPT_PATH1, conf=CONF1, iou=IOU1) \nmodel2 = load_model(CKPT_PATH2, conf=CONF2, iou=IOU2)\nmodel3 = load_model(CKPT_PATH3, conf=CONF3, iou=IOU3)\nmodel4 = load_model(CKPT_PATH4, conf=CONF4, iou=IOU4)","metadata":{"papermill":{"duration":12.175682,"end_time":"2022-02-07T08:36:45.722318","exception":false,"start_time":"2022-02-07T08:36:33.546636","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:14.195652Z","iopub.execute_input":"2022-02-13T17:42:14.195877Z","iopub.status.idle":"2022-02-13T17:42:21.233495Z","shell.execute_reply.started":"2022-02-13T17:42:14.19585Z","shell.execute_reply":"2022-02-13T17:42:21.232704Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Let's use image from validation set","metadata":{"papermill":{"duration":0.018084,"end_time":"2022-02-07T08:36:45.760817","exception":false,"start_time":"2022-02-07T08:36:45.742733","status":"completed"},"tags":[]}},{"cell_type":"code","source":"TEST_IMAGE_PATH = \"/kaggle/input/tensorflow-great-barrier-reef/train_images/video_2/5747.jpg\"\nimg = cv2.imread(TEST_IMAGE_PATH)[...,::-1]\n#--------------------------------------------------------------------------\nIMG_SIZE  = 3000\nIMG_SIZE1  = 3000\nIMG_SIZE2  = 3000\nIMG_SIZE3  = 3000\nIMG_SIZE4  = 3000\nAUGMENT   = True\n#--------------------------------------------------------------------------\nbboxes1, scores1 ,bbclasses1  = predict(model1, img, size=IMG_SIZE1, augment=AUGMENT)\nbboxes2, scores2 ,bbclasses2  = predict(model2, img, size=IMG_SIZE2, augment=AUGMENT)\nbboxes3, scores3 ,bbclasses3  = predict(model3, img, size=IMG_SIZE3, augment=AUGMENT)\nbboxes4, scores4 ,bbclasses4  = predict(model4, img, size=IMG_SIZE4, augment=AUGMENT)\n#--------------------------------------------------------------------------\nout_image=draw_bboxes(img = img,\n                        bboxes = bboxes1, \n                        classes = [\"model1\"]*len(bboxes1),\n                        class_ids = [0]*len(bboxes1),\n                        class_name = True, \n                        colors = (0,0,130), \n                        bbox_format = 'coco',\n                        line_thickness = 2)\n\nout_image=draw_bboxes(img = out_image,\n                        bboxes = bboxes2, \n                        classes = [\"  model2\"]*len(bboxes2),\n                        class_ids = [0]*len(bboxes2),\n                        class_name = True, \n                        colors = (0,130,0), \n                        bbox_format = 'coco',\n                        line_thickness = 2)\nout_image=draw_bboxes(img = out_image,\n                        bboxes = bboxes3, \n                        classes = [\"   model3\"]*len(bboxes3),\n                        class_ids = [0]*len(bboxes3),\n                        class_name = True, \n                        colors = (255,0,0), \n                        bbox_format = 'coco',\n                        line_thickness = 2)\nout_image=draw_bboxes(img = out_image,\n                        bboxes = bboxes4, \n                        classes = [\"   model4\"]*len(bboxes4),\n                        class_ids = [0]*len(bboxes4),\n                        class_name = True, \n                        colors = (255,0,0), \n                        bbox_format = 'coco',\n                        line_thickness = 2)\n\nout_image = cv2.cvtColor(out_image, cv2.COLOR_BGR2RGB)\ndisplay(Image.fromarray(out_image))","metadata":{"collapsed":false,"jupyter":{"outputs_hidden":false},"papermill":{"duration":7.232978,"end_time":"2022-02-07T08:36:53.012148","exception":false,"start_time":"2022-02-07T08:36:45.77917","status":"completed"},"pycharm":{"name":"#%%\n"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:21.235392Z","iopub.execute_input":"2022-02-13T17:42:21.235701Z","iopub.status.idle":"2022-02-13T17:42:26.949361Z","shell.execute_reply.started":"2022-02-13T17:42:21.235659Z","shell.execute_reply":"2022-02-13T17:42:26.948666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bboxes1[:, 2] = bboxes1[:, 2] + bboxes1[:, 0]\nbboxes1[:, 3] = bboxes1[:, 3] + bboxes1[:, 1]\nbboxes2[:, 2] = bboxes2[:, 2] + bboxes2[:, 0]\nbboxes2[:, 3] = bboxes2[:, 3] + bboxes2[:, 1]\nbboxes3[:, 2] = bboxes3[:, 2] + bboxes3[:, 0]\nbboxes3[:, 3] = bboxes3[:, 3] + bboxes3[:, 1]\nbboxes4[:, 2] = bboxes4[:, 2] + bboxes4[:, 0]\nbboxes4[:, 3] = bboxes4[:, 3] + bboxes4[:, 1]","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.089708,"end_time":"2022-02-07T08:36:53.182625","exception":false,"start_time":"2022-02-07T08:36:53.092917","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:26.95034Z","iopub.execute_input":"2022-02-13T17:42:26.950565Z","iopub.status.idle":"2022-02-13T17:42:26.966202Z","shell.execute_reply.started":"2022-02-13T17:42:26.950535Z","shell.execute_reply":"2022-02-13T17:42:26.965568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def run_nms(bboxes, confs,classs, image_size, iou_thr=0.50, skip_box_thr=0.0001, weights=None):\n    boxes =  [bbox/(image_size-1) for bbox in bboxes]\n    scores = [conf for conf in confs]    \n    labels = [np.ones(conf.shape[0]) for conf in confs]\n    boxes, scores, labels = nms(boxes, scores, labels, weights=weights, iou_thr=iou_thr)\n    boxes = boxes*(image_size-1)\n    return boxes, scores, labels\n\ndef run_nmw(bboxes, confs,classs, image_size, iou_thr=0.50, skip_box_thr=0.0001, weights=None):\n    boxes =  [bbox/(image_size-1) for bbox in bboxes]\n    scores = [conf for conf in confs]    \n    labels = [np.ones(conf.shape[0]) for conf in confs]\n    boxes, scores, labels = non_maximum_weighted(boxes, scores, labels, weights=weights, iou_thr=iou_thr)\n    boxes = boxes*(image_size-1)\n    return boxes, scores, labels\n\n\ndef run_soft_nms(bboxes, confs,classs, image_size, iou_thr=0.50, skip_box_thr=0.0001,sigma=0.1, weights=None):\n    boxes =  [bbox/(image_size-1) for bbox in bboxes]\n    scores = [conf for conf in confs]    \n    labels = [np.ones(conf.shape[0]) for conf in confs]\n    boxes, scores, labels = soft_nms(boxes, scores, labels, weights=weights, iou_thr=iou_thr, sigma=sigma, thresh=skip_box_thr)\n    boxes = boxes*(image_size-1)\n    return boxes, scores, labels\n\ndef run_wbf(bboxes, confs,classs, image_size, iou_thr=0.50, skip_box_thr=0.0001, weights=None):\n    boxes =  [bbox/(image_size-1) for bbox in bboxes]\n    scores = [conf for conf in confs]    \n    labels = [np.ones(conf.shape[0]) for conf in confs]\n    boxes, scores, labels = weighted_boxes_fusion(boxes, scores, labels, weights=None, iou_thr=iou_thr, skip_box_thr=skip_box_thr)\n    boxes = boxes*(image_size-1)\n    return boxes, scores, labels\ndef check_result(bboxes,shape,score):\n    if len(bboxes)==0:\n        return []\n    bboxes=np.array(bboxes)\n    score = np.array(score)\n    bboxes=bboxes[score>CONF]\n    bboxes[bboxes<0]=0\n    bboxes=bboxes[(bboxes[:,0]+bboxes[:,2]) < shape[1]]\n    bboxes=bboxes[(bboxes[:,1]+bboxes[:,3]) < shape[0]]\n    bboxes=bboxes[bboxes[:,2]>MIN_SZ]\n    bboxes=bboxes[bboxes[:,3]>MIN_SZ]\n    return bboxes","metadata":{"_kg_hide-input":true,"papermill":{"duration":0.094374,"end_time":"2022-02-07T08:36:53.35571","exception":false,"start_time":"2022-02-07T08:36:53.261336","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:26.973264Z","iopub.execute_input":"2022-02-13T17:42:26.973843Z","iopub.status.idle":"2022-02-13T17:42:27.001697Z","shell.execute_reply.started":"2022-02-13T17:42:26.973791Z","shell.execute_reply":"2022-02-13T17:42:27.000736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Ensembling boxes methods [NMS-Soft_NMS-NMW-WBF]\n\nComparison was made for ensemble of 5 different object detection models predictions trained on Open Images Dataset (500 classes).\nModel scores at local validation:\n* Model 1: mAP(0.5) 0.5164\n* Model 2: mAP(0.5) 0.5019\n* Model 3: mAP(0.5) 0.5144\n* Model 4: mAP(0.5) 0.5152\n* Model 5: mAP(0.5) 0.4910\n\n[Reference](http://https://github.com/ZFTurbo/Weighted-Boxes-Fusion)","metadata":{"papermill":{"duration":0.078036,"end_time":"2022-02-07T08:36:53.511671","exception":false,"start_time":"2022-02-07T08:36:53.433635","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"![1111.JPG](attachment:196f2e46-8259-4964-a366-366cfbb97c1b.JPG)","metadata":{"papermill":{"duration":0.078195,"end_time":"2022-02-07T08:36:53.666274","exception":false,"start_time":"2022-02-07T08:36:53.588079","status":"completed"},"tags":[]},"attachments":{"196f2e46-8259-4964-a366-366cfbb97c1b.JPG":{"image/jpeg":"/9j/4AAQSkZJRgABAQEAYABgAAD/4RCKRXhpZgAATU0AKgAAAAgABAE7AAIAAAAIAAAISodpAAQAAAABAAAIUpydAAEAAAAQAAAQcuocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRPU0hJQkEAAAHqHAAHAAAIDAAACGQAAAAAHOoAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQATwBTAEgASQBCAEEAAAD/4QsaaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIvPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNyZWF0ZURhdGU+MjAyMi0wMS0yNFQxODozMTozMS45OTk8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj48ZGM6Y3JlYXRvcj48cmRmOlNlcSB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6bGk+VE9TSElCQTwvcmRmOmxpPjwvcmRmOlNlcT4NCgkJCTwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9J3cnPz7/2wBDAAcFBQYFBAcGBQYIBwcIChELCgkJChUPEAwRGBUaGRgVGBcbHichGx0lHRcYIi4iJSgpKywrGiAvMy8qMicqKyr/2wBDAQcICAoJChQLCxQqHBgcKioqKioqKioqKioq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"}}},{"cell_type":"code","source":"#--------------------------------- Aug -----------------------------------------\niou_thr = 0.5\nskip_box_thr = 0.0001\nsigma = 0.01\nweights = [1.5, 2,0.5,1]\n#--------------------------------- List -----------------------------------------\n# boxes_list=[bboxes1,bboxes2]\n# scores_list=[scores1,scores2]\n# labels_list=[bbclasses1,bbclasses2]\nboxes_list=[bboxes1,bboxes2,bboxes3,bboxes4]\nscores_list=[scores1,scores2,scores3,scores4]\nlabels_list=[bbclasses1,bbclasses2,bbclasses3,bbclasses4]\n\n\n##################################### soft_NMS #####################################\nboxes, scores, labels  = run_soft_nms(boxes_list, scores_list, labels_list,IMG_SIZE, iou_thr,skip_box_thr,sigma,weights=weights)\nboxes[:, 2] = boxes[:, 2] - boxes[:, 0]\nboxes[:, 3] = boxes[:, 3] - boxes[:, 1]\nout_image_esemble=draw_bboxes(img = img,\n                        bboxes = boxes, \n                        classes = [\"soft_NMS\"]*len(boxes),\n                        class_ids = [0]*len(boxes),\n                        class_name = True, \n                        colors = (0,150,0), \n                        bbox_format = 'coco',\n                        line_thickness = 2)\nout_image_esemble = cv2.cvtColor(out_image_esemble, cv2.COLOR_BGR2RGB)\nprint(\"------------------------------  SOFT_NMS   ---------------------------------------\")\ndisplay(Image.fromarray(out_image_esemble))\n\n#####################################  NMW  #####################################\nboxes, scores, labels  = run_nmw(boxes_list, scores_list, labels_list,IMG_SIZE, iou_thr, skip_box_thr,weights=weights)\nboxes[:, 2] = boxes[:, 2] - boxes[:, 0]\nboxes[:, 3] = boxes[:, 3] - boxes[:, 1]\nout_image_esemble=draw_bboxes(img = img,\n                        bboxes = boxes, \n                        classes = [\"NMW\"]*len(boxes),\n                        class_ids = [0]*len(boxes),\n                        class_name = True, \n                        colors = (0,0,255), \n                        bbox_format = 'coco',\n                        line_thickness = 2)\nout_image_esemble = cv2.cvtColor(out_image_esemble, cv2.COLOR_BGR2RGB)\nprint(\"------------------------------  NMW   ---------------------------------------\")\ndisplay(Image.fromarray(out_image_esemble))\n\n\n\n#####################################  WBF  #####################################\nboxes, scores, labels  = run_wbf(boxes_list, scores_list,labels_list,IMG_SIZE, iou_thr, skip_box_thr,weights=weights)\nboxes[:, 2] = boxes[:, 2] - boxes[:, 0]\nboxes[:, 3] = boxes[:, 3] - boxes[:, 1]\nout_image_esemble=draw_bboxes(img = img,\n                        bboxes = boxes, \n                        classes = [\"WBF\"]*len(boxes),\n                        class_ids = [0]*len(boxes),\n                        class_name = True, \n                        colors = (50,50,50), \n                        bbox_format = 'coco',\n                        line_thickness = 2)\nout_image_esemble = cv2.cvtColor(out_image_esemble, cv2.COLOR_BGR2RGB)\nprint(\"------------------------------  WBF   ---------------------------------------\")\ndisplay(Image.fromarray(out_image_esemble))","metadata":{"papermill":{"duration":4.843967,"end_time":"2022-02-07T08:36:58.589004","exception":false,"start_time":"2022-02-07T08:36:53.745037","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:27.003237Z","iopub.execute_input":"2022-02-13T17:42:27.003762Z","iopub.status.idle":"2022-02-13T17:42:28.752851Z","shell.execute_reply.started":"2022-02-13T17:42:27.003726Z","shell.execute_reply":"2022-02-13T17:42:28.751686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference","metadata":{"papermill":{"duration":0.321756,"end_time":"2022-02-07T08:36:59.282249","exception":false,"start_time":"2022-02-07T08:36:58.960493","status":"completed"},"tags":[]}},{"cell_type":"code","source":"%cd /kaggle/working/","metadata":{"papermill":{"duration":0.332993,"end_time":"2022-02-07T08:36:59.936503","exception":false,"start_time":"2022-02-07T08:36:59.60351","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:28.754091Z","iopub.execute_input":"2022-02-13T17:42:28.754793Z","iopub.status.idle":"2022-02-13T17:42:28.760215Z","shell.execute_reply.started":"2022-02-13T17:42:28.754754Z","shell.execute_reply":"2022-02-13T17:42:28.759555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import greatbarrierreef\nenv = greatbarrierreef.make_env()   # initialize the environment\niter_test = env.iter_test()  ","metadata":{"papermill":{"duration":0.3568,"end_time":"2022-02-07T08:37:00.621777","exception":false,"start_time":"2022-02-07T08:37:00.264977","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:28.761403Z","iopub.execute_input":"2022-02-13T17:42:28.762071Z","iopub.status.idle":"2022-02-13T17:42:28.786749Z","shell.execute_reply.started":"2022-02-13T17:42:28.762036Z","shell.execute_reply":"2022-02-13T17:42:28.786122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Method =\"WBF\" # NMS,Soft-NMS,NMW or WBF\nIMG_SIZE  = 3000\nIMG_SIZE1  = 6000\nIMG_SIZE2  = 6400\nIMG_SIZE3  = 6000\nIMG_SIZE4  = 3000\nAUGMENT   = False\n#--------------------------------------------------------------------------\n# model1 = load_model(CKPT_PATH1, conf=CONF1, iou=IOU1) \n# model2 = load_model(CKPT_PATH2, conf=CONF2, iou=IOU2)\n# model3 = load_model(CKPT_PATH3, conf=CONF3, iou=IOU3)\n# model3 = load_model(CKPT_PATH3, conf=CONF3, iou=IOU3)\n#--------------------------------------------------------------------------\nfor idx, (img, pred_df) in enumerate(tqdm(iter_test)):\n    bboxes1, scores1,bbclasses1  = predict(model1, img, size=IMG_SIZE1, augment=AUGMENT)\n    bboxes2, scores2,bbclasses2  = predict(model2, img, size=IMG_SIZE2, augment=AUGMENT)\n    bboxes3, scores3,bbclasses3  = predict(model3, img, size=IMG_SIZE3, augment=AUGMENT)\n#     bboxes4, scores4,bbclasses4  = predict(model4, img, size=IMG_SIZE4, augment=AUGMENT)\n    boxes_list=[]\n    scores_list=[]\n    labels_list=[]\n    \n    if len(bboxes1)>0:\n        boxes_list.append(bboxes1)\n        scores_list.append(scores1)\n        labels_list.append(bbclasses1) \n        bboxes1[:, 2] = bboxes1[:, 2] + bboxes1[:, 0]\n        bboxes1[:, 3] = bboxes1[:, 3] + bboxes1[:, 1]\n    if len(bboxes2)>0:\n        boxes_list.append(bboxes2)\n        scores_list.append(scores2)\n        labels_list.append(bbclasses2)\n        bboxes2[:, 2] = bboxes2[:, 2] + bboxes2[:, 0]\n        bboxes2[:, 3] = bboxes2[:, 3] + bboxes2[:, 1]\n    if len(bboxes3)>0:\n        boxes_list.append(bboxes3)\n        scores_list.append(scores3)\n        labels_list.append(bbclasses3)\n        bboxes3[:, 2] = bboxes3[:, 2] + bboxes3[:, 0]\n        bboxes3[:, 3] = bboxes3[:, 3] + bboxes3[:, 1]\n#     if len(bboxes4)>0:\n#         boxes_list.append(bboxes4)\n#         scores_list.append(scores4)\n#         labels_list.append(bbclasses4)\n#         bboxes4[:, 2] = bboxes4[:, 2] + bboxes4[:, 0]\n#         bboxes4[:, 3] = bboxes4[:, 3] + bboxes4[:, 1]\n\n    if (len(bboxes1) + len(bboxes2) + len(bboxes3))>0:\n        if Method ==\"NMS\":\n            boxes, scores, labels  = run_nms(boxes_list, scores_list, labels_list,IMG_SIZE, iou_thr=iou_thr,weights=weights)\n        elif Method ==\"Soft-NMS\":\n            boxes, scores, labels  = run_soft_nms(boxes_list, scores_list, labels_list,IMG_SIZE, iou_thr,skip_box_thr,sigma,weights=weights)\n        elif Method ==\"NMW\":\n            boxes, scores, labels  = run_nmw(boxes_list, scores_list, labels_list,IMG_SIZE, iou_thr, skip_box_thr,weights=weights)\n        elif Method ==\"WBF\":\n            boxes, scores, labels  = run_wbf(boxes_list, scores_list,labels_list,IMG_SIZE, iou_thr, skip_box_thr,weights=weights)\n        else:\n            Method =\"Only First Model(No Ensembling)\"\n            boxes, scores, labels  = bboxes1,scores1,bbclasses1 \n        boxes[:, 2] = boxes[:, 2] - boxes[:, 0]\n        boxes[:, 3] = boxes[:, 3] - boxes[:, 1]\n    else: boxes=[]\n    boxes\n    boxes = check_result(boxes,img.shape,scores)\n    annot = format_prediction(boxes,scores)\n    pred_df['annotations'] = annot\n    env.predict(pred_df)\n    print(\"------------------------------  \" + Method +\"   ---------------------------------------\")\n    if idx<3:\n        display(show_img(img, boxes, bbox_format='coco'))","metadata":{"papermill":{"duration":9.328198,"end_time":"2022-02-07T08:37:10.271837","exception":false,"start_time":"2022-02-07T08:37:00.943639","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-02-13T17:42:28.788022Z","iopub.execute_input":"2022-02-13T17:42:28.788421Z","iopub.status.idle":"2022-02-13T17:42:32.091251Z","shell.execute_reply.started":"2022-02-13T17:42:28.788389Z","shell.execute_reply":"2022-02-13T17:42:32.090639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bboxes1","metadata":{"execution":{"iopub.status.busy":"2022-02-13T17:42:32.092808Z","iopub.execute_input":"2022-02-13T17:42:32.093308Z","iopub.status.idle":"2022-02-13T17:42:32.098109Z","shell.execute_reply.started":"2022-02-13T17:42:32.093272Z","shell.execute_reply":"2022-02-13T17:42:32.097514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"sub_df = pd.read_csv('submission.csv')\nsub_df.head()","metadata":{"papermill":{"duration":0.391307,"end_time":"2022-02-07T08:37:11.053591","exception":false,"start_time":"2022-02-07T08:37:10.662284","status":"completed"},"tags":[]}}]}