Tensorflow---Faster RCNN网络(一)

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源码,简直就是煎熬

大体流程

Tensorflow---Faster RCNN网络(一)_第1张图片
从编程角度来说, Faster R-CNN主要分为四部分(图中四个绿色框):

Dataset:数据,提供符合要求的数据格式(目前常用数据集是VOC和COCO)

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

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

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

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

详细流程

Tensorflow---Faster RCNN网络(一)_第2张图片

图转载于: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的模型图~
Tensorflow---Faster RCNN网络(一)_第3张图片
称之为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数。
Tensorflow---Faster RCNN网络(一)_第4张图片
在上图中可以看到,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上面生成9 * 38 * 50=17100个anchor box,也就是对一张照片,有大约17100个左右的anchor box。
RPN的总体架构如下图所示:
Tensorflow---Faster RCNN网络(一)_第5张图片
先将(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中继续进行分类与位置的训练。
Tensorflow---Faster RCNN网络(一)_第6张图片
首先,会进行一个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个位置参数)

你可能感兴趣的:(目标检测,tensorflow,Faster,R-CNN,算法,python,计算机视觉,神经网络,机器学习)