您的位置:首页 > 其它

非极大值抑制(Non-maximum suppression)在物体检测领域的应用

2015-12-30 16:11 316 查看
转自:http://blog.csdn.net/pb09013037/article/details/45477591

最近在一个项目,需要用到非极大值抑制,找了很长时间没有找到非极大值抑制在物体检测方面的的详细解释,最后只有翻阅相关的代码来理解。


一、Nms主要目的

在物体检测非极大值抑制应用十分广泛,主要目的是为了消除多余的框,找到最佳的物体检测的位置。



如上图中:虽然几个框都检测到了人脸,但是我不需要这么多的框,我需要找到一个最能表达人脸的框。下图汽车检测也是同样的原理。




二、原理

非极大值抑制,顾名思义就是把非极大值过滤掉(抑制)。下面我就R-CNN或者SPP_net中的matlab源码来进行解释。

function picks = nms_multiclass(boxes, overlap)

%%boxes为一个m*n的矩阵,其中m为boundingbox的个数,n的前4列为每个boundingbox的坐标,格式为

%%(x1,y1,x2,y2);第5:n列为每一类的置信度。overlap为设定值,0.3,0.5 .....

x1 = boxes(:,1);%所有boundingbox的x1坐标

y1 = boxes(:,2);%所有boundingbox的y1坐标

x2 = boxes(:,3);%所有boundingbox的x2坐标

y2 = boxes(:,4);%所有boundingbox的y2坐标

area = (x2-x1+1) .* (y2-y1+1); %每个%所有boundingbox的面积

picks = cell(size(boxes, 2)-4, 1);%为每一类预定义一个将要保留的cell

for iS = 5:size(boxes, 2)%每一类单独进行

s = boxes(:,iS);

[~, I] = sort(s);%置信度从低到高排序

pick = s*0;

counter = 1;

while ~isempty(I)

last = length(I);

i = I(last);

pick(counter) = i;%无条件保留每类得分最高的boundingbox

counter = counter + 1;

xx1 = max(x1(i), x1(I(1:last-1)));

yy1 = max(y1(i), y1(I(1:last-1)));

xx2 = min(x2(i), x2(I(1:last-1)));

yy2 = min(y2(i), y2(I(1:last-1)));

w = max(0.0, xx2-xx1+1);

h = max(0.0, yy2-yy1+1);

inter = w.*h;

o = inter ./ (area(i) + area(I(1:last-1)) - inter);%计算得分最高的那个boundingbox和其余的boundingbox的交集面积

I = I(o<=overlap);%保留交集小于一定阈值的boundingbox

end

pick = pick(1:(counter-1));

picks{iS-4} = pick;%保留每一类的boundingbox

end

该函数的作用就是挑选各个类别中置信度最大的,然后通过阈值排除和这个置信度最大的框重叠区域过大的框,不断重复前面步骤,找出图中属于各类的所有框
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: