原论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
目标检测的任务就是不仅要对图片中的物体进行定位,而且还要将物体进行分类,同时还要输出分为此类的置信度概率。如下图:
Faster R-CNN整体的流程可以分为三步:
Faster R-CNN最突出的贡献就在于提出了Region Proposal Network(RPN)代替了Selective Search,从而将候选区域提取的时间开销几乎降为0(2s -> 0.01s)。RPN架构图如下:
在RPN中,作者提出了anchor。Anchor是大小和尺寸固定的候选框。论文中用到的anchor有三种尺寸和三种比例,如下图所示,三种尺寸分别是小(蓝128)中(红256)大(绿512),三个比例分别是1:1,1:2,2:1。3×3的组合总共有9种anchor。
然后用这9种anchor在特征图(feature)左右上下移动,每一个特征图上的点都有9个anchor,最终生成了 (H/16)× (W/16)×9个anchor. 对于一个512×62×37的feature map,有 62×37×9~ 20000个anchor。 也就是对一张图片,有20000个左右的anchor。这种做法很像是暴力穷举,20000多个anchor,哪怕是蒙也能够把绝大多数的ground truth bounding boxes蒙中。
anchor的数量和feature map相关,不同的feature map对应的anchor数量也不一样。RPN在Extractor输出的feature maps的基础之上,先增加了一个卷积,然后利用两个1x1的卷积分别进行二分类(是否为正样本)和位置回归。进行分类的卷积核通道数为9×2(9个anchor,每个anchor二分类,使用交叉熵损失),进行回归的卷积核通道数为9×4(9个anchor,每个anchor有4个位置参数)。RPN是一个全卷积网络(fully convolutional network),这样对输入图片的尺寸就没有要求了。
但进行RPN网络训练时,会利用(AnchorTargetCreator)将20000多个候选的anchor选出256个anchor进行分类和回归位置。
RPN在自身训练的同时,还会提供RoIs(region of interests)给Fast RCNN(RoIHead)作为训练样本 。
Anchor的生成过程:
假设图像高h,宽为w。以每个像素为中心,大小s∈(0,1](s为scale,经过缩放归一化后),宽高比r>0。那么锚框的宽为 w s r ws\sqrt{r} wsr,高为 h s r \frac{hs}{\sqrt{r}} rhs。(设锚框宽高为x和y。面积 x y = s 2 xy=s^2 xy=s2,比例 x / y = r x/y=r x/y=r,计算出来 x = s ∗ r , y = s r x=s∗\sqrt{r} ,y=\frac{s}{\sqrt{r}} x=s∗r,y=rs,这里的计算出的都是归一化后的宽度和高度是相对原图,因此各自乘以原图像宽度和高度。)。
设定一组大小和宽高比, s 1 , . . . , s n 和 r 1 , . . . . , r m s_1,...,s_n和r_1,....,r_m s1,...,sn和r1,....,rm。显然有 m ∗ n m*n m∗n种组合,图像有 w ∗ h w*h w∗h个像素点,那么一共有 w ∗ h ∗ m ∗ n w*h*m*n w∗h∗m∗n个锚框。
RPN只是给出了2000个候选框,RoI Head在给出的2000候选框之上继续进行分类和位置参数的回归。RoIHead 架构图如下:
最后再接两个全连接层,分别是:
参考代码:simple-faster-rcnn-pytorch