Faster-RCNN笔记

发布于 18 天前  425 次阅读


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

  1. 先使用Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))对特征图进行处理,得到图中的中间层
  2. 使用Conv2d(512, 9*2, kernel_size=(1, 1), stride=(1, 1), padding=(1, 1))对中间层进行处理得到anchor box的分类参数
  3. 使用Conv2d(512, 9*4, kernel_size=(1, 1), stride=(1, 1), padding=(1, 1))对中间层进行处理得到anchor box的位置修正参数,然后将参数带入坐标回归公式就能得到ROIs的坐标

得到这么多的ROIS还需要经过筛选

  1. IOU设定阈值
  2. 非最大抑制(nms)
  3. 最后再剩余的ROIs随机抽取R个

3.ROIPooling

RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图中可以看到Rol pooling层有2个输入:

  1. 原始的feature maps
  2. 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作为开山之作,还是有理解的必要


浪子三唱,不唱悲歌