[目标检测][python][cpp]非极大值抑制(NMS)算法原理以及CPP实现
2021-01-25 04:14
标签:double pac 有一个 重复 use port ace 区别 方法 在目标检测中,有一个很重要的算法,就是非极大值抑制算法,它本身是一个贪心算法。在多个目标检测预测框结果里找到极大的那个,也即是置信度最高的那个。最近有被问到有关NMS的CPP实现,大概查了一下,大部分都是用python写的,用cpp可能更困难一些。 输入:包含多个输入框和置信度的N*5矩阵,其中N为检测框的数量,阈值Th cpp的实现略微麻烦一些,主要是因为需要自己手写结构,并且需要生成排序算法,当然,由于使用了std::vector,在删除时需要移动元素,因此还有很大的可改进空间,比如增加一个flag数组。 其他变体比如softNMS是将IoU大于阈值的框的score设定较高的衰减率,这样IoU较大的框的分数会不断下降,直至小于阈值。使用这种方法和NMS的区别在于,NMS直接删除,将对应框的score设置为0,而softNMS则设定一个下降值。 [目标检测][python][cpp]非极大值抑制(NMS)算法原理以及CPP实现 标签:double pac 有一个 重复 use port ace 区别 方法 原文地址:https://www.cnblogs.com/wildkid1024/p/12861127.html问题描述
解决思路
算法原理
输出:检测物体不重复的框M*5的矩阵,M为图片中目标数量
python实现
import numpy as np
def NMS(dets, thresh):
x1 = dets[:,0]
y1 = dets[:,1]
x2 = dets[:,2]
y2 = dets[:,3]
scores = dets[:,4]
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
order=score.argsort()[::-1]
keep = []
while order.size() > 0:
p = order[0]
keep.append(p)
xx1 = np.maximum(x1[p], x1[1:])
yy1 = np.maximum(y1[p], y1[1:])
xx2 = np.minimum(x2[p], y2[1:])
yy2 = np.minimum(y2[p], y2[1:])
inter = (xx2 - xx1 + 1) * (yy2 - yy1 + 1)
inter = np.maximum(inter, 0)
over = inter / (areas[p] + areas[1:] - inter)
inds = np.where(over
CPP实现
#include
其他变体
文章标题:[目标检测][python][cpp]非极大值抑制(NMS)算法原理以及CPP实现
文章链接:http://soscw.com/index.php/essay/46632.html