在进行R-cnn的介绍之前,先简单的介绍一下物体检测相关的基础知识:
物体检测
在传统视觉领域,物体检测是一个非常热门的研究方向。受70年代落后的技术条件和有限应用场景的影响,物体检测直到上个世纪90年代才开始逐渐走入正轨。物体检测对于人眼来说并不困难,通过对图片中不同颜色、纹理、边缘模块的感知很容易定位出目标物体,但计算机面对的是RGB像素矩阵,很难从图像中直接得到狗和猫这样的抽象概念并定位其位置,再加上物体姿态、光照和复杂背景混杂在一起,使得物体检测更加困难。
检测算法里面通常包含三个部分,第一个是检测窗口的选择, 第二个是特征的设计,第三个是分类器的设计。随着2001年Viola Jones提出基于Adaboost [1] 的人脸检测方法以来,物体检测算法经历了传统的人工设计特征加浅层分类器的框架,到基于大数据和深度神经网络的End-To-End的物体检测框架,物体检测一步步变得愈加成熟。
物体检测与图片分类的区别
图片分类:
图片分类的输入为图片,输出为类别标签,评价标准为:准确率(Accuracy)
物体检测:
物体检测不仅需要我们判别出物体的类别,还需要确定物体所在图片的位置。
物体检测的输入为:图片,输出为:类别标签和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