def wnms(results,outpath,outfile,iouthresh,savejson=1,nmsname="nms"): indexedresults=indexResults(results) mergedresults = defaultdict(list) for (imageid, objlist) in indexedresults.items(): for objdict in objlist: mergedresults[imageid].append([objdict['bbox'][0],objdict['bbox'][1],objdict['bbox'][2],objdict['bbox'][3],objdict['score'], objdict['category_id']]) objlist=mergedresults[imageid] # masxlist=[i[2]*i[3] for i in objlist] # max_wh=np.max(masxlist) # objlist=[[i[0],i[1],i[2],i[3],i[4]*0.05+i[3]*i[2]*0.95/max_wh,i[5],i[6]] for i in objlist ] if nmsname=="softnms": newdets,keep=soft_nms(np.array(objlist),iou_thr=iouthresh, method='gaussian',sigma=0.5, min_score=1e-3)#'gaussian''linear', # keep =py_cpu_softnms(np.array(objlist),thresh=nms_thresh, Nt=0.02, sigma=0.5, method=1) outdets = [] for index in keep: outdets.append(objlist[index]) mergedresults[imageid] = outdets elif nmsname=="nms": keep = py_cpu_nms(np.array(objlist),iouthresh) outdets = [] for index in keep: outdets.append(objlist[index]) mergedresults[imageid] = outdets elif nmsname=="setnms": keep=np.array(objlist)[set_cpu_nms(np.array(objlist), nms_thresh)].tolist() mergedresults[imageid] = keep elif nmsname==False: print("no nms") else: raise ValueError('nmsname must is softnms or nms') savelist = [] def say2(iss): imageid, objlist=iss[0],iss[1] templist=[] for obj in objlist:#obj [22528, 1270, 24576, 1, 1.0, 4] templist.append({ "image_id": imageid, "category_id": obj[5], "bbox": obj[:4], # "bbox": tlbr2tlwh(obj[:4]), "score": obj[4] }) if isfliter: if 391<=imageid<=420:#14otc templist=fliter(templist,fliterscore["14_OCT"],AnotPath="/root/data/gvision/dataset/xml/14_OCT_Habour.xml", segma_woh=3,segma_area=3,up_bound=4000,down_bound=None,down_fs=0.95,yichang=0) if 421<=imageid<=450:#15 nanshangongyuan templist=fliter(templist,fliterscore["15_nanshan"],AnotPath="/root/data/gvision/dataset/xml/15_Nanshani_Park.xml", segma_woh=3,segma_area=2,up_bound=1500,down_bound=7000,down_fs=None,yichang=0) if 451<=imageid<=465:#16xiaoxue----------01 templist=fliter(templist,fliterscore["1601_shool"],AnotPath="/root/data/gvision/dataset/xml/IMG_16_01_01.xml", segma_woh=3,segma_area=3,up_bound=0,down_bound=None,down_fs=None,yichang=0) if 466<=imageid<=480:#16xiaoxue--------02 templist=fliter(templist,fliterscore["1602_shool"],AnotPath="/root/data/gvision/dataset/xml/IMG_16_25_02_.xml", segma_woh=3,segma_area=3,up_bound=0,down_bound=None,down_fs=None,yichang=0) if 481<=imageid<=510:#17zhongguan templist=fliter(templist,fliterscore["17_newzhongguan"],AnotPath="/root/data/gvision/dataset/xml/17_New_Zhongguan.xml", segma_woh=3,segma_area=3,up_bound=6000,down_bound=7000,down_fs=None,yichang=0) if 511<=imageid<=540:#18xilin-------01 templist=fliter(templist,fliterscore["1801_xilin"],AnotPath="/root/data/gvision/dataset/xml/IMG_18_01_01.xml", segma_woh=3,segma_area=3,up_bound=4000,down_bound=None,down_fs=None,yichang=0) if 541<=imageid<=555:#18xilin----------02 templist=fliter(templist,fliterscore["1802_xilin"],AnotPath="/root/data/gvision/dataset/xml/IMG_18_02.xml", segma_woh=3,segma_area=3,up_bound=4000,down_bound=None,down_fs=None,yichang=0) if test: print(f"del_inter after len {len(templist)}") return templist executor = ThreadPoolExecutor(max_workers=80) func_var = [[file_name,dict_value] for file_name,dict_value in mergedresults.items()] print("fusion bbox into self'image start ") pbar2= tqdm(total=len(mergedresults), ncols=50) for temp in executor.map(say2,func_var): # print(temp) savelist+=temp pbar2.update(1) pbar2.close() # assert len(savelist)==0,f"error{savelist} error" if savejson: assert isinstance(savelist[0], dict),f"the results must is not {savelist[0]}" # if not isinstance(savelist[0], dict): # raise f"the results must is not {savelist[0]}" # print(savelist[0]['category_id']) outfile=outfile[:-5].replace("all",f"{savelist[1]['category_id']}")+".json" with open(os.path.join(outpath, outfile), 'w') as f: dict_str = json.dumps(savelist, indent=2) f.write(dict_str) print(f"save ***{len(savelist)} results*** json :{os.path.join(outpath, outfile)}") return savelist
def mergeResults(self,outfile,merge_input_mode="xywh",is_nms=True,nms_thresh=0.9,nms_name="nms"): """ :param is_nms: do non-maximum suppression on after merge :param nms_thresh: non-maximum suppression IoU threshold :return: """ print('Loading source annotation json file: {}'.format(self.srcannopath)) with open(self.srcannopath, 'r') as load_f: srcanno = json.load(load_f) mergedresults = defaultdict(list) # random.seed(0) # print("len",len(self.results)) keep_input=[] for (filename, objlist) in self.results.items(): # for (filename, objlist) in random.sample(self.results.items(),2): # srcfile, scale, left, up = filename.split('___') # srcfile =srcfile.replace('_IMG', '/IMG')+".jpg" # up =up[:-4] # # print(filename, objlist) # # srcimageid =srcfile[-2:] # # print(srcfile) # srcimageid = srcanno[srcfile]['image id'] # print("srcimageid",srcimageid) # print(srcfile, scale, left, up ) srcfile, paras = filename.split('___')#srcfile, paras 15_Nanshani_Park_IMG_15_04 0.5__4224__6144.jpg # print("srcfile, paras",srcfile, paras ) srcfile = srcfile.replace('_IMG', '/IMG') + self.imgext#02_Xili_Crossroad_IMG_02_01___0.5__0__0.jpg srcimageid = srcanno[srcfile]['image id'] scale, left, up = paras.replace(self.imgext, '').split('__')#scale, left, up 0.5 4224 6144 print(srcfile, scale, left, up ) print(f"before objlist {len(objlist)}") if not iskeep_dets: for objdict in objlist: mergedresults[srcimageid].append([*recttransfer(objdict['bbox'], float(scale), int(left), int(up),merge_input_mode),objdict['score'], objdict['category_id'],objdict['image_id']]) if iskeep_dets: keep_input=keep_input+[[srcimageid,int(left), int(up),float(scale),i['bbox'][0],i['bbox'][1],i['bbox'][2],i['bbox'][3],i['score'],i['image_id'],i['category_id']] for i in objlist] # keep_input.append([[srcimageid,int(left), int(up),float(scale),i['bbox'][0],i['bbox'][1],i['bbox'][2],i['bbox'][3],i['score'],i['image_id'],i['category_id']] for i in objlist]) if iskeep_dets: print(f"before keep {len(keep_input)}") if 391<=srcimageid<=420:#14otcUP_boundary keep_dets,_keep_values=self.keep_dets(np.array(keep_input),UP_boundary[0],PANDA_TEST_SIZE[0]) if 421<=srcimageid<=450:#15 nanshangongyuan keep_dets,_keep_values=self.keep_dets(np.array(keep_input),UP_boundary[1],PANDA_TEST_SIZE[1]) if 451<=srcimageid<=465:#16xiaoxue----------01 keep_dets,_keep_values=self.keep_dets(np.array(keep_input),UP_boundary[2],PANDA_TEST_SIZE[2]) if 466<=srcimageid<=480:#16xiaoxue--------02 keep_dets,_keep_values=self.keep_dets(np.array(keep_input),UP_boundary[3],PANDA_TEST_SIZE[2]) if 481<=srcimageid<=510:#17zhongguan keep_dets,_keep_values=self.keep_dets(np.array(keep_input),UP_boundary[4],PANDA_TEST_SIZE[3]) if 511<=srcimageid<=540:#18xilin-------01 keep_dets,_keep_values=self.keep_dets(np.array(keep_input),UP_boundary[5],PANDA_TEST_SIZE[4]) if 541<=srcimageid<=555:#18xilin----------02 keep_dets,_keep_values=self.keep_dets(np.array(keep_input),UP_boundary[6],PANDA_TEST_SIZE[5]) print(f"after keep {len(keep_dets)}") for objdict,keep_value in zip(keep_dets,_keep_values): left, up,scale=keep_value[0],keep_value[1],keep_value[2] # print("objdict",objdict)#{'image_id': 7110, 'bbox': [47.7, 866.2, 198.8, 442.8], 'score': 0.83231, 'category_id': 1} mergedresults[srcimageid].append([*recttransfer(objdict['bbox'], float(scale), int(left), int(up),merge_input_mode), objdict['score'], objdict['category_id'],objdict['image_id']]) img_size = {} for anno in srcanno: # print(srcanno[anno]['image id']) img_size[srcanno[anno]['image id']] = srcanno[anno]['image size'] if is_nms: if nms_name=="nms": for (imageid, objlist) in mergedresults.items(): masxlist=[i[2]*i[3] for i in objlist] max_wh=np.max(masxlist) objlist=[[i[0],i[1],i[2],i[3],i[4]*0.05+i[3]*i[2]*0.95/max_wh,i[5],i[6]] for i in objlist ] keep = py_cpu_nms(np.array(objlist), nms_thresh) outdets = [] for index in keep: outdets.append(objlist[index]) mergedresults[imageid] = outdets if nms_name=="setnms": for (imageid, objlist) in mergedresults.items(): print("input nms element",objlist[0])#[829, 5939, 923, 6000, 0.24672751128673553, 1, 149] print(f"before setnms {nms_thresh} ",len(objlist)) keep=np.array(objlist)[set_cpu_nms(np.array(objlist), nms_thresh)].tolist() # print("keep",keep,"\n",len(keep),type(keep)) print(f"{imageid} after setnms_{nms_thresh} ",len(keep)) mergedresults[imageid] = keep if nms_name=="emnms": for (imageid, objlist) in mergedresults.items(): size_anno = img_size[imageid] boxes = [[obj[0] / size_anno['width'], obj[1] / size_anno['height'], obj[2] / size_anno['width'], obj[3] / size_anno['height']] for obj in objlist] scores = [obj[4] for obj in objlist] labels = [obj[5] for obj in objlist] boxes, scores, labels = nms([boxes], [scores], [labels]) boxes[:, [0, 2]] *= size_anno['width'] boxes[:, [1, 3]] *= size_anno['height'] outdets = [x[0] + [x[1], x[2]] for x in zip(boxes.tolist(), scores.tolist(), labels.tolist())] mergedresults[imageid] = outdets if nms_name=="softnms": for (imageid, objlist) in mergedresults.items(): print(f"{imageid} before softnms_{nms_thresh} ",len(objlist)) # print("ssss",len(objlist[0])) # print("ssss",objlist[0]) masxlist=[i[2]*i[3] for i in objlist] max_wh=np.max(masxlist) objlist=[[i[0],i[1],i[2],i[3],i[4]*0.05+i[3]*i[2]*0.95/max_wh,i[5],i[6]] for i in objlist ] # tempmax=np.max(np.array(objlist)[:, 4]) # print("max",tempmax)#208909381.05317593 # objlist=[[i[0],i[1],i[2],i[3],i[4]/(tempmax+0.00001),i[5],i[6]] for i in objlist ] # print(objlist) newdets,keep=soft_nms(np.array(objlist),iou_thr=nms_thresh, method='linear',sigma=0.5, min_score=1e-3)#'gaussian''linear', # keep =py_cpu_softnms(np.array(objlist),thresh=nms_thresh, Nt=0.02, sigma=0.5, method=1) # print(keep) outdets = [] for index in keep: outdets.append(objlist[index]) print(f"{imageid} after softnms_{nms_thresh} ",len(keep)) mergedresults[imageid] = outdets savelist = [] def say2(iss): imageid, objlist=iss[0],iss[1] # print(imageid, objlist) templist=[] for obj in objlist:#obj [22528, 1270, 24576, 1, 1.0, 4] # print(obj) templist.append({ "image_id": imageid, "category_id": obj[5], "bbox": tlbr2tlwh(obj[:4]), "score": obj[4] }) if test: print(f"fliter berfore len {len(templist)}") if isfliter: if 391<=imageid<=420:#14otc templist=fliter(templist,fliterscore["14_OCT"],AnotPath="/root/data/gvision/dataset/xml/14_OCT_Habour.xml", segma_woh=3,segma_area=3,up_bound=4000,down_bound=None,down_fs=0.95,yichang=0) if 421<=imageid<=450:#15 nanshangongyuan templist=fliter(templist,fliterscore["15_nanshan"],AnotPath="/root/data/gvision/dataset/xml/15_Nanshani_Park.xml", segma_woh=3,segma_area=2,up_bound=1500,down_bound=7000,down_fs=None,yichang=0) if 451<=imageid<=465:#16xiaoxue----------01 templist=fliter(templist,fliterscore["1601_shool"],AnotPath="/root/data/gvision/dataset/xml/IMG_16_01_head.xml", segma_woh=3,segma_area=3,up_bound=0,down_bound=None,down_fs=None,yichang=0) if 466<=imageid<=480:#16xiaoxue--------02 templist=fliter(templist,fliterscore["1602_shool"],AnotPath="/root/data/gvision/dataset/xml/IMG_16_25_02_.xml", segma_woh=3,segma_area=3,up_bound=0,down_bound=None,down_fs=None,yichang=0) if 481<=imageid<=510:#17zhongguan templist=fliter(templist,fliterscore["17_newzhongguan"],AnotPath="/root/data/gvision/dataset/xml/17_New_Zhongguan.xml", segma_woh=3,segma_area=3,up_bound=6000,down_bound=7000,down_fs=None,yichang=0) if 511<=imageid<=540:#18xilin-------01 templist=fliter(templist,fliterscore["1801_xilin"],AnotPath="/root/data/gvision/dataset/xml/IMG_18_01_01.xml", segma_woh=3,segma_area=3,up_bound=4000,down_bound=None,down_fs=None,yichang=0) if 541<=imageid<=555:#18xilin----------02 templist=fliter(templist,fliterscore["1802_xilin"],AnotPath="/root/data/gvision/dataset/xml/IMG_18_02.xml", segma_woh=3,segma_area=3,up_bound=4000,down_bound=None,down_fs=None,yichang=0) if isdel_inter: templist=del_inter(templist) if test: print(f"del_inter after len {len(templist)}") return templist executor = ThreadPoolExecutor(max_workers=80) func_var = [[file_name,dict_value] for file_name,dict_value in mergedresults.items()] print("merge bbox into self'image start ") pbar2= tqdm(total=len(mergedresults), ncols=50) for temp in executor.map(say2,func_var): savelist+=temp pbar2.update(1) pbar2.close() with open(os.path.join(self.outpath, outfile), 'w', encoding=self.code) as f: dict_str = json.dumps(savelist, indent=2) f.write(dict_str) print(f"save ***results*** json :{os.path.join(self.outpath, outfile)}")
def wnms(results, outpath, outfile, iouthresh, savejson=1, nmsname="nms"): indexedresults = indexResults(results) mergedresults = defaultdict(list) for (imageid, objlist) in indexedresults.items(): for objdict in objlist: mergedresults[imageid].append([ objdict['bbox'][0], objdict['bbox'][1], objdict['bbox'][2], objdict['bbox'][3], objdict['score'], objdict['category_id'], objdict["number"] ]) objlist = mergedresults[imageid] # masxlist=[i[2]*i[3] for i in objlist] # max_wh=np.max(masxlist) # objlist=[[i[0],i[1],i[2],i[3],i[4]*0.05+i[3]*i[2]*0.95/max_wh,i[5],i[6]] for i in objlist ] if nmsname == "softnms": newdets, keep = soft_nms(np.array(objlist), iou_thr=iouthresh, method='linear', sigma=0.5, min_score=1e-3) #'gaussian''linear', # keep =py_cpu_softnms(np.array(objlist),thresh=nms_thresh, Nt=0.02, sigma=0.5, method=1) outdets = [] for index in keep: outdets.append(objlist[index]) mergedresults[imageid] = outdets elif nmsname == "setnms": print(objlist[0]) print(len(objlist[0])) keep = np.array(objlist)[set_cpu_nms(np.array(objlist), iouthresh)].tolist() mergedresults[imageid] = keep elif nmsname == False: print("no nms") else: raise ValueError('nmsname must is softnms or nms') savelist = [] def say2(iss): imageid, objlist = iss[0], iss[1] templist = [] for obj in objlist: #obj [22528, 1270, 24576, 1, 1.0, 4] templist.append({ "image_id": imageid, "category_id": obj[5], "bbox": obj[:4], # "bbox": tlbr2tlwh(obj[:4]), "score": obj[4] }) return templist executor = ThreadPoolExecutor(max_workers=80) func_var = [[file_name, dict_value] for file_name, dict_value in mergedresults.items()] print("fusion bbox into self'image start ") pbar2 = tqdm(total=len(mergedresults), ncols=50) for temp in executor.map(say2, func_var): # print(temp) savelist += temp pbar2.update(1) pbar2.close() # assert len(savelist)==0,f"error{savelist} error" if savejson: assert isinstance(savelist[0], dict), f"the results must is not {savelist[0]}" # if not isinstance(savelist[0], dict): # raise f"the results must is not {savelist[0]}" # print(savelist[0]['category_id']) outfile = outfile[:-5].replace( "all", f"{savelist[1]['category_id']}") + ".json" with open(os.path.join(outpath, outfile), 'w') as f: dict_str = json.dumps(savelist, indent=2) f.write(dict_str) print( f"save ***{len(savelist)} results*** json :{os.path.join(outpath, outfile)}" ) return savelist