请选择 进入手机版 | 继续访问电脑版

Tensorflow---Faster RCNN网络(一)

[复制链接]
余峻 发表于 2020-12-31 20:21:47 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
Tensorflow—Faster RCNN网络(一)

Faster-RCNN是一个非常有效的目的检测算法,虽然是一个比力早的论文, 但它至今仍是许多目的检测算法的底子。
Faster-RCNN作为一种two-stage的算法,与one-stage的算法相比,two-stage的算法更加复杂且速度较慢,但是检测精度会更高。
注:研究Faster-RCNN也有快一年了,在CSDN和github上面也是搜遍了大多的文章和代码,对其原理和实现代码一直都是似懂非懂的感觉,最近时间比力宽松,准备好好研究下Faster-RCNN内部一些细节。于是乎。。。搜遍了所有的文章和代码,终于找到了讲的比力详细的~
  转载原理文章链接:https://zhuanlan.zhihu.com/p/32404424
实现代码链接:https://github.com/MingtaoGuo/Faster_RCNN_TensorFlow
ps:真心感谢上述作者,在对明白Faster-RCNN有很大的资助~对于新手来说,重新开始搞官方Faster-RCNN源码,简直就是煎熬
大体流程


从编程角度来说, Faster R-CNN主要分为四部分(图中四个绿色框):
Dataset:数据,提供符合要求的数据格式(现在常用数据集是VOC和COCO)

Extractor: 使用CNN提取图片特征features(原始论文用的是ZF和VGG16,厥后人们又用ResNet101)

RPN(Region Proposal Network): 负责提供候选区域rois(每张图给出大概2000个候选框)

RoIHead: 负责对rois分类和微调。对RPN找出的rois,判定它是否包罗目的,并修正框的位置和座标

下面就是它的详细流程~~
详细流程


  图转载于:https://www.bilibili.com/video/BV1of4y1m7nj?p=3
表明:
1.在Dataset模块中,一般取VOC大概COCO数据集,这里,我就不多说了,之前写过一篇关于数据集的文章:https://blog.csdn.net/weixin_42206075/article/details/111182492
2.在Extractor模块中,按照BTACHSIZE将训练照片放入backbone中举行提取特征,在Faster-RCNN中,backbone有许多种:VGG16、Resetnet等等。这里顺便提一句,VGG16模子虽然结构比力简单,但是有一个问题:参数量过大,训练不易收敛,下图就是VGG16的模子图~

称之为VGG16的原因就是:一共有13个卷积,3个全毗连,13+3=16(在实际代码中,只会接纳颠末13层卷积之后的feature map,不接纳全毗连)
3.颠末卷积之后得到的feature map的shape为(1,38,50,512),这里表明一下:1代表每次放进去训练的批次巨细,在Faster-RCNN中通常来说,每次都只放一个照片,即batchszie=1;38和50体现的是原始输入照片巨细为(600,800,3)颠末卷积之后得到的feature map巨细,512体现的是feature map的channel数。

在上图中可以看到,Conv5_3的输出作为RPN的输入。conv5_3相比于输入,下采样了16倍,也就是说输入的图片尺寸为3×H×W,那么feature的尺寸就是C×(H/16)×(W/16),这里的C实在就是512。VGG最后的三层全毗连层的前两层,一般用来初始化RoIHead的部分参数。
4.将(1,38,50,512)的feature map放入RPN模块中,首先会在feature map上面生成93850=17100个anchor box,也就是对一张照片,有约莫17100个左右的anchor box。
RPN的总体架构如下图所示:

先将(1,38,50,512)的feature map举行一次卷积,这里我认为是用来举行语义空间转换。然后使用两个1x1的卷积分别举行二分类(是否为正样本)和位置回归。举行分类的卷积核通道数为9×2(9个anchor,每个anchor二分类,使用交织熵损失),得到的tensor的shape=(1, 38, 50, 18),举行回归的卷积核通道数为9×4(9个anchor,每个anchor有4个位置参数),得到的tensor的shape=(1, 38, 50, 36)。
接下来,使用anchor生成的17100个anchor box选出来256个anchor举行分类与回归模子的训练,选择过程如下:
对于每一个ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个anchor box作为正样本。
对于剩下的anchor box,从中选择和任意一个gt_bbox重叠度高出0.7的anchor box,作为正样本,正样本的数目不高出128个。
随机选择和gt_bbox重叠度小于0.3的anchor box作为负样本。
对于每个anchor box, gt_label 要么为1(前景),要么为0(背景),所以对上述tensor举行reshape为(1,256,2)而gt_loc则是由4个位置参数(tx,ty,tw,th)组成,所以对上述tensor举行reshape为(1,256,4),这样比直接回归座标更好。
在RPN对自身训练的同时,会生成ROI输入到faster rcnn网络中,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。
5.在颠末上述rpn得到了2000个ROI框,将其喂到后续faster rcnn中继承举行分类与位置的训练。

首先,会举行一个ROI Pooling,实在本质是一个spp(特征金字塔池化),只不外是一种特殊的spp。因为上述的2000个ROI框的巨细并不相同,不能直接将其flatten之后喂到全毗连中。
给定一张图片的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个位置参数)

来源:https://blog.csdn.net/weixin_42206075/article/details/111947978
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )