RCNN流程
- 一张图像生成1K~2K个候选区域,提取图像上的Region Proposal(使用selective search方法)
- 对提取的Region进行Warp裁剪。
- 将Warp后的Region送入CNN中进行特征的提取
- 最后,经过CNN提取的Region产生的特征向量送入SVMs中进行有监督训练
- 使用回归器精细修正候选框位置
图像预处理
Subtrace Mean
在这里应该是去均值的一个过程
ImageNet的均值一般取为[104, 117, 123](四舍五入后的值,BGR的通道顺序了,适用于Caffe),关于自己使用均值的估计,所使用已有网络的预训练模型最好使用这三个值,它具有足够的代表性,让网络不受扰动地提取特征。Rescale
这部分应该是将图片大小确定在targetSize和maxSize之间(targetSize和maxSize参数的默认值分别为600和1000。)
网络组织
R-CNN使用神经网络解决两个主要问题:
- 在输入图像中识别可能包含前景对象的有前途区域(感兴趣区域 - ROI)
- 计算ROI包含特定类的对象的概率。然后,用户可以选择具有最高概率的对象类作为分类结果。
网络的前几层学习检测一般特征,例如边缘和颜色斑点,这些是良好的鉴别特征可以应用在许多不同问题上。从可视化CNN可以看出卷积低层次特征输出一般是边缘、角点、曲线等,可以理解为图像中的结构信息。
后面的层学到的功能是更高级别,更具问题的特性,可以移除这些层,或者可以在反向传播期间微调这些层的权重。随着网络加深,你会发现在高层逐渐显示图像的基本轮廓,这可能来自于神经元之间强大的异或功能。
从预训练网络初始化的前几层构成“头部”网络。然后,由头部网络产生的卷积特征图通过区域提议网络(RPN),其使用一系列卷积和完全连接的层来产生可能包含前景对象的有希望的ROI。然后使用这些有希望的ROI从头网络产生的特征图中裁剪出相应的区域。然后通过产生的区域通过分类网络,该分类网络学习对每个ROI中包含的对象进行分类。
网络架构
头部网络将图像的宽高降低了16倍,得到channel为1024的Feature map,然后进行RPN以及分类网络进行bbox和scale的预测。
anchor对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积三种比例
其他
Region Proposal
目标检测与分类区别在于分类只判别图像中是否存在该物体,检测需要定位物体在图像中的具体位置。
定位物体在图像中的位置一般容易想到的思想是:用不同大小的窗口在图像上进行滑动,滑动窗口在图像上做卷积(相关)操作,通过卷积(或者相关)运算之后,如果当前窗口滑到对应图像中的位置那么其响应值会最大or最小这就是早期的模板匹配。
滑窗法缺点在于:计算量大,设计不同大小的滑窗,穷举搜索。那么换一种思路来进行目标检测,图像中同一目标的纹理、颜色、像素值会存在一定的类似或者相同。所以,可以先对图像进行图像分割技术,分割完的区域在进行类别判断来完成目标检测过程。采用图像分割优势在于计算耗时要比滑窗法低,但是图像分割由于图像中目标与背景之间关系复杂,较难准确的进行分割。近几年图像分割技术进展迅速,Selective Search对于Region Proposal提取较好,该算法主要综合颜色、纹理等信息,区域迭代合并、非极大值抑制等综合取得高效的区域提取。RCNN在Region proposal阶段就是采用Selective Search的思想。
Warp Region(候选框裁剪)
RCNN对输入图像提取出Region Proposal之后,每个Region(区域)在进入卷积神经网络之前要进行Warp裁剪操作。原因很简单: 每个区域大小形状不一,如果直接输入CNN网络不好统一操作(即CNN对图像的输入层具有固定的维度)。比如:卷积操作边界问题、Stride大小设置问题等等。所以,CNN网络统一了卷积核大小、Stride等一系列操作后,对输入图像进行大小的限制。这就是为什么的每个Region提取之后需要进行Warp操作。
线性SVMs分类
SVM判别分类输入向量来自全连接层的输出向量,这里你可以理解成为特征向量在高维空间中进行分类表达。例如:假设1n为向量,映射到n维空间就是一个点(假设为A),另外一个1n向量同样映射到n维空间假设为B点。带有标签的A(狗)、B(猫)维向量通过SVM得到判别。因此,测试图像输出矢量会经过所有训练标签的SVM分类器进行判别出类别信息。
用全连接层输出提高特征表达能力用于分类判别。经过卷积神经网络之后输出的特征向量,进入SVMs进行训练。每一类别都会训练出一个SVM分类,这里是二分类SVM判别。例如:有标签数据含有20中类别,那么将会分别训练出20个SVM来对有标签的数据进行单独判别。
边界框回归系数
R-CNN的目标之一是产生紧密适合对象边界的良好边界框。R-CNN通过采用给定的边界框(由左上角的坐标,宽度和高度定义)并通过应用一组“回归系数”来调整其左上角,宽度和高度来生成这些边界框。
affine transformation 仿射应该就是上述warp。
窗口使用四维向量(x, y, w, h)表示,分别表示窗口的中心点坐标和宽高。
红色的框代表原始的Foreground Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的Original(就是proposal)经过映射得到一个跟真实窗口GT更接近的回归窗口Target,即:给定
(
O
x
,
O
y
,
O
w
,
O
h
)
(O_x,O_y,O_w,O_h)
(Ox,Oy,Ow,Oh),寻找一种映射f,使得
f
(
O
x
,
O
y
,
O
w
,
O
h
)
=
(
T
x
,
T
y
,
T
w
,
T
h
)
f(O_x,O_y,O_w,O_h)=(T_x,T_y, T_w, T_h)
f(Ox,Oy,Ow,Oh)=(Tx,Ty,Tw,Th),其中
(
T
x
,
T
y
,
T
w
,
T
h
)
≈
(
G
x
,
G
y
,
G
w
,
G
h
)
(T_x,T_y, T_w, T_h)≈(G_x, G_y, G_w, G_h)
(Tx,Ty,Tw,Th)≈(Gx,Gy,Gw,Gh)。
只有当Propsal和GroundTruth比较接近时,作为线性问题我们才能将它作为训练样本训练我们的线性回归模型;当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理。个也是G-CNN: an Iterative Grid Based Object Detector多次迭代实现目标准确定位的关键。
这里进行线性回归的输入是proposal和GT,输出是平移变换和尺度变换的参数,进而通过损失函数和优化目标得到最终的Target
参考
http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/
https://blog.csdn.net/elaine_bao/article/details/60469036
https://blog.csdn.net/Small_Munich/article/details/79795338
https://www.cnblogs.com/zf-blog/p/6740736.html
https://www.jianshu.com/p/5056e6143ed5