Faster-RCNN
概述
区域卷积神经网络(region-based CNN或regions with CNN features,R-CNN)是将深度模型应用于目标检测的开创性工作之一,而faster-rcnn作为base work更是将目标检测全部使用卷积网络代替
Faster R-CNN是基于R-CNN和Fast R-CNN来进行改进的。
Faster R-CNN可以简单地看做“区域生成网络RPNs + Fast R-CNN”的系统,用区域生成网络代替FastR-CNN中的Selective Search方法
RPN
1.生成anchor base
anchor base就是由两个参数scale=[8,16,32]
和ratio=[0.5,1,2]
两个参数生成的生成的,scale
指anchor的长,ratio
指anchor的长宽比,有这两个参数进行组合就能得到9个anchor base,anchor base用四个坐标$(x,y,w,h)$保存(分别表示中心点的坐标和长宽)
通过遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框
2.获得所有anchor box和获得ROIs
让anchor base在特征图feature map$(\frac{w}{16},\frac{h}{16},512)$的每一个像素点上移动,由此就能得到$k=9 * \frac{w}{16} * \frac{h}{16}$个anchor
- 先使用
Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
对特征图进行处理,得到图中的中间层 - 使用
Conv2d(512, 9*2, kernel_size=(1, 1), stride=(1, 1), padding=(1, 1))
对中间层进行处理得到anchor box的分类参数 - 使用
Conv2d(512, 9*4, kernel_size=(1, 1), stride=(1, 1), padding=(1, 1))
对中间层进行处理得到anchor box的位置修正参数,然后将参数带入坐标回归公式就能得到ROIs
的坐标
得到这么多的ROIS还需要经过筛选
- IOU设定阈值
- 非最大抑制(nms)
- 最后再剩余的
ROIs
随机抽取R个
3.ROIPooling
RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图中可以看到Rol pooling层有2个输入:
- 原始的feature maps
- RPN输出的proposal boxes(大小各不相同)
网络训练好后输入的图像尺寸必须是固定值,为了解决这个问题,需要引入ROlPooling
- 由于proposal是对应MxN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature map尺度;
- 再将每个proposal对应的feature map区域水平分为$pooled_w*pooled_h$的网格;
- 对网格的每一份都进行max pooling处理。
这样得到的就是固定输入的向量
反向传播
1.RPN网络的训练
RPN网络需要训练的部分就是位置修正参数和种类参数(前景和背景)的卷积网络。
$$
\text{L}({p_i},{t_i})=\frac{1}{N_{\text{cls}}}\sum_{i}\text{L}_\text{cls}(p_i,p_i^*)+\lambda\frac{1}{N_{\text{reg}}}\sum_{i}p_i^*\text{L}_\text{reg}(t_i,t_i^*)
$$
2.Fast-CNN的训练
和RPN网络的训练十分类似,就是一个位置修正参数和种类参数(n_class+1种)的全连接网络的回归。
这里借用看的一张图来表示训练的步骤
总结
torchvision内部集成了Faster-rcnn的模型,其接口和调用方式非常简洁,目前官方提供resnet50+rpn在coco上训练的模型,调用该模型只需要几行代码:
>>> import torch
>>> import torchvision
// 创建模型,pretrained=True将下载官方提供的coco2017模型
>>> model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
>>> model.eval()
>>> x = [torch.rand(3, 300, 400), torch.rand(3, 500, 400)]
>>> predictions = model(x)
Faster-rcnn作为开山之作,还是有理解的必要