Beispiel #1
0
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
Beispiel #2
0
    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