转自:目标检测中的NMS
更多文章阅读:
1,2019自动驾驶资料大放送
2,CNN中的感受野
3,7天搞定机器学习基础知识
4,目标检测中的anchor分析
5,陆奇老师解说AI时代的创新
非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,用于目标检测中,就是提取置信度高的目标检测框,而抑制置信度低的误检框。一般来说,用在当解析模型输出到目标框时,目标框会非常多,具体数量由anchor数量决定,其中有很多重复的框定位到同一个目标,nms用来去除这些重复的框,获得真正的目标框。如下图所示,人、马、车上有很多框,通过nms,得到唯一的检测框。
一、正矩形框的nms
1,标准的nms
具体算法流程如下图:
2,soft-nms
NMS算法中的最大问题就是它将相邻低置信度的检测框的分数均强制归零,即 S ß S-si ;如果同类目标比较密集,存在遮挡时,如密集人群,用这种方式处理很容易产生漏检。soft-nms吸取了nms的教训,在算法执行过程中不是简单的对IoU大于阈值的检测框删除,而是降低得分。算法流程如下图:
根据f(iou(M,bi))函数的不同,可以有以下两种。
一种为线性函数:
另一种为高斯函数(sigma参数人为指定即可):
3,adaptive nms
adaptive nms要解决的问题和soft-nms一样,但是soft-nms中置信度的阈值Nt主要依赖于人工设定,不能适应目标拥挤程度不同的情况。adaptive nms提出根据目标的密度来自动设定置信度阈值,算法流程如下图,其中dm为自适应阈值,通过网络根据目标密度预测得到。
二、其他类型框的nms
以上的nms的框的边都是平行于坐标轴的,那对于倾斜的框如何做nms呢?主要区别在于IOU的计算的不同,整个流程还是一样的。
1,INMS,基于倾斜框(rotate box,rbox)的nms
将当前遍历的rbox与剩余的rbox进行交集运算得到相应的相交点集合,并根据判断相交点集合组成的凸边形的面积,计算每两个rbox的IOU。可以使用opencv实现,r1,r2表示两个rbox,用中心点坐标、长宽、旋转角5个值表示。具体方法如下:
int_pts = cv2.rotatedRectangleIntersection(r1, r2) #求两个旋转矩形的交集,并返回相交的点集合
if int_pts is not None:
order_pts = cv2.convexHull(int_pts, returnPoints=True) #求点集的凸边形
int_area = cv2.contourArea(order_pts) #计算当前点集合组成的凸边形的面积
IOU= int_area * 1.0 / (area_r1 + area_r2 - int_area + 0.0000001)
2,PNMS(Polygon nms)
更极端情况下,物体无法用矩形表达,而是一个多边形,计算IOU的方式相同,首先得到两个多边形相交的点集,判断相交点集合组成的凸边形的面积,计算两个多边形的IOU。可以使用boost库的geometry的polygon相关函数实现。也可以使用shapely.geometry的polygon相关函数实现。
3,MNMS(mask nms)
从名字上可以看出,是基于分割区域的nms,其中IOU的计算方式,也变成了mmi,如下公式,其中I为相交区域面积,IA为A区域面积,IB为B区域面积。计算相交区域面积一种方式可以获取两个区域的点集,判断相交的部分;另一种将两个区域用二值图像表达,通过图像操作实现。