Data Analysis
首发于Data Analysis
目标检测之Fast RCNN

目标检测之Fast RCNN

本文旨在理清Fast RCNN的训练和预测计算思路和步骤,不关注与主干无关的一些细节变化(相比于RCNN),需要读者对RCNN的思路有一定的了解

本文分为如下几个部分

  • RCNN回顾
  • Fast RCNN算法框架
  • 网络结构
  • 损失函数
  • 更多

RCNN回顾

我们先来回顾一下RCNN的算法框架

  • selective search选取建议框
  • 构建AlexNet卷积神经网络进行特征提取
  • 构建SVM分类器进行分类(非极大抑制选取合适的框)
  • 构建回归器进行调整

Fast RCNN算法框架

首先Fast RCNN相比于RCNN主要在以下方面进行了改进

  • Fast RCNN仍然使用selective search选取2000个建议框,但是这里不是将这么多建议框都输入卷积网络中,而是将原始图片输入卷积网络中得到特征图,再使用建议框对特征图提取特征框。这样做的好处是,原来建议框重合部分非常多,卷积重复计算严重,而这里每个位置都只计算了一次卷积,大大减少了计算量
  • 由于建议框大小不一,得到的特征框需要转化为相同大小,这一步是通过ROI池化层来实现的(ROI表示region of interest即目标)
  • Fast RCNN里没有SVM分类器和回归器了,分类和预测框的位置大小都是通过卷积神经网络输出的
  • 为了提高计算速度,网络最后使用SVD代替全连接层

使用Fast RCNN进行目标检测的预测流程如下

  • 拿到一张图片,使用selective search选取建议框
  • 将原始图片输入卷积神经网络之中,获取特征图(最后一次池化前的卷积计算结果)
  • 对每个建议框,从特征图中找到对应位置(按照比例寻找即可),截取出特征框(深度保持不变)
  • 将每个特征框划分为 H\times W 个网格(论文中是 7 \times 7 ),在每个网格内进行池化(即每个网格内取最大值),这就是ROI池化。这样每个特征框就被转化为了 7\times 7\times C 的矩阵(其中C为深度)
  • 对每个矩阵拉长为一个向量,分别作为之后的全连接层的输入
  • 全连接层的输出有两个,计算分类得分和bounding box回归(bounding box表示预测时要画的框)。前者是sotfmax的21类分类器(假设有20个类别+背景类),输出属于每一类的概率(所有建议框的输出构成得分矩阵);后者是输出一个 20\times 4 的矩阵,4表示(x, y, w, h),20表示20个类,这里是对20个类分别计算了框的位置和大小
  • 对输出的得分矩阵使用非极大抑制方法选出少数框,对每一个框选择概率最大的类作为标注的类,根据网络结构的第二个输出,选择对应类下的位置和大小对图像进行标注

下面是训练过程

网络结构

论文中使用了多种网络结构进行训练,这里以VGG-16(AlexNet之后的又一经典网络)为例。

最开始仍然是在ImageNet数据集上训练一个1000类的分类网络

然后对模型进行“三个变动”

  • 将最后一个最大池化层换成ROI池化层
  • 将最后一个全连接层和后面的softmax1000分类器换成两个并行层,一个是全连接层1+21分类器,另一个是全连接层2+表示每个类预测框位置的输出
  • 输入的不再只是图片,还有提取到的建议框位置信息

变化后的模型结构如下所示

使用变动后的模型,在标注过的图像数据上继续训练,训练时要输入图像、标注(这里将人为标注的框称为ground truth)和建议框信息。这里为了提高训练速度,采取了小批量梯度下降的方式,每次使用2张图片的128张建议框(每张图片取64个建议框)更新参数。

每次更新参数的训练步骤如下

  • 2张图像直接经过前面的卷积层获得特征图
  • 根据ground truth标注所有建议框的类别。具体步骤为,对每一个类别的ground truth,与它的iou大于0.5的建议框标记为groud truth的类别,对于与ground truth的iou介于0.1到0.5之间的建议框,标注为背景类别
  • 每张图片随机选取64个建议框(要控制背景类的建议框占75%),提取出特征框
  • 特征框继续向下计算,进入两个并行层计算损失函数(损失函数具体计算见下面)
  • 反向传播更新参数(关于ROI池化的反向传播细节可以参考这篇博客

损失函数

损失函数分为两个部分,分别对应两个并行层

  • 对类别输出按照softmax正常计算损失
  • 对框的位置的损失方面,标注为背景类的建议框不增加损失(体现在下面公式中的 1[u\gt 1] ,其实背景类直接不需要计算框的位置这一层损失)。对于标注为物体类别的建议框来说,因为这一层输出的是每一个类别对应的(x, y, w, h),因此需要先挑选出真实类别的四个值,分别与ground truth的四个作差来计算loss

具体loss的计算公式如下

(公式图片截取自这里)

更多

Fast RCNN论文中还阐述了非常多细节

  • 在全连接层使用SVD分解来减少计算时间
  • 模型在各种数据集上的测试效果及对比
  • 在迁移学习基础上更新哪些层的参数实验
  • 直接输出两个层是否真的有优势,SVM V.S. softmax,输入多种规格的图片,更多训练数据等等

关于这些细节可以参考Fast RCNN论文CSDN博客

专栏信息

专栏主页:Data Analysis

专栏目录:目录

版本说明:软件及包版本说明

发布于 2018-09-04

文章被以下专栏收录

    以专题形式总结R/Python/计算机视觉等方面内容。文章追求全而细,建议留出较长时间来阅读与运行代码