Object Detection网络框架学习:Chapter1-物体检测概念

在进行R-cnn的介绍之前,先简单的介绍一下物体检测相关的基础知识:

物体检测

在传统视觉领域,物体检测是一个非常热门的研究方向。受70年代落后的技术条件和有限应用场景的影响,物体检测直到上个世纪90年代才开始逐渐走入正轨。物体检测对于人眼来说并不困难,通过对图片中不同颜色、纹理、边缘模块的感知很容易定位出目标物体,但计算机面对的是RGB像素矩阵,很难从图像中直接得到狗和猫这样的抽象概念并定位其位置,再加上物体姿态、光照和复杂背景混杂在一起,使得物体检测更加困难。

检测算法里面通常包含三个部分,第一个是检测窗口的选择, 第二个是特征的设计,第三个是分类器的设计。随着2001年Viola Jones提出基于Adaboost [1]  的人脸检测方法以来,物体检测算法经历了传统的人工设计特征加浅层分类器的框架,到基于大数据和深度神经网络的End-To-End的物体检测框架,物体检测一步步变得愈加成熟。

 

物体检测与图片分类的区别

è¿éåå¾çæè¿°

图片分类:

图片分类的输入为图片,输出为类别标签,评价标准为:准确率(Accuracy)

物体检测:

物体检测不仅需要我们判别出物体的类别,还需要确定物体所在图片的位置。

扫描二维码关注公众号,回复: 9450179 查看本文章

物体检测的输入为:图片,输出为:类别标签和bbox(图像位置信息),评价标准:IoU(Intersection over Union)

mAP(Mean Average Precision

物体检测不仅仅只能检测单个物体,还能同时检测多个物体,也就是我们常说的多物体检测:

物体检测相关知识介绍:Bbox, IoU, 非极大值抑制

1.Bbox(Bounding Box)

由上图我们可以看到,物体在矩形内部,这就是我们得到的Bbox,物体检测中关于物体位置的信息输出是一组(x,y,w,h)(x,y,w,h)数据,其中x,yx,y代表着bbox的左上角(或者其他固定点,可自定义),对应的w,hw,h表示bbox的宽和高.一组(x,y,w,h)(x,y,w,h)可以唯一的确定一个定位框。

2.Iou(Intersection over Union)

对于两个区域RR和R′R′,则两个区域的重叠程度overlap计算如下: 

O(R,R′)=|R∩R′| / |R∪R′|

在训练网络的时候,我们常依据侯选区域和标定区域的IoU值来确定正负样本。

3.非极大值抑制

非极大值抑制在物体检测上的应用: 非极大值抑制就是把不是极大值的抑制掉,在物体检测上,就是对一个目标有多个标定框,使用极大值抑制算法滤掉多余的标定框。
例如:

非极大值抑制前:

è¿éåå¾çæè¿°

非极大值抑制算法后:

è¿éåå¾çæè¿°

非极大值抑制的代码如下(Matlab)

function pickLocate = nms(boxes, overlap)
 
% Non-maximum suppression.
% In object detect algorithm, select high score detections and skip windows
% covered by a previously selected detection.
%
% input - boxes : object detect windows.
%                 xMin yMin xMax yMax score.
%         overlap : suppression threshold.
% output - pickLocate : number of local maximum score.
 
boxes = double(boxes);
 
if isempty(boxes)
    pickLocate = [];
else
    xMin = boxes(:, 1);
    yMin = boxes(:, 2);
    xMax = boxes(:, 3);
    yMax = boxes(:, 4);
     
    s = boxes(:, end);
     
    % area of every detected windows.
    area = (xMax - xMin + 1) .* (yMax - yMin + 1);
     
    % sort detected windows based on the score.
    [vals, I] = sort(s);
     
    pickLocate = [];
    while ~isempty(I)
        last = length(I);
        i = I(last);
         
        pickLocate = [pickLocate; i];
        suppress = [last];
         
        for pos = 1 : last - 1
            j = I(pos); 
             
            % covered area.
            xx1 = max(xMin(i), xMin(j));
            yy1 = max(yMin(i), yMin(j));
            xx2 = min(xMax(i), xMax(j));
            yy2 = min(yMax(i), yMax(j));
             
            w = xx2 - xx1 + 1;
            h = yy2 - yy1 + 1;
             
            if ((w > 0) && (h > 0))
                % compute overlap.
                o = w * h / min(area(i), area(j));
                 
                if (o > overlap)
                    suppress = [suppress; pos];
                end
            end
             
            % 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);
             
            % saving the windows which o less than threshold.
            % I = I(o <= overlap);
        end
        I(suppress) = [];
    end
end
发布了84 篇原创文章 · 获赞 108 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_42013574/article/details/90065143