之前的文章简要介绍了Faster-RCNN等物体检测的算法,本文将从代码角度详细分析介绍Faster-RCNN的实现。本文使用的代码参考了chenyuntc的实现,代码的位置看这里。需要注意的是,本文使用的框架是Pytorch。

数据载入
数据载入部分的代码主要见./data/dataset.py中的类Dataset与TestDataset。
数据载入部分的逻辑如下:
- 从VOC数据集中获得
img, bbox, label - 将
img, bbox进行放缩(放缩的目的是让图片处于合适的大小,这样预先指定锚框才有意义) - 将
img进行标准化正则处理 - 如果是训练阶段,将
img翻转以增加训练数据
网络结构
FasterRCNN的网络结构如下图所示:

FasterRCNN结构的代码主要见./model.faster_rcnn.py,其结构包含三大部分:
- 预训练的CNN模型
decom_vgg16 - rpn网络
RegionProposalNetwork - roi及以上网络
VGG16RoIHead
下面,将以放缩后大小为[1, 3, 600, 800]的图片为例针对每个部分分别介绍。图像类别共计21类(包含背景)。
预训练的CNN模型
该部分代码见./model/vgg16.py。
输入:图片,大小[1, 3, 600, 800]
输出:特征图features,大小[1, 512, 37, 50]
其逻辑如下:
- 载入预先训练好的CNN模型VGG16。
- 将模型拆分为两部分
extractor,classifier。其中,extractor的参数固定。 - 图片通过
extractor可以得到特征图features。根据extractor中池化参数可知图像通过extractor缩小了16倍。
rpn网络
该部分代码见./model/rpn.py。
输入:特征图features,大小[1, 512, 37, 50]
输出:
rpn_locs:rpn对位置的修正,大小[1, 16650, 4]rpn_scores:rpn判断区域前景背景,大小[1, 16650, 2]rois:rpn筛选出的roi的位置,大小[300, 4]roi_indices:rpn筛选出的roi对应的图片索引,大小[300]anchor:原图像的锚点,大小[16650, 4]
其中,16650是放缩后的图像所产生的所有锚点(37*50*9),每个锚点都对应了一个rp。通过 rpn_scores以及nms可以得到筛选后的大小为300的roi。
其逻辑如下:
- 对特征图
features以基准长度为16、选择合适的ratios和scales取基准锚点anchor_base。(选择长度为16的原因是图片大小为600*800左右,基准长度16对应的原图区域是256*256,考虑放缩后的大小有128*128,512*512比较合适) - 根据
anchor_base在原图上获得anchors。 - 对特征图
features采用卷积得到rpn_locs和rpn_scores - 根据
anchors和rpn_locs获得修正后的rp - 对
rp进一步修正获得rois和roi_indices,修正包括超出边界的部分截断、移除太小的、nms。
roi及以上网络
该部分代码见./model/roi_module.py。
输入:
features:特征图,大小[1, 512, 37, 50]rois:rpn筛选出的roi的位置,大小[300, 4]roi_indices:rpn筛选出的roi对应的图片索引,大小[300]
输出:
roi_cls_locs:roi位置的修正,大小[300, 84]roi_scores:roi各类的分数,大小[300, 21]
其逻辑如下:
- 通过
RoIPooling2D将大小不同的roi变成大小一致,得到pooling后的特征,大小为[300, 512, 7, 7] - 接入预训练的CNN模型引入的
classifier - 分别接入全连接得到
roi_cls_locs、roi_scores
训练
训练部分的代码主要见./trainer/trainer.py中的FasterRCNNTrainer中的train_step函数。
训练部分的核心是loss如何求取。
loss求取前网络的步骤如下:
- 预训练CNN特征提取:输入
img到extractor获得features - rpn网络得到roi:输入
features到rpn获得rpn_locs,rpn_scores,rois,roi_indices,anchor - 抽样roi:输入
rois,bbox,label到ProposalTargetCreator获得sample_roi,gt_roi_loc,gt_roi_label。该步骤的含义是得到正负例比例和位置合适的roi。 - head网络得到roi的位置修正与分数:输入
features,sample_roi,sample_roi_index得到roi_cls_loc,roi_score
各个loss求取的方式如下:
rpn_loc_loss:已知rpn_loc,需要先根据anchor和bbox得到真实的gt_rpn_loc和gt_rpn_label。该处loss的计算只考虑前景,所以根据rpn_loc,gt_rpn_loc,gt_rpn_label计算L1-LOSS即可。rpn_cls_loss:根据rpn_score和gt_rpn_label计算二分类的交叉熵即可。roi_loc_loss:已知roi_loc,在sample roi的过程中已获得gt_roi_loc,gt_roi_label。根据roi_loc,gt_roi_loc,gt_roi_label计算L1-LOSS即可。roi_cls_loss:根据roi_score和gt_roi_label计算多分类的交叉熵即可。
整体的loss为以上各loss相加求和。
测试
训练部分的代码主要见./model/faster_rcnn.py中的FasterRCNNTrainer中的predict函数。
其步骤如下:
- 图片预处理
- 预训练CNN特征提取:输入
img到extractor获得features - rpn网络得到roi:输入
features到rpn获得rpn_locs,rpn_scores,rois,roi_indices,anchor - head网络得到roi的位置修正与分数:输入
features,rois,roi_indices得到roi_cls_loc,roi_score - 得到图片预测的bbox:输入
roi_cls_loc、roi_score、rois,采用nms等方法得到预测的bbox。
最后
以上就是听话小蜜蜂最近收集整理的关于FasterRCNN代码解读数据载入网络结构训练测试的全部内容,更多相关FasterRCNN代码解读数据载入网络结构训练测试内容请搜索靠谱客的其他文章。
发表评论 取消回复