目录
论文
论文翻译
代码pytorch
知乎大神简易版代码pytorch
- 发展简史 RCNN->Fast RCNN->Faster RCNN
- 算法原理
- 详细内容及源码
a. RPN
b. ROI pooling
c. classification and regression
d. 训练 - 源码流程梳理
- 相关面试题
- 目前基于Faster Rcnn的改进
- 参考链接
正文
-
todo:发展简史
R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN
paper
目标检测 -
算法原理:
faster rcnn网络框架大体分为4个部分:
- Conv layers(feature extraction)。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
- Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
- RoI Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
- Classification and regression。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
-
详细内容及源码
a. RPN
上图中展示了RPN网络的具体结构,可以看到,feature map 经过一个3×3卷积核卷积后分成了两条线,上面一条通过softmax对anchors分类获得foreground和background(检测目标是foregrounnd),因为是2分类,所以它的维度是2k scores。下面那条线是用于计算anchors的bounding box regression的偏移量,以获得精确的proposal。它的维度是4k coordinates。而最后的proposcal层则负责综合foreground anchors和bounding box regression偏移量获取proposal,同时剔除太小和超出边界的propocals,其实网络到这个Proposal Layer这里,就完成了目标定位的功能b. ROI pooling
RoI Pooling 是一种特殊的Pooling操作,给定一张图片的Feature map (512×H/16×W/16) ,和128个候选区域的座标(128×4),RoI Pooling将这些区域统一下采样到 (512×7×7),就得到了128×512×7×7的向量。可以看成是一个batch-size=128,通道数为512,7×7的feature map。为什么要pooling成7×7的尺度?是为了能够共享权重。在之前讲过,除了用到VGG前几层的卷积之外,最后的全连接层也可以继续利用。当所有的RoIs都被pooling成(512×7×7)的feature map后,将它reshape 成一个一维的向量,就可以利用VGG16预训练的权重,初始化前两层全连接。最后再接两个全连接层,分别是:
FC 21 用来分类,预测RoIs属于哪个类别(20个类+背景)
FC 84 用来回归位置(21个类,每个类都有4个位置参数)c. classification and regression
虽然原始论文中用的4-Step Alternating Training 即四步交替迭代训练。然而现在github上开源的实现大多是采用近似联合训练(Approximate joint training),端到端,一步到位,速度更快。
在训练Faster RCNN的时候有四个损失:
RPN 分类损失:anchor是否为前景(二分类)
RPN位置回归损失:anchor位置微调
RoI 分类损失:RoI所属类别(21分类,多了一个类作为背景)
RoI位置回归损失:继续对RoI位置微调
四个损失相加作为最后的损失,反向传播,更新参数。
d. 训练
四步交替训练。在论文中中,采用实用的四步训练算法,通过交替优化学习共享特征。在第一步中,按照之前的描述训练RPN。该网络使用ImageNet的预训练模型进行初始化,并针对区域提议任务进行了端到端的微调。在第二步中,用由第一步RPN生成的提议,由Fast R-CNN训练单独的检测网络。该检测网络也由ImageNet的预训练模型进行初始化。此时两个网络不共享卷积层。在第三步中,我们使用检测器网络来初始化RPN训练,但是我们修正共享的卷积层,并且只对RPN特有的层进行微调。现在这两个网络共享卷积层。最后,保持共享卷积层的固定,我们对Fast R-CNN的独有层进行微调。因此,两个网络共享相同的卷积层并形成统一的网络。类似的交替训练可以运行更多的迭代,但是我们只观察到可以忽略的改进。
4. 源码解读
强烈推荐一个知乎,对于源码的解读很详细,尤其是RPN训练部分:https://zhuanlan.zhihu.com/p/32404424
这里截取部分文字和图片:
尤其是蓝色和红色部分rpn训练。
i) RPN训练:RPN做的事情就是利用(AnchorTargetCreator)将20000多个候选的anchor选出**256**个anchor进行分类和回归位置。选择过程如下:
对于每一个ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个anchor作为正样本
对于剩下的anchor,从中选择和任意一个gt_bbox重叠度超过**0.7**的anchor,作为正样本,正样本的数目不超过128个。
随机选择和gt_bbox重叠度小于**0.3**的anchor作为负样本。负样本和正样本的总数为256。
ii) RPN生成ROIs:
RPN在自身训练的同时,还会提供RoIs(region of interests)给Fast RCNN(RoIHead)作为训练样本。RPN生成RoIs的过程(ProposalCreator)如下:
对于每张图片,利用它的feature map, 计算 **(H/16)× (W/16)×9(大概20000)**个anchor属于前景的概率,以及对应的位置参数。
选取概率较大的12000个anchor
利用回归的位置参数,修正这12000个anchor的位置,得到RoIs
利用非极大值((Non-maximum suppression, **NMS**)抑制,选出概率最大的**2000**个RoIs
注意:在inference的时候,为了提高处理速度,12000和2000分别变为6000和300.
注意:这部分的操作不需要进行反向传播,因此可以利用numpy/tensor实现。
RPN的输出:RoIs(形如2000×4或者300×4的tensor)
- 相关面试题
- 关于fast rcnn的改进
关于iou的改进: giou
关于nms的改进:soft rms, softer rms
其它: - 参考链接
https://blog.csdn.net/Lin_xiaoyi/article/details/78214874
https://zhuanlan.zhihu.com/p/32404424