前言
由于之前fast-rcnn的tensorflow版本较少,没有认真调试,所以本来准备在faster-rcnn上找一些tensorflow版本好好研读调试,不过因为faster-rcnn对环境的要求比较高,github上绝大多数项目都要求在linux环境下进行编译,同时代码量有点大,全部看完有点费时间,而且没有必要,所以,还是把训练部分用到的代码看了一下,对faster-rcnn的网络结构和工作原理有个比较清晰的认识就可以了。
参考
论文和解释
论文的翻译可以参考:
https://blog.csdn.net/quincuntial/article/details/79132243
论文的详细的解释和说明可以参考:
https://blog.csdn.net/zziahgf/article/details/79311275
参考程序
tensorflow版本的程序有很多,大多数需要linux下编译,这个大家在github上随便都能找得到,这里提供一个可以在windows下安装运行的项目,不过这个项目要求python版本必须是3.5:
https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5
faster-rcnn详解
fast-rcnn存在的问题
region proposal花费了大量的时间,并且region proposal采用的selective search是一种纯算法,无法在gpu上实现,优化的难度很大。
faster-rcnn的创新点
针对selective search无法在gpu上实现的问题,作者提出了用region proposal network(RPN)来代替selective search来完成region proposal(产生候选框)的工作。
RPN使得region proposal这部分的工作也可以在gpu上运行,大大提升了运行的速度,减少了产生候选框所花费的时间,达到几乎实时的处理速度。
网络架构
- 特征提取层(head层)
采用vgg16中的卷积部分(13conv+13relu+4pooling)作为特征提取部分(head层),用来输出feature map(特征图)。
- RPN层产生anchors
(1)卷积:n(256)个3x3卷积核。用于将之前得到的feature map(≈40x60x512)降维40x60xn(256)。
(2)卷积:(9x2)个1x1卷积核,用于预测feature map中每个点产生9个anchor的2分类情况(前景/背景)。卷积:(9x4)个1x1卷积核,用于预测feature map中每个点产生9个anchor的bbox参数。
由于vgg中有4个2步长pooling层,所以featuremap中每个点(1x1)对应原始图像的(16x16),每个16x16(尺寸:1,宽高比:1)区域产生9个anchors(尺寸:0.5,1,2;宽高比:0.5,1,2)。
(3)anchors 标注
- 对产生的约2w个anchors,选择其中不越界的anchors。与这张图片中所有类别的groundtruth(20个,最终分20类)计算iou,其中max_iou>0.7的为前景,<0.3的为背景。
- 前景anchors中随机选取256x50%=128个,标注label=1。背景anchors中随机选取剩下128个,标注label=0。其他anchors标注label=-1。得到anchors实际的2分类结果。
- 根据这张图片标注文件中groundtruth的坐标,计算anchors实际的bbox参数。
-
proposal层筛选anchors,得到rois(每个batch一张图,256个roi)
(1)用2(2)中RPN预测的anchors的bbox参数,对anchors位置进行调整精修,对越界部分修剪。
(2)按2(2)中RPN预测的2分类前景得分排序,选择top-n(12000)
(3)对剩下的12000个anchors进行非极大抑制,选择top-n(2000)
(4)把groundtruth加入这2000个anchors
(5)计算这些anchors与groundtruth(20个,假设20分类)的iou,max_iou>0.5的标记为前景anchors,0.1<max_iou<0.5的为背景anchors。
(6)前景anchors中随机选择256x25%=64个,剩下的192个用背景随机选择,得到了256个roi。
(7)前景rois标注label为与其iou最大的groundtruth序号(即分类情况),背景rois标注label=0。得到筛选出的256个roi实际n分类结果。
(8)根据这张图片标注文件中groundtruth的坐标,计算256rois实际的bbox参数。 -
prediction层(产生最终分类和定位的预测结果)
(1)将筛选出的256rois映射到feature map
(2)256个rois经过roi-pooling生成固定长度的特征向量
(3)经过全连接层后分别产生softmax分类预测和bbox回归预测。
损失函数
参考程序中采用的近似联合训练,即把RPN和fast-rcnn中4种损失放在一起训练。这种训练方式实验效果比较好,训练比较块。而论文中讲解的交替训练方法,没怎么看懂,以后有机会再去详细了解。
loss = rpn_cross_entropy + rpn_loss_bbox + cross_entropy + loss_bbox
(1)rpn_cross_entropy,rpn层的分类误差。是由2(3)中的anchors实际2分类结果,和2(2)中预测的anchors2分类结果,产生的误差。
(2)rpn_loss_bbox,rpn层的定位误差。是由2(3)中anchors实际的bbox参数,和2(2)中预测的bbox参数,产生的误差。
(3)cross_entropy,最终prediction层的分类误差。4(3)中256个rois的n分类预测,和3(7)的rois实际n分类结果,产生的误差。
(4)loss_bbox,最终prediction层的定位误差。4(3)中256rois的bbox预测,和3(8)的rois实际bbox参数,产生的误差。
训练
- 在ImageNet上预训练vgg16。
- 将预训练的网络参数加载到faster-rcnn中特征提取对应层,其他参数初始化。
- 训练集图片输入到faster-rcnn网络。根据损失函数进行迭代。
总结
faster-rcnn总体的网络结构实际和fast-rcnn非常相似,不过把selective search用RPN网络代替,所以faster-rcnn可以看作是RPN网络和fast-rcnn的结合。