R-CNN:
首先模型输入为一张图片,在图片上提出了约2000个待检测区域,然后这2000个待检测区域一个一个地通过卷积神经网络提取特征,然后这些被提取的特征通过SVM进行分类,得到物体的类别,并通过bounding box regression调整目标包围框的大小。
首先在第一步提取2000个待检测区域的时候,采用选择性搜索(selective search),即通过一些传统图像处理方法将图像分成若干块,再通过SVM将属于同一目标的若干块拿出来。
在第二步进行特征提取的时候,采用了AlexNet结构,直接在ImageNet上训练,即使用图像分类数据集训练了一个仅仅用于提取特征的网络。
在第三步进行对目标分类时,使用了一个SVM,在训练这个SVM的时候,结合目标的标签(类别),与包围框的大小进行训练。因此,SVM也是被单独训练的。
R-CNN的贡献:
a.使用了卷积神经网络进行特征提取
b.使用bounding box regression进行目标框的修正
存在的问题:
a.耗时的selective search,对一帧图像,需要花费2s
b.耗时的串行式CNN前向传播,对于每一个RoI,都需要经过一个AlexNet提起特征,为所有的RoI提取特征大约花费47s
c.三个模块是分别训练的,并且在训练的时候,对于存储空间的消耗很大
Fast R-CNN:
首先还是采用selective search提取2000个候选框,然后使用一个神经网络对全图进行特征提取。接着使用一个RoI Pooling Layer在全图特征上提取每一个RoI对应的特征,再通过全连接层进行分类与包围框的修正。
Fast R-CNN的贡献:
a.取代R-CNN的串行特征提取方式,直接采用一个神经网络对全图提取特征
b.除了selective search,其它部分都可以合在一起训练
Faster R-CNN:
首先使用共享的卷积层为全图提取特征,将得到的feature map送入RPN(Region Proposal Network),RPN生成待检测框(指定RoI的位置)并对RoI的包围框进行第一次修正。之后,RoI Pooling Layer根据RPN的输出在feature map上面选择每个RoI对应的特征,并将维度置为定值。最后,使用全连接层对框进行分类,并且进行目标框的第二次修正。
Faster R-CNN的架构(基于ZF模型):
如上图所示,Faster R-CNN的结构主要分为三大部分,第一部分是共享的卷积层-backbone,第二部分是候选区域生成网络-RPN,第三部分是对候选区域进行分类的网络-classifier。其中,RPN与classifier部分均对目标框有修正。
RPN的工作原理:
RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的目标框,即anchor。这9种初始anchor包含三种面积(128×128,256×256,512×512),每种面积又包含三种长宽比(1:1,1:2,2:1),示意图如下:
由于共享特征图的大小约为40×60,RPN生成的初始anchors的总数约为20000个。对于生成的anchors,RPN需要做两件事情:第一,判断anchor属于背景还是前景,即有无覆盖目标。第二,对属于前景的anchor进行第一次坐标修正。对于前一个问题,Faster R-CNN的做法是使用SoftmaxLoss直接训练,在训练的时候排除掉了超越图像边界的anchor。对于后一个问题,采用SmoothL1Loss进行训练。RPN的本质是一个树状结构,树干是一个3×3的卷积层,树枝是两个1×1的卷积层。第一个1×1的卷积层解决了前后景的输出,第二个1×1的卷积层解决了边框修正的输出。
对于RPN输出的特征图中的每一个点,一个1×1的卷积层输出了18个值。另一个1×1的卷积层输出了36个值。RPN网络在训练时,采用如下方法判断一个anchor属于前景还是背景。
方法:如果一个anchor与ground truth的Iou在0.7以上,则这个anchor属于前景。如果一个anchor与ground truth的Iou在0.3以下,则这个anchor属于背景。进行RPN训练时,只采用了上述两类anchor,介于上述两者之间的anchor没有使用。在训练anchor属于前景与背景时,是在一张图中,随机抽取了128个前景anchor与128个背景anchor。
anchor边框修正的训练方法:边框修正主要由4个值完成,tx、ty、th、tw,采用SmoothL1Loss进行训练,具体可以描述为:
并非对所有的anchor都进行包围框修正的参数训练,只对positive的anchors进行训练。因此,在训练RPN的时,只对128个随机抽取的positive anchors进行训练。因此,训练RPN的损失函数可以写成:
这里的Lreg即上述的Lloc,λ被设置为10,Ncls为256,Nreg为2400,RPN的两个部分loss值可以保持平衡。
RoI Pooling的作用:第一,为每个RoI选取对应的特征。第二,为了满足全连接层的输入需求,将每个RoI对应的特征的维度转化成某个定值。
在RoI Pooling Layer之后,就是Fast R-CNN的分类器和RoI边框修正训练。分类器主要是分这个提取的RoI具体是什么类别,一共C+1类。RoI边框修正和RPN中的anchor边框修正原理一样,也是SmoothL1 Loss。RoI边框修正是对非背景的RoI进行修正,对于类别标签为背景的RoI,则不进行RoI边框修正的参数训练。对于分类器和RoI边框修正的训练,可描述为:
上式中u>=1表示RoI边框修正是对于非背景的RoI而言的,实验中,取λ为1
在训练分类器和RoI边框修正时,步骤如下:
a.首先通过RPN生成约20000个anchors
b.对20000个anchors进行第一次边框修正,得到修正边框后的Proposals
c.对超过图像边界的proposals的边进行clip,使得该porposal不超过图像范围
d.忽略掉长或宽太小的proposal
e.将所有的proposals按照前景分数从高到低排序,选取前120000个proposals
f.使用阈值为0.7的NMS算法排除掉重叠的proposals
g.针对上一步剩下的proposals,选取前2000个proposals进行分类和第二次边框修正
Faster R-CNN的训练方式:交替训练
a.使用在ImageNet上预训练的模型初始化共享卷积层并训练RPN
b.使用上一步得到的RPN参数生成RoI proposals,再使用ImageNet上预训练的模型初始化共享卷积层,训练Fast R-CNN部分
c.将训练后的共享卷积层参数固定,同时将Fast R-CNN的参数固定,训练RPN
d.同样将共享卷积层参数固定,并将RPN的参数固定,训练Fast R-CNN部分
Faster R-CNN的测试流程:
a.首先通过RPN生成约20000个anchors
b.对20000个anchors进行第一次边框修正,得到修订边框后的proposals
c.对超过图像边界的proposals的边进行clip,使得该proposals不超过图像范围
d.忽略掉长或宽太小的proposals
e.将所有proposals按照前景分数从高到低排序,选取前6000个proposals
f.选取前300个proposals进行分类和第二次边框修正。
RoI Pooling存在的问题:
问题1:从输入图上的RoI到特征图上的RoI feature,RoI Pooling是直接通过四舍五入取整得到的结果,导致的结果就是RoI Pooling过后得到的输出可能和原图像上的RoI对不上
问题2:再将每个RoI对应的特征转化为固定大小的维度时,又采用了取整操作。
这种取整操作对RoI分类影响不大,对逐像素的预测目标是有害的,因为对每个RoI取得的特征并没有与RoI对齐。
因此,Mask R-CNN对RoI Pooling做了改进并提出了RoI Align
RoI Align创新点:
a.针对问题1,不再进行取整操作
b.针对问题2,使用双线性插值来更精确地找到每个块对应的特征。
总的来说,RoI Align的作用主要是剔除了RoI Pooling的取整操作,使得为每个RoI取得的特征能够更好地对齐原图上的RoI区域
Mask R-CNN:
在Mask R-CNN中的RoI Align之后有一个"head"部分,主要作用是将RoI Align的输出维度扩大,在预测Mask时会更加精确。
在Mask Branch的训练环节,没有采用FCN式的SoftmaxLoss,而是输出了K个Mask预测图(为每一个类输出一张),并采用average binary cross-entropy loss训练。
Mask R-CNN的训练损失函数可以描述为:
参考链接:https://blog.csdn.net/jiongnima/article/details/79094159