网站建设销售是做什么的,华为软件开发工程师月薪多少,网站怎么做营销,哈尔滨网站设计快速建站非极大值抑制#xff08;Non-maximum suppression#xff0c;NMS#xff09;是一种去除非极大值的算法#xff0c;常用于计算机视觉中的边缘检测、物体识别等。
算法流程
给出一张图片和上面许多物体检测的候选框#xff08;即每个框可能都代表某种物体#xff09;Non-maximum suppressionNMS是一种去除非极大值的算法常用于计算机视觉中的边缘检测、物体识别等。
算法流程
给出一张图片和上面许多物体检测的候选框即每个框可能都代表某种物体但是这些框很可能有互相重叠的部分我们要做的就是只保留最优的框。假设有N个框每个框被分类器计算得到的分数为Si,(1iN)S_i, (1iN)Si,(1iN)。 建造一个存放待处理候选框的集合H初始化为包含全部N个框;建造一个存放最优框的集合M初始化为空集。 将所有集合 H 中的框进行排序选出分数最高的框 m从集合 H 移到集合 M 遍历集合 H 中的框分别与框 m 计算交并比Interection-over-unionIoU如果高于某个阈值一般为0~0.5则认为此框与 m 重叠将此框从集合 H 中去除。 回到第1步进行迭代直到集合 H 为空。集合 M 中的框为我们所需。
需要优化的参数
IoU 的阈值是一个可优化的参数一般范围为0~0.5可以使用交叉验证来选择最优的参数。
示例
比如人脸识别的一个例子 已经识别出了 5 个候选框但是我们只需要最后保留两个人脸。
首先选出分数最大的框0.98然后遍历剩余框计算 IoU会发现露丝脸上的两个绿框都和 0.98 的框重叠率很大都要去除。
然后只剩下杰克脸上两个框选出最大框0.81然后遍历剩余框只剩下0.67这一个了发现0.67这个框与 0.81 的 IoU 也很大去除。 至此所有框处理完毕。 再比如定位一个车辆最后算法就找出了一堆的方框我们需要判别哪些矩形框是没用的。非极大值抑制先假设有6个矩形框根据分类器类别分类概率做排序从小到大分别属于车辆的概率分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值那么就扔掉B、D并标记第一个矩形框F是我们保留下来的。
(3)从剩下的矩形框A、C、E中选择概率最大的E然后判断E与A、C的重叠度重叠度大于一定的阈值那么就扔掉并标记E是我们保留下来的第二个矩形框。
就这样一直重复找到所有被保留下来的矩形框A、E。
代码
import numpy as npdef py_cpu_nms(dets, thresh):# 单独获取各个参数以下参数shape (5,)x1 dets[:,0]y1 dets[:,1]x2 dets[:,2]y2 dets[:,3]scores dets[:,4]areas (y2-y11) * (x2-x11)print(areas.shape: {}.format(areas.shape))print(areas: {}.format(areas))keep []# 得分按照由高到低排序的索引, index.shape (6,)index scores.argsort()[::-1]print(index.shape: {}.format(index.shape))print(index: {}.format(index))while index.size 0:# i为得分最高的索引i index[0] # 将得分最高的索引追加到列表中keep.append(i)# 计算两个box左上角点坐标的最大值x11、y11和右下角坐标的最小值x22、y22# x11、y11、x22、y22 shape (5,)x11 np.maximum(x1[i], x1[index[1:]])y11 np.maximum(y1[i], y1[index[1:]])x22 np.minimum(x2[i], x2[index[1:]])y22 np.minimum(y2[i], y2[index[1:]])print(index[1:]: {}.format(index[1:]))print(x1[index[1:]]: {}.format(x1[index[1:]]))print(x11: {}.format(x11))print(x11.shape: {}.format(x11.shape))# 当两个方框相交时22-11最后得到w,h是正值# 当两个方框不相交的时候22-11最后得到w,h是负值则设置为0# w、h shape (5,)w np.maximum(0, x22-x111)h np.maximum(0, y22-y111)print(w: {}.format(w))print(w.shape: {}.format(w.shape))# 计算交集面积# overlaps.shape (5,)overlaps w * hprint(overlaps: {}.format(overlaps))print(overlaps.shape: {}.format(overlaps.shape))# 计算交并比# ious.shape (5,)ious overlaps / (areas[i] areas[index[1:]] - overlaps)print(ious.shape: {}.format(ious.shape))print(ious: {}.format(ious))# 得到满足阈值条件的ious中的索引(ious相比index缺少第一个最大值)ious_idx np.where(iousthresh)[0]print(iousthres idx: {}.format(ious_idx))# ious_idx1得到在index中的索引index index[ious_idx 1] # because index start from 1print(index: {}.format(index))return keepif __name__ __main__:boxesnp.array([[100,100,210,210,0.72], # 0[250,250,420,420,0.8], # 1[220,220,320,330,0.92], # 2[100,100,210,210,0.72], # 3[230,240,325,330,0.81], # 4[220,230,315,340,0.9]]) # 5keep py_cpu_nms(boxes, thresh0.7)print(keep: {}.format(keep))