继R-CNN和fast R-CNN后,Ross Girshick2016年提出了faster R-CNN。
从功能模块来看,主要包括4部分内容:特征提取网络,RPN网络,ROI Pooling和classification。
整体网络结构图如下:
卷积层可以是VGG-16或者ZF网络。主要用来生成feature maps。
VGG作为主干网络大致如下:
比如输入图片是3x600x800经过VGG网络,包含4个池化层,下采样为16,feature map的尺寸就是512x37x50。
网络整体处理流程:
RPN模块是Faster R-CNN的核心,包含5个子模块:
引用大神画的图,这里的图画的很好。这里我偷懒了。(参考请见最后,如果侵犯了请联系我删除)
对feature map上的每个点,都生成9个大小不同的Anchor,这样就会生成接近2万个anchor。
主要分为两条线:上面主要是为了计算anchor的cls,通过softmax和reshape操作,得到18x37x50,下面主要是为了计算anchor的loc,计算回归偏移量,让最后的proposal更精确,得到36x37x50。
这里的18是指2x9,2是指前景或者背景,9是9个anchor。
这里的36是指4x9,4是指BBox的参数,9是9个anchor。
原文的2k和4k就是这样理解。
根据anchor和gt之间的IOU来决定哪些是正样本,哪些是负样本。
规则:
损失函数:
只考虑正样本。λ在后面进行测试,数据在表8,最终选择10。
不带的是预测值,带*的是真值,带a的是anchor。
这里可以看到偏移位置tx和ty利用宽和高进行了归一化处理,宽高的偏移做了对数处理,好处:限制偏移量的范围,更好预测。
同时需要预测真实物体相对于Anchor的偏移量。
根据第二步的anchor的score和偏移量,确定一些比较好的proposal。
proposal数量还是比较多,默认是2000个,进一步进行筛选proposal得到ROI,数量为256个,正负样本保持1:1,正样本不够128的话,也要稳定在64以上。
在一个图像中随机采样256个anchors,计算损失,控制正样本:负样本=1:1。从标准偏差为0.01的零均值高斯分布中绘制权重来随机初始化所有新层。
至此已经讨论了如何训练一个区域建议生成网络(RPN),但是未考虑基于这些提案的基于区域的目标检测卷积神经网络。对检测网络采用的是Fast R-CNN。考虑三种训练RPN和Fast R-CNN共享特征的方法。
四步交替训练:
忽略超过图像边界的框
对于一个典型的1000×600图像,总锚点约为20000(≈60×40×9)。如果忽略跨界的锚点,每幅图像大约有6000个锚点用于训练。
NMS进一步减少anchors
NMS的阈值固定0.7,训练Fast RCNN的时候使用2000RPN 建议,在测试的时候使用不同数量的框。在NMS后,采用top-N的建议区域来检测。
这部分接受feature map和RPN的proposal(大小各不相同),送给RCNN网络处理。
对于不同大小的proposal,对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。有2种解决办法:
前面的VGGNet已经提供了整张图像的feature map,这里将每一个ROI区域对应的特征提取出来,然后接入全连接网络,预测ROI的类别和偏移。
对ROI进行池化的思想在SPPNet就出现过,Faster R-CNN提出的ROI Pooling主要利用最近邻差值算法。后面的Mask R-CNN对这里进一步提出ROI Align,用的是双线性差值,精度提高。
对于这里的ROI Pooling,是这样的步骤:
注: 本文应该有四个loss,RPN那里有两个,最后分类有两个,应该是一样的。
主要在两个数据集上进行测试:
1.PASCAL VOC2007和2012
2.COCO
https://zhuanlan.zhihu.com/p/31426458(大佬分析的很好,强烈建议看看,本文图很多都是来自大佬,只是加上自己的理解)