{"cells":[{"metadata":{"_uuid":"051d70d956493feee0c6d64651c6a088724dca2a","_execution_state":"idle","trusted":false},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom ensemble_boxes import *\n\n\ndef coor_normalize(x,y):\n    return [i/y for i in x]\n    \ndef get_all(sub):\n    sub[\"class\"] = sub.PredictionString.apply(lambda x: x.split(\" \")[::6]).apply(lambda x: [int(i) for i in x])\n    sub[\"scores\"] = sub.PredictionString.apply(lambda x: x.split(\" \")[1::6]).apply(lambda x: [float(i) for i in x])\n    sub[\"x_min\"] = sub.PredictionString.apply(lambda x: x.split(\" \")[2::6]).apply(lambda x: [float(i) for i in x])\n    sub[\"y_min\"] = sub.PredictionString.apply(lambda x: x.split(\" \")[3::6]).apply(lambda x: [float(i) for i in x])\n    sub[\"x_max\"] = sub.PredictionString.apply(lambda x: x.split(\" \")[4::6]).apply(lambda x: [float(i) for i in x])\n    sub[\"y_max\"] = sub.PredictionString.apply(lambda x: x.split(\" \")[5::6]).apply(lambda x: [float(i) for i in x])\n    \n    sub[\"x_min\"] = sub.apply(lambda row: coor_normalize(row['x_min'],10000), axis=1)\n    sub[\"x_max\"] = sub.apply(lambda row: coor_normalize(row['x_max'],10000), axis=1)\n    \n    sub[\"y_min\"] = sub.apply(lambda row: coor_normalize(row['y_min'],10000), axis=1)\n    sub[\"y_max\"] = sub.apply(lambda row: coor_normalize(row['y_max'],10000), axis=1)\n    \n    return sub\n\ndef get_boxes(sub):\n    box_list = []\n    box_df = sub[[\"image_id\",\"class\",\"scores\"]].copy()\n    for i in tqdm(sub.index):\n        temp = np.stack((sub.loc[i,\"x_min\"],sub.loc[i,\"y_min\"],sub.loc[i,\"x_max\"],sub.loc[i,\"y_max\"]),axis=1)\n        temp = [k.tolist() for k in temp]\n        box_list.append(temp)\n    return box_list\n\ndef lets_ensemble(val_det,val_det2,\n                  check_classes=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],\n                  is_nms=True,\n                  is_wbf=True,\n                 iou_thr = 0.6,\n                  skip_box_thr = 0.000,\n    sigma = 0.1,\n    weights = [2,1],\n                  nms_iou=0.35\n                 ):\n    \n    val_det = get_all(val_det)\n    val_box = get_boxes(val_det)\n\n    val_det2 = get_all(val_det2)\n    val_box2 = get_boxes(val_det2)\n\n\n    blend_df = val_det[[\"image_id\"]].copy()\n    blend_df[\"PredictionString\"] = \"\"\n    blend_df.head()\n\n\n    i = 1\n    final_blend_list = []\n    lengths_list = []\n    change_count = 0\n    changed_imdex_list = []\n    for i in tqdm(val_det.index):\n\n\n        filter_ = np.isin(np.array(val_det.loc[i,\"class\"]),check_classes)\n        filter2_ = np.isin(np.array(val_det2.loc[i,\"class\"]),check_classes)\n\n        labels_list = [np.array(val_det.loc[i,\"class\"])[filter_],np.array(val_det2.loc[i,\"class\"])[filter2_]]\n        scores_list = [np.array(val_det.loc[i,\"scores\"])[filter_],np.array(val_det2.loc[i,\"scores\"])[filter2_]]\n        boxes_list = [np.array(val_box[i])[filter_],np.array(val_box2[i])[filter2_]]\n\n        if is_wbf:\n            boxes, scores, labels = weighted_boxes_fusion(boxes_list, scores_list, labels_list, weights=weights, iou_thr=iou_thr, skip_box_thr=skip_box_thr)\n        else:\n            boxes, scores, labels = nms(boxes_list, scores_list, labels_list, weights=weights, iou_thr=iou_thr)\n        if is_nms:\n            boxes, scores, labels = nms([boxes], [scores], [labels], weights=None, iou_thr=nms_iou)\n\n        labels = np.concatenate((np.array(val_det.loc[i,\"class\"])[~filter_],labels))\n        scores = np.concatenate((np.array(val_det.loc[i,\"scores\"])[~filter_],scores))\n        boxes = np.concatenate((np.array(val_box[i])[~filter_],boxes))\n\n        sorted_index_list = np.argsort(scores)[::-1]\n        labels = labels[np.argsort(scores)[::-1]] \n        boxes = boxes[np.argsort(scores)[::-1]] \n        scores = scores[np.argsort(scores)[::-1]] \n\n\n\n        \n        # Rescaling boxes\n        boxes[:,0] = boxes[:,0] * 10000\n        boxes[:,2] = boxes[:,2] * 10000\n\n        boxes[:,1] = boxes[:,1] * 10000\n        boxes[:,3] = boxes[:,3] * 10000\n\n        scores = np.clip(scores,0,1)\n\n        len_ = len(labels)\n        lengths_list.append(len_)\n        temp = []\n        for j in range(len_):\n            temp.append(str(int(labels[j])))\n            temp.append(str(scores[j]))\n            temp.append(\" \".join([str(k) for k in boxes[j]]))\n\n\n        final_string = \" \".join(temp)\n        first_string = val_det.loc[i,\"PredictionString\"]\n        blend_df.loc[i,\"PredictionString\"] = final_string\n        if first_string != final_string: #Check\n            change_count+=1\n            changed_imdex_list.append(i)\n         \n    print(len_)\n    return blend_df\n\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Example \n# blend_df = lets_ensemble(file_1,file_2,check_classes=[1,4,5],iou_thr = 0.4,is_nms=False) # This means, you are only ensembling boxes \n# having classes 1,4 and 5. Rest of the boxes will be kept as they are in file_1.\n","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}