defnms(bboxes,iou_thres,thres): #bboxes:[[1,0.8,x1,y1,x2,y2],...],预测的框的集合,每一个子列表代表一个框 #其中, #bboxes[0][0]:预测类别 #bboxes[0][1]:置信度 #bboxes[0][2:]:左上角和右下角坐标 asserttype(bboxes)==list #去掉置信度小于thres的框 bboxes=[box for box in bboxes if box[1]>thres] #将所有的框按照置信度从大到小排序 bboxes=sorted(bboxes,key=lambda x:x[1],reverse=True) bboxes_after_nms=[]#存储最终保留下来的框 while bboxes: chosen_box=bboxes.pop(0)#拿出当前置信度最大的框 bboxes_after_nms.append(chosen_box)#将它保存起来,用于返回 #更新候选框的集合: #某个框和刚刚拿出去的框不是同一类别,则保留; #某个框和刚刚拿出去的框是同一类别,但是两者iou小于预先设定的iou_thres,也保留。此时该框可能是同一类别的另外一个目标(图片中有多个同类型目标) bboxes=[box for box in bboxes if box[0]!=chosen_box[0] \ or insert_over_union(torch.tensor(chosen_box[2:]),torch.tensor(box[2:]))<iou_thres] return bboxes_after_nms