关于最新最全的目标检测论文,可以查看awesome-object-detection
《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》
NIPS 2015
arxiv: http://arxiv.org/abs/1506.01497
gitxiv: http://www.gitxiv.com/posts/8pfpcvefDYn2gSgXk/faster-r-cnn-towards-real-time-object-detection-with-region
slides: http://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf
github(official, Matlab): https://github.com/ShaoqingRen/faster_rcnn
github(Caffe): https://github.com/rbgirshick/py-faster-rcnn
github(MXNet): https://github.com/msracver/Deformable-ConvNets/tree/master/faster_rcnn
github(PyTorch–recommend): https://github.com//jwyang/faster-rcnn.pytorch
github: https://github.com/mitmul/chainer-faster-rcnn
github(Torch): https://github.com/andreaskoepf/faster-rcnn.torch
github(Torch): https://github.com/ruotianluo/Faster-RCNN-Densecap-torch
github(TensorFlow): https://github.com/smallcorgi/Faster-RCNN_TF
github(TensorFlow): https://github.com/CharlesShang/TFFRCNN
github(C++ demo): https://github.com/YihangLou/FasterRCNN-Encapsulation-Cplusplus
github(Keras): https://github.com/yhenon/keras-frcnn
github: https://github.com/Eniac-Xie/faster-rcnn-resnet
github(C++): https://github.com/D-X-Y/caffe-faster-rcnn/tree/dev
推荐阅读
Faster R-CNN: Down the rabbit hole of modern object detection
Faster R-CNN
实例分割模型Mask R-CNN详解:从R-CNN,Fast R-CNN,Faster R-CNN再到Mask R-CNN
Faster RCNN 学习笔记:介绍Achor很详细
图解Faster R-CNN简单流程
从编程实现角度学习Faster R-CNN(附极简实现)
从结构、原理到实现,Faster R-CNN全解析(原创)
深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
Faster R-CNN算法精读
Faster R-CNN 源码解析(Tensorflow版)
faster rcnn源码解析
Faster R-CNN论文翻译——中英文对照
faster-rcnn原理及相应概念解释
Fast R-CNN 仍有缺点,体现在耗时的Selective Search依旧存在,而且并不是真正意义上的端到端的模型。
Selective Search实际上是借鉴了“层次聚类算法”的思想。
有兴趣可以了解一下“层次聚类算法”
Selective Search总体思路是什么?
总体思路:
假设现在图像上有n个预分割的区域(Efficient Graph-Based Image Segmentation),表示为R={R1, R2, …, Rn},
计算每个region与它相邻region(注意是相邻的区域)的相似度,这样会得到一个n*n的相似度矩阵(同一个区域之间和一个区域与不相邻区域之间的相似度可设为NaN),从矩阵中找出最大相似度值对应的两个区域,将这两个区域合二为一,这时候图像上还剩下n-1个区域;
重复上面的过程(只需要计算新的区域与它相邻区域的新相似度,其他的不用重复计算),重复一次,区域的总数目就少1,知道最后所有的区域都合并称为了同一个区域(即此过程进行了n-1次,区域总数目最后变成了1).
R-CNN的流程是什么?
(1) 输入测试图像
(2)利用selective search算法在图像中从上到下提取2000个左右的Region Proposal
(3)将每个Region Proposal缩放(wrap)成227*227 的大小并输入CNN,将CNN的fc7层的输出作为特征
(4)将每个Region Proposal提取的CNN特征输入到SVM进行二分类
(5)对于SVM分好类的Region Proposal且为positive做Bounding box Regression, 用Bounding box回归值矫正原来的建议窗口,生成预测窗口坐标。
R-CNN的缺陷是什么?
(1) 步骤繁琐
训练分为多个阶段:微调网络+训练SVM+训练边框回归器
(2)训练耗内存
占用磁盘空间大,5000张图片产生上百G的特征
(3)训练速度慢
使用GPU,VGG模型处理一张图片需要47
(4)测试速度慢
每个Region Proposal 都需要运行整个CNN前向计算
(5)SVM和回归是事后操作
在SVM和回归过程中CNN特征没有被学习更新过
Fast R-CNN的流程是什么?
(1)输入测试图像
(2)利用selective search算法在图像中从上到下提取2000个左右的Region Proposal
(3)将整张图片输入到CNN中,进行特征提取
(4)将Region Proposal映射到CNN的最后一层卷积feature map 上
(5)通过RoI pooling层使每个Region Proposal 生成固定尺寸的featur map
(6)利用Softmax Loss 和 Smooth L1 Loss 对分类概率和边框回归概率联合训练
Fast R-CNN与R-CNN相比,有什么不同?
(1)最后一层卷积层后加了一个RoI pooling layer
(2)损失函数使用了多任务损失函数(Multi-task Loss),将边框回归直接加入到CNN网络中训练
Fast R-CNN与R-CNN相比,有哪些改进?
(1)训练速度慢
R-CNN在训练时,是在采用SVM分类之前,把通过CNN提取的特征存储在硬盘上.这种方法造成了训练性能低下,因为在硬盘上大量的读写数据会造成训练速度缓慢.
FAST-RCNN在训练时,只需要将一张图像送入网络,每张图像一次性地提取CNN特征和建议区域,训练数据在GPU内存里直接进Loss层,这样候选区域的前几层特征不需要再重复计算且不再需要把大量数据存储在硬盘上.
(2)测试速度慢
R-CNN把一张图像分解成大量的建议框,每个建议框拉伸形成的图像都会单独通过CNN提取特征.实际上这些建议框之间大量重叠,特征值之间完全可以共享,造成了运算能力的浪费.
FAST-RCNN将整张图像归一化后直接送入CNN,在最后的卷积层输出的feature map上,加入建议框信息,使得在此之前的CNN运算得以共享.
(3)训练耗资源大
R-CNN中独立的SVM分类器和回归器需要大量特征作为训练样本,需要大量的硬盘空间.FAST-RCNN把类别判断和位置回归统一用深度网络实现,不再需要额外存储.
softmax公式
计算个分类的概率值
softmax Loss 公式
RPN进行分类时,即寻找最小LOSS值
Faster R-CNN的训练流程是什么?
(1)输入测试图像
(2)将整张图片输入到CNN,进行特征提取
(3)用RPN生成Region Proposal,每张图片生成300个Region Proposal
(4)把Region Proposal 映射到CNN最后一层卷积feature map上
(5)利用RoI pooling层将每个Region of Interest 生成固定尺寸的feature map
(6)利用 Softmax Loss 和 Smooth L1 Loss 对分类概率和边框回归联合训练
Faster R-CNN与Fast R-CNN相比,有什么不同?
(1)使用RPN(Region Proposal Network)代替原来的Selective Search方法产生建议窗口;
(2)产生建议窗口的CNN和目标检测的CNN共享
Faster R-CNN较于Fast R-CNN改进在哪里?
(1) 如何高效快速产生建议框?
FASTER-RCNN创造性地采用卷积网络自行产生建议框,并且和目标检测网络共享卷积网络,使得建议框数目从原有的约2000个减少为300个,且建议框的质量也有本质的提高.
Conv的结构是什么?
Faster R-CNN首先是支持输入任意大小的图片的,比如上图中输入的PQ,进入网络之前对图片进行了规整化尺度的设定,比如设定图像短边不超过600,图像长边不超过1000,我们可以假定MN=1000*600(如果图片少于该尺寸,可以边缘补0,即图像会有黑色边缘)
如上图所示:
- 13个Conv层
kernel_size=3,pad=1,stride=1;
所以,conv层不会改变图片大小(即:输入的图片大小=输出的图片大小)
- 13个ReLU层
激活函数,不改变图片大小
- 4个Pooling 层
kernel_size=2,stride=2;pooling层会让输出图片是输入图片的1/2
Conv的输出结果是什么?
经过Conv layers,图片大小变成(M/16)(N/16),即:6040(1000/16≈60,600/16≈40);则,Feature Map就是6040512-d(注:VGG16是512-d,ZF是256-d),表示特征图的大小为60*40,数量为512
RPN的主要工作是什么?
1、把feature map分割成多个小区域,识别出哪些小区域是前景,哪些是背景,简称RPN Classification,对应粉色框中上半分支;
2、获取前景区域的大致坐标,简称RPN bounding box regression
Feature Map进入RPN后,先经过一次33的卷积,同样,特征图大小依然是6040,数量512,这样做的目的应该是进一步集中特征信息,接着看到两个全卷积,即kernel_size=1*1,p=0,stride=1;
如上图中标识:
① rpn_cls:60*40*512-d ⊕ 1*1*512*18 ==> 60*40*9*2
逐像素对其9个Anchor box进行二分类
② rpn_bbox:60*40*512-d ⊕ 1*1*512*36==>60*40*9*4
逐像素得到其9个Anchor box四个坐标信息(其实是偏移量,后面介绍)
Anchors的生成规则是什么?
前面提到经过Conv layers后,图片大小变成了原来的1/16,令feat_stride=16,在生成Anchors时,我们先定义一个base_anchor,大小为1616的box(因为特征图(6040)上的一个点,可以对应到原图(1000600)上一个1616大小的区域),源码中转化为[0,0,15,15]的数组,参数ratios=[0.5, 1, 2]scales=[8, 16, 32]
先看[0,0,15,15],面积保持不变,长、宽比分别为[0.5, 1, 2]是产生的Anchors box
如果经过scales变化,即长、宽分别均为 (168=128)、(1616=256)、(16*32=512),对应anchor box如图
综合以上两种变换,最后生成9个Anchor box
RPN的工作原理怎么解释?
主要看上图中框住的‘RPN’部分的网络图,其中‘rpn_conv/33’是33的卷积,上面有提到过,接着是两个1*1的全卷积,分别是图中的‘rpn_cls_score’和‘rpn_bbox_pred’,在上面同样有提到过。
这一层主要是为特征图60*40上的每个像素生成9个Anchor box,并且对生成的Anchor box进行过滤和标记,参照源码,过滤和标记规则如下:
① 去除掉超过1000*600这原图的边界的anchor box ② 如果anchor box与ground truth的IoU值最大,标记为正样本,label=1 ③ 如果anchor box与ground truth的IoU>0.7,标记为正样本,label=1 ④ 如果anchor box与ground truth的IoU<0.3,标记为负样本,label=0 剩下的既不是正样本也不是负样本,不用于最终训练,label=-1 |
什么是IoU?
RPN网络中的网络如何学习到预测box的能力?
通过ground truth box与预测的anchor box之间的差异来进行学习
除了对anchor box进行标记外,另一件事情就是计算anchor box与ground truth之间的偏移量
令:ground truth:标定的框也对应一个中心点位置坐标x*,y和宽高w,h*
anchor box: 中心点位置坐标x_a,y_a和宽高w_a,h_a
所以,偏移量:
△x=(x*-x_a)/w_a △y=(y*-y_a)/h_a
△w=log(w*/w_a) △h=log(h*/h_a)
rpn_loss_cls、rpn_loss_bbox、rpn_cls_prob这三个变量指什么
下面集体看下这三个,其中‘rpn_loss_cls’、‘rpn_loss_bbox’是分别对应softmax,smooth L1计算损失函数,‘rpn_cls_prob’计算概率值(可用于下一层的nms非最大值抑制操作)
在’rpn-data’中已经为预测框anchor box进行了标记,并且计算出与gt_boxes之间的偏移量,利用RPN网络进行训练。
RPN训练设置:在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1。如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然
实验图中的proposal是什么作用?
在输入中我们看到’rpn_bbox_pred’,记录着训练好的四个回归值△x, △y, △w, △h。
源码中,会重新生成60409个anchor box,然后累加上训练好的△x, △y, △w, △h,从而得到了相较于之前更加准确的预测框region proposal,进一步对预测框进行越界剔除和使用nms非最大值抑制,剔除掉重叠的框;比如,设定IoU为0.7的阈值,即仅保留覆盖率不超过0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个);这样,进入到下一层ROI Pooling时region proposal大约只有300个
实验图中的roi_data的作用是什么?
为了避免定义上的误解,我们将经过‘proposal’后的预测框称为region proposal(其实,RPN层的任务其实已经完成,roi_data属于为下一层准备数据)
主要作用:
① RPN层只是来确定region proposal是否是物体(是/否),这里根据region proposal和ground truth box的最大重叠指定具体的标签(就不再是二分类问题了,参数中指定的是81类)
② 计算region proposal与ground truth boxes的偏移量,计算方法和之前的偏移量计算公式相同
经过这一步后的数据输入到ROI Pooling层进行进一步的分类和定位.
训练的代价函数是什么?
代价函数分为两部分,对应着RPN两条支路,即目标与否的分类误差和bbox的回归误差,其中
$L_{reg}(ti,ti*) = R(ti-ti*)$
采用在Fast-RCNN中提出的平滑L1函数,作者认为其比L2形式的误差更容易调节学习率。注意到回归误差中 $L_{reg}$
与pi相乘,因此bbox回归只对包含目标的anchor计算误差。也就是说,如果anchor不包含目标,box输出位置无所谓。所以对于bbox的groundtruth,只考虑判定为有目标的anchor,并将其标注的坐标作为ground truth。此外,计算bbox误差时,不是比较四个角的坐标,而是tx,ty,tw,th,具体计算如下
这个在上面也讲过了
这个在上面已经讲过了
推荐:https://www.cnblogs.com/wangyong/p/8523814.html
经过roi pooling层之后,batch_size=300, proposal feature map的大小是7*7,512-d,对特征图进行全连接,参照下图,最后同样利用Softmax Loss和L1 Loss完成分类和定位
通过full connect层与softmax计算每个region proposal具体属于哪个类别(如人,马,车等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个region proposal的位置偏移量bbox_pred,用于回归获得更加精确的目标检测框
全连接层主要做了哪些工作?
通过全连接和softmax对region proposals进行具体类别的分类
再次对region proposals进行bounding box regression,获取更高精度的rectangle box
复现结果对比
<近期更新>