非极大值抑制

用于滑动窗口后处理:

优先选择得分高的候选位置,排除与已选窗口重叠的窗口

求两个矩形框相交:

分别求最大左上角点和最小右下角点,后者大于前者,两点确定的矩形框即为相交部分。

function top = nms_face(boxes,overlap)
% Non-maximum suppression.
% Greedily select high-scoring detections and skip detections
% that are significantly covered by a previously selected detection.

if nargin < 2
    overlap = 0.5;
end

N = length(boxes);

if isempty(boxes)
    top = [];
else
    numpart = size(boxes(1).xy,1);
    
    % throw away boxes with low score if there are too many candidates
    if N > 30000
        s = [boxes.s];
        [vals, I] = sort(s);
        boxes = boxes(I(end-29999:end));
    end
    N = min(30000,N);
    
    x1 = zeros(N,1);
    y1 = zeros(N,1);
    x2 = zeros(N,1);
    y2 = zeros(N,1);
    area = zeros(N,1);
    for nb = 1:N
        if numpart==1
            x1(nb) = boxes(nb).xy(1);
            y1(nb) = boxes(nb).xy(2);
            x2(nb) = boxes(nb).xy(3);
            y2(nb) = boxes(nb).xy(4);
        else
            x1(nb) = min(boxes(nb).xy(:,1));
            y1(nb) = min(boxes(nb).xy(:,2));
            x2(nb) = max(boxes(nb).xy(:,3));
            y2(nb) = max(boxes(nb).xy(:,4));
        end
        area(nb) = (x2(nb)-x1(nb)+1) * (y2(nb)-y1(nb)+1);
    end
    
    s = [boxes.s];
    [vals, I] = sort(s);
    pick = [];
    while ~isempty(I)
        last = length(I);
        i = I(last);
        pick = [pick; i];
        suppress = [last];
      
        j = I(1:last-1);
        xx1 = max(x1(i), x1(j));
        yy1 = max(y1(i), y1(j));
        xx2 = min(x2(i), x2(j));
        yy2 = min(y2(i), y2(j));
        
        w = xx2-xx1+1;
        w(w<0) = 0;
        h = yy2-yy1+1;
        h(h<0) = 0;
        
        inter = w.*h;
        o1 = inter ./ area(j);
        o2 = inter / area(i);
        idx =  (find((o1 > overlap) | (o2 > overlap)));
        suppress = [suppress ; idx];
        
        I(suppress) = [];
    end
    top = boxes(pick);
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值