分享

目标检测合集 | 4 Faster R-CNN解析

 taotao_2016 2019-08-18
Faster R-CNN,由Shaoqing Ren,Kaiming He,Ross Girshick等2015.06年提出,将候选框选择、特征提取、分类、检测框回归都整合在了一个网络中,通过对图像生成候选区域,提取特征,判别特征类别并修正候选框位置。完全端到端,使得精度和速度大幅提升。Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks,Ren源码(官方Matlab),RBG源码(pyCaffe)

核心思想:
  • Faster R-CNN = RPN + Fast R-CNN
  • RPN:是一个全卷积网络,它的输入为特征图,输出为候选框ROI。完成了区域推荐,将Proposal的提取部分嵌入到内部网络,候选区域生成网络与检测网络共享卷积层参数,因此计算开销非常小。代替了selective search算法。
    • Anchor机制:为feature map中的每个特征点在对应的原图上手动选取9个不同大小和宽高比的anchor,通过滑动窗口将9个anchor卷积成一个特征向量,再输出给前后景分类层和检测框回归层。
    • NMS:消除大量重叠的框。除此了NMS还有其他判断方法去除冗余的候选框。
  • RPN损失函数:分类的Softmax Loss,回归的Smooth L1 loss。
  • Fast R-CNN:用RPN讯选出来的候选框做多类别分类,和进一步的检测框回归。
  • 整体训练方式:交替训练或端到端训练。训练的目的是调整 RPN 和检测网络中的权值,并对主干网络的权值进行微调。
  • 端到端的检测,与Fast R-CNN的组件相似,但组织形式框架更加完整的了。后序研究都是对框架中的各个组件的优化了,如替换更好的主干网络、ROI Pooling等。
  • VOC2007 78.8%,VOC2012 75.9%。VGG版200ms(K40 GPU,包含所有步骤)。
网络结构:
一个整的网络模型:整张图片->共享卷积网络层->RPN网络层->Fast R-CNN分类和定位loss层。
  1. 主干网络:可用VGG和ZF,提取图像的feature map,feature map被后续RPN层和全连接层共享。13con+13relu+4pooling,图像下采样了2^4=16倍
  2. RPN网络(Region Proposal Network):用于生成候选区域(proposals)。该层通过一组固定的尺寸和比例得到一组锚点(anchors),通过softmax判断锚点属于前景或者背景,这就初步完成了目标检测,再利用边界框回归修正前景anchor逼近真值框。3x3+背景前景分类+初步定位
  3. ROI Pooling层:该层收集输入的feature map和候选区域,将候选区域映射到feature map中并划分网格池化为统一大小的区域特征图,将送入下面的全连接层判定目标类别。同fast rcnn一样
  4. Fast R-CNN检测网络:分类+位置精确定位。利用区域特征图计算候选区域的类别,同时再次通过区域回归获得检测框最终的精确位置。
RPN网络
  • 目的:是找到region proposal,是一种全连接网络,它的输入为最后一个共享卷积层的feature map,输出为一系列的候选框。
  • 优点:RPN可以高效和准确的生成region proposal,与其后的检测网络共享卷积特征参数,使得区域推荐几乎是不花时间的;学到的RPN也改善了区域推荐的质量,进而改善整个目标检测的准确性。它代替了传统的分割+分层的选择性搜索的方法。
  • 网络步骤:
    • 输入最后一个共享卷积层的feature map(conv5_3)
    • 在feature map上滑动小网络(3x3)时,每个滑动窗口位置(小网络,对应feature map的每个点)都在原图上对应了以它的中心为中心的k个anchor box(也称anchor)。这9个anchor box有3种尺度和3种长宽比,都是手工设计的初始检测框,尚不准确,后面还有2次边界框回归器可以修正检测框位置。图3(左)以这个小网络在某个位置的例子
      • 也就是feature map上的每一个特征点都可以在原始图像中相对应的点上生成指定尺寸的9个anchor box,则对于大小为W*H(典型值约2,400)的feature map,总共有W*H*k个anchor。
      • 一个特征点的9个anchor同时与真值框在原图上比较,生成9个评分,评分好的就是预测出来的好推荐框,训练学习的就是学习靠近好的情况下的权重,以便可以针对某种对象直接给出大概的框。这9个anchor是使用缩放位置记住的,对应到原图比较,不需要每个anchor都看成一个区域feature map,只看一个中心点的特征。
      • 以3*3滑窗中心对应原图的位置作为中心点,在原图生成9个不同尺度长宽比的anchor,然后每个anchor都会被分配到相应的类标签和正样本的回归标签,用标签就可以训练RPN网络了。参考
    • 每个feature map的特征点经过3*3的滑动窗,生成一个特征向量(全连接层,ZF是1*1*256-d,VGG是1*1*512-d)。这个卷积可当作普通权重。每个滑动窗口位置对应有9个anchor,9个anchor对应一个向量。
      • 3*3的滑窗怎么能有这么多的输出?既有2*k分类值的分数还有4*k个回归值?:3*3对应的原图感受野区域有228个像素(ZF是171像素),输出有512个通道,512个3*3这些值足够还原并表现出原图该区域中的所有特征。由于RPN中小网络的卷积核是3*3*512,就是全连接,全连接的权重有3*3*512*512个,只要其中某些权重值设置得当,那么就可以输出原图该区域的所有特征,包括各种检测类的位置,分类分数等。
      • 注意,由于小网络是滑动窗口的形式,所以全连接层被所有空间位置共享,该体系结构很自然地使用n*n卷积层实现,这类似滑动窗口的卷积实现。在feature map上滑动小网络,这个小网络以子图像作为输入,每个子图像代表了原始图像中该点为中心的一个矩形区域(anchor box)。不管滑动多少次,多少anchor box,feature map都做了一次整的卷积,只需要在后面层找到相对应的位置即可,共享了计算步骤。每个小网络也就是每个特征点的感受野经过主干网络的映射(可根据池化缩放得到)。
      • 滑动窗的处理方式保证reg-layer和cls-layer关联了conv5_3的全部特征空间。
    • 然后将这个特征向量输出给两个同级的全连接层:检测框回归层(reg)和检测框前后景分类层(cls),就可以预测出类别和候选框位置了。每个特征点的特征向量都会生成一个1*1*2k和1*1*4k的向量,代表了一个特征点在原图对应的k个anchor,每个点的预测结果和这9个anchor box关联起来了,这个点上的对象是哪个anchor。这里就生成的最终的region proposal(可能还会去掉超出边界的、NMS等),它就可以输入到检测网络中了。
      • 用二分类的Softmax层实现的cls层,每个点有2k个输出,判断anchor是foreground还是background,也就相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中)。也可以用Logistic回归来生成k个得分。
      • reg层预测的前景anchor坐标,每个点有4k个输出,要用来与真值坐标比较,看它如何变换微调才能更接近真值坐标框,要训练学习的就是这种变换关系。这就是边界框回归。可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调,线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近,即Y=WX。(注意只有当前景anchors和真值框比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了)参考
    • 训练时再用分别接两个损失函数,反向传播更新。分类损失用的是交叉熵损失,而计算回归损失用的是Smooth_l1_loss,在计算回归损失的时候,只计算前景的损失。(训练学习的权重主要是第3步中n*n的滑动卷积核)
  • 前景背景分类+框位置的回归:
    • 粗分类:判定提取出来的候选框属于背景还是前景,后序网络还会判断候选框所属的具体类别
    • 粗定位:粗略回归框的位置,后序网络还会再一次对候选框精确回归


Anchor

  • Anchor(锚)机制:对feature map上的每一个特征点都会在原图上生成k个不同指定尺度的anchor,它们中心点相同,这样在整个feature map上一共有w*h*k个anchor框。anchor(anchor box)实际就是4个坐标值,代表框的左上角坐标和右下角坐标。
  • 优点:平移不变性、多尺度
  • 一般要将不完全在图像内部(初始化的anchor的4个坐标点超出图像边界)的anchor都过滤掉,一般剩下了原来1/3左右的anchor。如果不将这部分anchor过滤,则会使训练过程难以收敛。
  • 手工选取每个Anchor的尺度:
    • 每个中心点都会有3*3=9个尺度的anchor,因w*h大小的feature map上每一个点都是anchor,所以总候选框有9*w*h个。
    • 选择三个面积尺寸:128*128, 256*256, 512*512
    • 在每个尺寸下分别取三种不同的长宽比:1:1, 1:2, 2:1
    • anchors size其实是根据检测图像设置的,在python demo中,会把任意大小的输入图像reshape成800x600(即图2中的M=800,N=600),再遍历Conv layers的feature maps,为每一个点都配备9种anchors作为初始的检测框。
  • yolo也引入的类似的anchor,吴恩达说是为了在一个yolo网格中检测多个对象,各个对象的anchor box形状是不一样的,根据anchor box和对象真实形状的IOU来判定此框属于哪个类.
  • 相比较,MultiBox方法用k-means在每个中心点生成了800个anchor,但不具有平移不变性,而且它的卷积输出层和特征提取层的参数比本文方法要多很多,这样本文方法在PASCAL VOC这种小数据集上出现过拟合的风险较小。
    • 本文的最后卷积输出层参数是512 × (4 + 2) × 9(用VGG),而MultiBox的是1536 × (4 + 1) × 800(用GoogleNet)
    • 本文的特征提取层(就是n*n那些卷积核+卷积输出层)的参数为
MultiBox的特征提取层的参数为
Proposal的最后生成
预测时Proposal的生成就是将图像输入到RPN网络中进行一次前向(forward)计算,处理流程如下:
  1. 计算特征图conv5-3映射到输入图像的所有anchors,并通过RPN网络前向计算得到anchors的score输出和bbox回归参数。已经做完了RPN
  2. 由anchors坐标和bbox回归参数计算得到预测框proposal的坐标
  3. 处理proposal坐标超出图像边界的情况(使得坐标最小值为0,最大值为宽或高)
  4. 滤除掉尺寸(宽高)小于给定阈值的proposal
  5. 对剩下的proposal按照目标得分从大到小排序,提取前pre_nms_topN(e.g. 6000)个proposal
  6. 对提取的proposal进行非极大值抑制,再根据nms后的foreground score,筛选前post_nms_topN(e.g. 300)个proposal作为最后的输出
RPN的损失函数
  • Anchor正/负样本:为了训练RPN,我们给每个anchor分配一个二值的标签(是不是目标)。再给这两类anchor分配正样本:(i)与检测框真值IoU最高的anchor,(ii)与任意检测框真值有大于0.7的IoU交叠的anchor。注意到一个检测框真值可能分配正标签给多个anchor。
    • 通常第二个条件足以确定正样本。但是我们仍然采取第一个条件,因为在极少数情况下,第二个条件可能没有发现正样本。我们分配负样本给与所有检测框真值的IoU比率都低于0.3的anchor。
  • 有了这些定义,我们遵循Fast R-CNN中的多任务损失,最小化目标函数。损失函数定义为:

参数:i 是一个mini-batch中anchor的索引,pi 是预测anchor_i为对象的概率,pi*是检测框真值标签,如果anchor为正标签它就是1;ti 是一个向量,表示预测框的4个坐标,ti* 是正标签anchor对应的检测框真值的坐标向量。分类损失L_cls是两个类别的log对数损失。回归损失L_reg是

,R是鲁棒的损失函数(Smooth L1 loss)。pi*xL_reg这一项意味着只有正标签anchor( )才有回归损失。cls层和reg层的输出分别由{pi}和{ti}组成。这两项由N_cls和N_reg归一化,并由一个平衡参数 λ 加权。cls项的归一化值为mini-batch的大小(即N_cls=256),reg项的归一化值为anchor位置的数量(约为2,400),默认情况下 λ=10。
  • 回归中采用如下4个参数:
参数:x,y,w,h 指的是包围盒中心的坐标、宽、高。变量x,x_a,x*分别指预测的检测框、anchor box、检测框真值,其他也类似。可以理解为从前景anchor box到附近检测框真值的边界框回归。回归网络分支的输出就是每个Anchor的偏移量和变换尺度,显然即可用来修正Anchor位置了。偏移是全局性的,但RPN是一次预测一个区域,不影响。
我们用了一种与之前基于RoI方法的不同方法实现了检测框回归算法。在SPP和Fast RCNN中,检测框回归是通过从任意大小的ROI区域中池化特征实现的,回归权重被所有大小区域共享。而本文方法中,用于回归的特征在特征映射中具有相同的空间尺寸(3x3)。为了适应不同的尺寸,我们学习了一组k个检测框回归量,每一个回归量对应于一个尺度和长宽比,这k个回归量之间不共享权重。由于anchor的设计,即使特征的大小/比例是固定的,仍然可以预测各种大小的检测框。

选择候选框并输入网络的方法比较
  • R-CNN(选择性搜索):用图像分割的方法找到可能存在对象的色块,然后根据相似度不断合并相邻区域构成更多不同尺度的新候选框,最后选择出2000个候选框;
    • 将这2000个候选框做crop/warp后分别输入到各自的卷积网络,逐一对每个候选区域分类,会有大量卷积层重复计算。这和普通的滑动窗口检测差不多,也是要把切分后的框输入到网络。
  • Fast R-CNN(选择性搜索+滑动窗口的卷积实现):先用R-CNN的选择性搜索找出2000个候选框;而输入网络时,是将整幅图片输入到卷积网络,对于2000个候选框是怎么对应到各自的输出的,用的就是滑动窗口的卷积实现的思想,每一个框都会对应卷积层输出的一部分(这部分就像是映射),而在最后的全连接层中每个候选框都会生成一个1x1的高维向量。这里并没有真正的滑动窗口,只是把2000个候选框当做滑动出来的窗口理解了。
    • 滑动窗口的卷积实现只对整幅图做了一次卷积网络,共享了很多卷积计算;而如果没有预先的选择性搜索,直接在原图上逐步滑动,在没有对象的区域会浪费时间。
    • 如下图是滑动窗口的卷积实现,假设输入给卷积网络的图片大小是14×14×3,测试图片是16×16×3,相当于在测试图片上做了4次14x14大小的滑动,全连接层就成了2x2的了,而不是1x1,代表着4个滑动窗的各类得分。共享了很多计算是因为各卷积层的滑动窗使用了相同的卷积核。滑动窗在网络里面的就算是个标记,不管有多少滑动窗,整幅图像只经过一次卷积网络,一次得到所有预测值,最后在输出层找到各个滑动窗相对应的那个神经单元即可。
  • Faster R-CNN(RPN:anchor):对主干网络的最后一层feture map上的每一个特征点,都在相对应的原图上生成了9个anchor,然后每个特征点都有2k+4k的预测向量,代表了每个特征点涵盖的9个anchor与真值框的对比情况,或者直接预测值,这个向量就可以做分类和回归损失的训练了。也是将整幅图片输入到主干卷积网络。
4-2 三种训练方法
如何实现RPN前面的卷积层和检测网络的卷积层参数的共享?对于提取proposals的RPN,以及分类回归的Fast R-CNN,如何将这两个网络嵌入到同一个网络结构中,训练一个共享卷积层参数的多任务网络模型。源码中有实现交替训练(Alternating training)和端到端训练(end-to-end)两种方式,两种方法训练出来的网络准确度基本没有多大的区别,但是使用 end2end 训练可以节省很多时间和显存。两种方法的网络结构图其实是一样的,只是交替训练拆分3个单独的子结构,理解起来都一样。

交替训练
  • 用ImageNet的预训练模型M0训练RPN网络,得到模型M1,生成Proposal P1
  • 使用上一步RPN生成的区域建议Proposal,训练Fast R-CNN网络,同样用ImageNet模型初始化,训练得到模型M2。在这两个网络还没有共享卷积层。
  • 使用模型M2参数初始化RPN训练,但固定共享卷积层仅微调RPN特有的层,固定卷积层参数。即把RPN、Fast R-CNN共享的那些卷积层的学习率设置为0,只微调更新RPN网络独有的层,训练得到模型M3,生成Proposal P2。此时两个网络已经共享了所有公共的卷积层。
  • 训练Fast R-CNN网络,用RPN网络模型M3初始化,保持共享卷积层参数和RPN参数不变,只微调Fast R-CNN特有的层,得到最终模型M4。
由训练流程可知,第4步训练RPN网络和第6步训练Fast R-CNN网络实现了卷积层参数共享。总体上看,训练过程只循环了2次,但每一步训练(M1,M2,M3,M4)都迭代了多次(e.g. 80k,60k)。
端到端训练(近似联合训练)
end2end的训练一气呵成,对于前向传播,rpn可以作为预设的网络提供proposal;而在后向传播中rpn与fast rcnn分别传导,而汇聚到shared layer。RPN和Fast R-CNN网络在训练期间被合并到一个网络中,训练它:
  • 在每个SGD迭代中,前向传递产生推荐区域,在训练时被视为固定的,训练Fast R-CNN检测器前要预先计算proposal。
  • 反向传播像往常一样发生,其中对于共享层,反向传播信号为来自RPN的损失和Fast R-CNN的损失的组合。这个解决方案很容易实现。但是这个解决方案忽略了衍生的w.r.t.推荐框的坐标也是网络响应,所以是近似。在我们的实验中,我们发现这个解决方案产生了相近的结果,与交替训练相比,训练时间减少了约25-50%。
  • SGD训练与像往常一样
  • 即使proposal的分布发生了变化,这也能奏效
非近似联合训练
如上所述,由RPN预测的检测框也是输入的函数。Fast R-CNN中的RoI pooling接受卷积特征以及预测的检测框作为输入,因此理论上有效的反向传播求解器也应该包含梯度w.r.t.框坐标。而这些梯度在上述近似联合训练中被忽略。在非近似联合培训解决方案中,我们需要一个可区分w.r.t.框坐标的RoI池化层。这是一个非常重要的问题,解决方案可以参考[15]中开发的“RoI warping”层给出,这超出了本文的范围。
但是端到端训练没有考虑RoI pooling层对于predicted bounding box的导数。对于faster rcnn来说,RoI pooling层显然依赖于图像本身和roi区域,而roi是通过rpn产生的,rpn不定,所以roi的生成依赖于图像,不可导。由于最大池化的作用,所以没有办法对roi的四个位置求导。对于fast rcnn来讲,roi是固定的,可导。所以我们忽略掉对于roi的导数,运行SGD的“surrogate”梯度。这还能工作,是因为RPN网络接受直接监督,错误传播RoI pooling可能会有所帮助,但并不是严格必需的。当然了如果改变max pooling的方式,比如如下所说采取双线性插值,这样输出既有roi的坐标也有图像像素值,则可以关于roi求导。

4-3 Caffe训练结构解读
这里分析了端到端的train.prototxt源码结构,还用到了交替训练的3个子结构图辅助理解,都一样。
端到端的整体训练网络结构图:
1、input-data - 输入原图数据
输入图像数据、类别和边界框真值、图像的宽高和缩放比例。
name: 'VGG_ILSVRC_16_layers'layer {  name: 'input-data'  type: 'Python'  top: 'data' # 单张图像数据im_blob=[1,3,H,W]  top: 'im_info' # 图像的宽高和缩放比例  top: 'gt_boxes' # 一幅图像中所有ground truth的坐标和类别[x1,y1,x2,y2,cls]  python_param {    module: 'roi_data_layer.layer'    layer: 'RoIDataLayer'    param_str: ''num_classes': 21'  }}

2、主干网络
conv5_3:输出512维的feature map,尺度是(w/16,h/16)。layer { name: 'conv5_3' type: 'Convolution' bottom: 'conv5_2' top: 'conv5_3' param { lr_mult: 1 } param { lr_mult: 2 } convolution_param { num_output: 512 pad: 1 kernel_size: 3 }}
3、RPN网络
Faster R-CNN采用了一种基于'滑动窗口'的技术生成一组密集的候选区域,然后使用神经网络驱动的RPN根据包含前景对象区域的概率对区域进行排序。而R-CNN使用选择性搜索方法生成区域。
下面这种是交替训练的结构图,其实就是端到端结构图的拆分,一样理解,另外这个图把每个层的所有输出都显出来了,红框中省略的主干网的Conv。
  • rpn_conv/3x33*3卷积,依旧输出512维的feature map,尺度是(w/16,h/16)。
    • 输出的rpn/output已经是在每个特征点取了9个anchor后的。在它之前已经做了滑动窗口,每一个特征点都生成有9个anchor,每个点的anchor的预测值还会在 rpn_loss中与所对应的真值计算损失,以便做训练。
layer { name: 'rpn_conv/3x3' type: 'Convolution' bottom: 'conv5_3' top: 'rpn/output' param { lr_mult: 1.0 } param { lr_mult: 2.0 } convolution_param { num_output: 512 kernel_size: 3 pad: 1 stride: 1 weight_filler { type: 'gaussian' std: 0.01 } bias_filler { type: 'constant' value: 0 } }}
  • rpn_cls_score:预测类别概率,用18个1*1*512卷积核做卷积,输出与上一层同尺度(w/16,h/16)的18维feature map,就是说尺度(w/16,h/16)上每一个特征点有一个18维向量,18维向量的参数存着9个anchor属于前景和背景的2个概率值。用了18个卷积核是因为每个卷积核在一个特征点都要学习一种anchor的前景(或背景)。
layer { name: 'rpn_cls_score' type: 'Convolution' bottom: 'rpn/output' top: 'rpn_cls_score' param { lr_mult: 1.0 } param { lr_mult: 2.0 } convolution_param { num_output: 18 # 2(bg/fg) * 9(anchors) kernel_size: 1 pad: 0 stride: 1 weight_filler { type: 'gaussian' std: 0.01 } bias_filler { type: 'constant' value: 0 } }}
  • rpn_bbox_pred:预测边界框,输出36维的feature map,因为有9个anchor,每个有4个边界框参数。
layer { name: 'rpn_bbox_pred' type: 'Convolution' bottom: 'rpn/output' top: 'rpn_bbox_pred' param { lr_mult: 1.0 } param { lr_mult: 2.0 } convolution_param { num_output: 36 # 4 * 9(anchors) kernel_size: 1 pad: 0 stride: 1 weight_filler { type: 'gaussian' std: 0.01 } bias_filler { type: 'constant' value: 0 } }}
  • rpn-data:input-data(RoIDataLayer)的下一层是rpn-data(AnchorTargetLayer),rpn-data计算所有anchors与ground truth的重叠比例IoU,从中筛选出一定数量(256)的正负样本组成一个minibatch,用于RPN网络的训练。目标是产生一组好的Anchor及相应的前景/背景标记和目标回归系数,以训练RPN。
layer { name: 'rpn-data' type: 'Python' bottom: 'rpn_cls_score' bottom: 'gt_boxes' bottom: 'im_info' bottom: 'data' top: 'rpn_labels' # 每个anchor对应的类别(1——fg,0——bg,-1——ignored),shape=[1,1,A*height,width] top: 'rpn_bbox_targets' # anchor与ground truth的回归参数[dx,dy,dw,dh],shape=[1,A*4,height,width] top: 'rpn_bbox_inside_weights' # 回归损失函数中的样本权值,正样本为1,负样本为0,相当于损失函数中的p*,shape=[1,A*4,height,width] top: 'rpn_bbox_outside_weights' # 分类损失函数和回归损失函数的平衡权重,相当于λ,shape=[1,A*4,height,width] python_param { module: 'rpn.anchor_target_layer' layer: 'AnchorTargetLayer' param_str: ''feat_stride': 16' }}
  • rpn_loss_cls:分类损失,输入rpn_cls_scors_reshape和rpn_labels
layer { name: 'rpn_loss_cls' type: 'SoftmaxWithLoss' bottom: 'rpn_cls_score_reshape' # rpn_cls_score的变形 bottom: 'rpn_labels' propagate_down: 1 propagate_down: 0 top: 'rpn_cls_loss' loss_weight: 1 loss_param { ignore_label: -1 normalize: true }}
  • rpn_loss_bbox:回归损失,输入rpn_bbox_pred、rpn_bbox_targets、pn_bbox_inside_weigths、rpn_bbox_outside_weights。
layer { name: 'rpn_loss_bbox' type: 'SmoothL1Loss' bottom: 'rpn_bbox_pred' bottom: 'rpn_bbox_targets' bottom: 'rpn_bbox_inside_weights' bottom: 'rpn_bbox_outside_weights' top: 'rpn_loss_bbox' loss_weight: 1 smooth_l1_loss_param { sigma: 3.0 }}

4、生成Proposal
交替训练的结构图
  • proposal:生成推荐区域rpn_rois。在他之前先将分类预测 rpn_cls_score 做rpn_cls_prob和rpn_cls_prob_reshape变形,在生成proposal。利用了锚点成为前景区域的概率,通过应用非最大抑制减少了锚点的数量。
layer { name: 'proposal' type: 'Python' bottom: 'rpn_cls_prob_reshape' # 预测分类得分 bottom: 'rpn_bbox_pred' # 预测边界框 bottom: 'im_info' # 图像的宽高和缩放比例 top: 'rpn_rois'# top: 'rpn_scores' python_param { module: 'rpn.proposal_layer' layer: 'ProposalLayer' param_str: ''feat_stride': 16' }}
  • roi-data,比较RPN的ROI与原图片的真值,选择符合重叠条件的ROIs和类特定的目标回归系数,用于检测网络。
layer { name: 'roi-data' type: 'Python' bottom: 'rpn_rois' bottom: 'gt_boxes' # 一幅图像中所有ground truth的坐标和类别[x1,y1,x2,y2,cls] top: 'rois' # proposals的坐标[batch_inds,x1,y1,x2,y2] top: 'label' # proposals对应的类别(0~20) top: 'bbox_targets' # proposal回归参数的标定值,shape = [128, 4(N+1)] top: 'box_inside_targets'# 回归损失函数中的样本权值,正样本为1,负样本为0,相当于损失函数中的p* top: 'rpn_box_outside_targets':分类损失函数和回归损失函数的平衡权重,相当于λ python_param { module: 'rpn.proposal_target_layer' layer: 'ProposalTargetLayer' param_str: ''num_classes': 21' }}

5、训练Fast R-CNN
这个data就是上面的roi-data。交替训练的结构图
  • roi_pool5:池化采样conv5_3的feature map中对应的proposal区域。这是将proposal坐标映射到conv5_3特征图中,取出proposal对应的特征图区域,再池化为固定大小,输入到后面的卷积网络中。

layer { name: 'roi_pool5' type: 'ROIPooling' bottom: 'conv5_3' bottom: 'rois' top: 'pool5' roi_pooling_param { pooled_w: 7 pooled_h: 7 spatial_scale: 0.0625 # 1/16 }}
  • cls_score:预测分类

  • bbox_pred:预测边界框

  • loss_cls:分类损失

  • loss_bbox:边界框回归损失,损失函数的计算与RPN网络类似。

论文实现结果

  • VGG版推理速度200ms(K40 GPU)。

  • VOC 2007是78.8%,VOC 2012是75.9%。检测器是Fast R-CNN+VGG16,RPN用于Fast R-CNN训练时的提案框是2k,RPN*表示非共享特征版本。

Caffe可视化(端到端结构)
(1)训练模型
https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt

(2)预测模型
https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/test.prototxt

参考:

1、http://www./2018/03/11/object-detection-and-classification-using-r-cnns/#Bibliography

2、http://117.128.6.9/cache/mp7.watson.ibm.com/ICCV2015/slides/iccv15_tutorial_training_rbg.pdf?ich_args2=467-17141622042137_aa6ea5b70baf01e1489b859bfe7e43b6_10001002_9c896124d7c4f2d69e3f518939a83798_9c5eb08ff263a9f04ff63f19ed98b21b

3、https://web.cs./~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf

4、https://zhuanlan.zhihu.com/p/32404424

5、https://zhuanlan.zhihu.com/p/31426458

6、https://senitco./2017/09/02/faster-rcnn/

7、https://blog.csdn.net/xiamentingtao/article/details/78536224

TF版源码: 

https://github.com/smallcorgi/Faster-RCNN_TF



作者 | 知乎:Mengcius
https://zhuanlan.zhihu.com/ObjectDet

版权声明

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多