目标检测中的非最大值抑制算法-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
计算机视觉是人工智能的一个重要领域,它可以识别和理解图像和场景。
它包括图像识别.目标检测.图像分割.图像生成.图像超分辨率等许多子领域。由于大量的实际用例,目标检测可能是最广泛使用的。
目标检测
目标检测是指计算机系统在图像中定位目标并识别每个目标的能力。目标检测已广泛应用于人脸检测.车辆检测.行人计数.安全系统和自主车辆。
目标检测模型从端到端学习范式的发展中受益匪浅:建议.特征和分类器成为一个神经网络,将一般目标检测的结果提高了两倍[1]一般来说,所有现代目标检测模型都遵循三个步骤:
1.建议窗口的搜索空间(通过滑动窗口或使用建议的稀疏窗口)。
2.使用分类器/回归对窗口进行评分。
3.合并可能属于同一对象的窗口。
最后一步称为”非最大抑制”
边界框
在对象检测中,我们通常使用边界框来描述对象在图像中的空间位置。
边界框是使用左上角和右下角坐标绘制的矩形。另一个常见的边界框表示由矩形的中心和矩形的高度和宽度组成。
非最大算法(NMS)
可以使用以下步骤解释该算法:
输入:检测到的每个对象的边界框列表.类名和输出概率。
1.删除输出概率分数小于指定阈值的边界框。
2.按输出概率的降序排列剩余边界框的列表。
3.遍历排序的边界框列表,直到至少剩下一个元素。
4.从列表中删除第一个边界框,并将其标记为”当前元素”。此外,检查借据。如果IOU高于指定的阈值,则从列表中删除元素,并将当前元素附加到最终列表中
5.重复步骤3和4。
6.返回”最终列表”
NMS算法试运行
假设下图(图1)包含两只狗(Maya在左侧,Zoro在右侧)。我们有一个对象检测模型,可以在图像中区分Maya和Zoro。
当使用上图来推断我们的目标检测模型(没有NMS)时,我们将得到图2所示的输出。在这里,我们可以看到,我们在单个对象上得到了多个具有自己概率分数的边界框。
我们的目标是为对象选择最合适的边界框。换句话说,我们必须从概率为0.94.0.68和0.47的三个框中选择Maya边界框。同样,我们必须在概率为0.9和0.58的两个边界框中找到最佳Zoro边界框。
根据该算法,我们将首先丢弃概率分数低于指定阈值的所有边界框。例如,如果将阈值设置为0.5,我们将丢弃Maya概率为0.47的边界框。
此外,我们将找到概率得分最高的边界框,并用同一类的所有其他边界框检查其IOU。如果IOU高于阈值(表示同一对象),则丢弃概率分数较低的边界框。
同样,我们将对图像中所有检测到的对象执行以下步骤。最终输出如图3所示。
密码
首先,我们将初始化概率置信阈值和IOU阈值。例如,如果边界框的概率低于概率置信阈值,我们将丢弃该边界框。同样,如果IOU分数高于定义的阈值,我们将不考虑输出概率低的边界框。
导入cv2类NMS:def__init_(self)->无:self.conf=0.5 self.iou_阈值=0.4
下面截取的代码中的IOU函数计算
bboxes _ list=〔class,X(左上),Y(左上角),X(右下角),Y,右下角,输出_概率〕样本值:0 187 90 586 607 0.94 0 120 116 600 370 0.68 1 511 185 961 418 0.58 0 340 145 568 478 0.47 1 524 70 920 565 0.92
def draw_overlay(self,image,bboxes_list):overlay_color={’0’:(0,255,0),’1’:(坐标〔2〕))终点=(int(坐标〔3〕),int(坐标〕4〕))prob=float(坐标〔5〕)text_start_point=(int)坐标〔1〕,int(coord〔2〕〕-10)image=cv2.矩形(图像,起点,终点,覆盖层颜涩〔class_名称〕,覆盖层厚度)image=cv2.putText(image,str(prob),text_start_point,font,0.8,overlay_color〔class_name〕,overlay_thickness-1,cv2.LINE_AA)cv2.imshow(“im”,image)cv2.waitKey(0)cv2。destroyAllWindows()
以下功能是上述NMS算法的实现。此函数用于在应用非最大抑制算法后返回所需的边界框。
def nms(self,image,bboxes_list):req_bboxes,final_boxes=〔〕,〔〕表示bboxes中的坐标:prob=float(coord〔5〕)如果prob>self.conf:req_bboxes.append(coord)#根据概率得分对边界框进行排序(req_bboxes,reverse=True,key=lambda x:x〔5〕)而len(bboxes_sorted)>0:#移除最佳概率边界框=bboxes sorted.pop(0)对于bboxes中的b排序:#如果框〔0〕==b〔0〕:iou=self.iou(框〔1:-1〕,b〔1:-1〕)如果iou>=self.iou_阈值:#如果iou很大,则丢弃概率最低的盒子bbox_排序。移除(b)打印(len(bboxes_排序))最后的_盒子。追加(box)返回最后的__盒子
下面是NMS类的驱动程序代码。首先,我们读取坐标。txt获取边界框的坐标和其他细节;然后,我们应用NMS算法来获得所需的边界框。
如果__name_==”__main_”:image=cv2.imread(“zoraya.jpg”),打开(“coordinates.txt”,”r”)作为f:data=f.readlines()data=〔i〔:-1〕.split(”)for i in data〕obj=NMS()obj。draw_overlay(image,data)final_boxes=obj.NMS(image.data)对象绘制_覆盖(图像,最终_框)
coordinates.txt 0 187 90 586 607 0.94 0 120 116 600 370 0.68 1 511 185 961 418 0.58 0 340 145 568 478 0.47 1 524 70 920 565 0.92
结论
600学习网 » 目标检测中的非最大值抑制算法-600学习网