论文标题:Faster R-CNN: Down the rabbit hole of modern object detection
论文作者:Zhi Tian , Weilin Huang, Tong He , Pan He , and Yu Qiao
论文地址:https://tryolabs.com/blog/2018/01/18/faster-r-cnn-down-the-rabbit-hole-of-modern-object-detection/
论文地址:Object detection: an overview in the age of Deep Learning 已经对基于深度学习的目标检测进行了概述. 推荐先进行阅读.
声明:小编翻译论文仅为学习,如有侵权请联系小编删除博文,谢谢!
小编是一个机器学习初学者,打算认真研究论文,但是英文水平有限,所以论文翻译中用到了Google,并自己逐句检查过,但还是会有显得晦涩的地方,如有语法/专业名词翻译错误,还请见谅,并欢迎及时指出。
在此之前,我们讨论了目标检测,关于它是什么以及最近如何使用深度学习解决它。如果你还没有阅读之前的博客,我们建议您先阅读它,再来看这篇文章。
去年,我们打算去研究Fast R-CNN,阅读原始论文和所有参考论文(等等),知道我们清楚地了解它是如何工作的以及如何去实现它。
我们最终在Luminoth中实施了Fast R-CNN,这是一个基于TensorFlow的计算机视觉工具包,可以轻松训练,监控和使用这些类型的模型。到目前为止,Luminoth已经引起了我们极大的兴趣,并且我们甚至在ODSC Eueope和ODSC West谈到了它。
基于开发Luminoth的所有工作并基于我们所做的演示,我们认为最好有一篇博文,其中包含我们在研究中收集的所有细节和链接,作为未来的参考,任何人都对该主题感兴趣。
背景
Faster R-CNN发表于NIPS 2015,其后出现了很多改进的版本,后面会进行介绍。正如我们在之前的博客文章中提到的,Faster R-CNN是R-CNN论文的第三次迭代。其中Ross Girshick是作者兼合并者。
一切始于2014年的“ 用于精确对象检测和语义分割的丰富特征层次结构 ”(R-CNN),其使用称为选择性搜索的算法来提出可能的感兴趣区域和用于分类和调整它们的标准卷积神经网络(CNN) 。它迅速演变为2015年初发布的Fast R-CNN,其中一种名为Region of Interest Pooling的技术允许共享昂贵的计算并使模型更快。终于推出了Fast R-CNN,其中提出了第一个完全可微分的模型。
网络结构
Faster R-CNN 的结构是复杂的,因为其有几个移动部件. 这里先对整体框架宏观介绍,然后再对每个部分的细节分析.
问题描述:
针对一张图片,需要获得的输出有:
- 边界框(bounding boxes) 列表;
- 每个边界框的类别标签;
- 每个边界框和类别标签的概率.
首先,输入图片表示为 Height×Width×DepthHeight×Width×Depth 的张量(多维数组)形式,经过预训练 CNN 模型的处理,得到卷积特征图(conv feature map). 即,将 CNN 作为特征提取器,送入下一个部分。
这种技术在迁移学习(Transfer Learning)中比较普遍,尤其是,采用在大规模数据集训练的网络权重,来对小规模数据集训练分类器. 后面会详细介绍。
然后,RPN(Region Propose Network) 对提取的卷积特征图进行处理. RPN 用于寻找可能包含 objects 的预定义数量的区域(regions,边界框).
基于深度学习(DL)的目标检测中,可能最难的问题就是生成长度不定(variable-length)的边界框列表. 在构建深度神经网络时,最后的网络输出一般是固定尺寸的张量输出(采用RNN的除外). 例如,在图片分类中,网络输出是 (N,) 的张量,N是类别标签数,张量的每个位置的标量值表示图片是类别 labeli的概率值。
在 RPN 中,通过采用 anchors 来解决边界框列表长度不定的问题,即,在原始图像中统一放置固定大小的参考边界框. 不同于直接检测 objects 的位置,这里将问题转化为两部分:
对每一个 anchor 而言,
- anchor 是否包含相关的 object?
- 如何调整 anchor 以更好的拟合相关的 object。
这里可能不容易理解,后面会深入介绍。
当获得了可能的相关objects和其在原始图像中的对应位置之后,问题就更加直接了,采用CNN提取新的特征和包含相关objects的边界框,采用Rol Pooling处理,并提取相关object的特征,得到了新的向量。
最后基于R-CNN模块,得到:
- 对边界框内的内容进行分类(或者丢弃边界框,采用background作为一个label)
- 调整边界框坐标,以更好地使用object
显而易见,上面忽略了一些重要的细节信息,但是,包括了Fast R_CNN的大致思想,接下来,我们会对网络结构和每个部分的训练及loss进行详细说明。
基础网络
正如上面所说,Fast R-CNN 第一步是采用基于分类任务(如:使用ImageNet)的CNN模型作为特征提取器,听起来比较简单,但是重要的是理解其如何工作和为什么会有效,并可视化中间层,查看其输出形式。
网络结构很难说那种是最好的,Fast R-CNN最早是采用在ImageNet训练的ZF和VGG,其后出现了很多其他权重不同的网络,如MobileNet是一种小型效率高的网络结构,仅有3.3M参数;而ResNet-152的参数量达到了60M,新网络结构,如DenseNet在提高了结果的同时,降低了参数数量。
VGG
在讨论网络结构孰优孰劣之前,这里以VGG16为例。
VGG16是ImageNet ILSVRC 2014竞赛的模型,其是基于Karen Simonyan 和Andrew Zisserman发表在论文 Very Deep Convolutional Networks for Large-Scale Image Recognition 上。今天来看,VGG16网络结构是不算深的,但在当时,其将网络层比常用的网络结构扩展了两倍,开始了 “deeper→more capacity→better”的网络结构设计方向(在训练允许的情况)。
VGG16 图片分类时,输入为 224×224×3的张量(即,一张 224×224 像素的 RGB 图片)。 网络结构最后采用 FC 层(而不是 Conv 层)得到固定长度的向量,以进行图片分类. 对最后一个卷积层的输出拉伸为 rank 1 的张量,然后送入 FC 层。
由于 Faster R-CNN 是采用 VGG16 的中间卷积层的输出,因此,不用关心输入的尺寸. 而且,该模块仅利用了卷积层. 进一步去分析模块所使用的哪一层卷积层. Faster R-CNN 论文中没有指定所使用的卷积层,但在官方实现中是采用的卷积层 conv5/conv5_1 的输出。
每个卷积层利用前面网络信息来生成抽象描述. 第一层一般学习边缘edges信息,第二层学习边缘edges中的图案patterns,以学习更复杂的形状等信息. 最终,可以得到卷积特征图,其空间维度(分辨率)比原图小了很多,但更深. 特征图的 width 和 height 由于卷积层间的池化层而降低,而 depth 由于卷积层学习的 filters 数量而增加。
在其depth上,卷积特征图对图片的所有信息进行了编码,同时保持相对于原始图片所编码“things”的位置. 例如,如果在图片的左上角存在一个红色正方形,而且卷积层有激活响应,那么该红色正方形的信息被卷积层编码后,仍在卷积特征图的左上角。
VGG vs ResNet
现在ResNet结构逐渐取代VGG作为基础网络,用于提取特征。Faster R-CNN的共同作者也是ResNet网络结构论文 Deep Residual Learning for Image Recognition 的共同作者。
ResNet相对于VGG的明显优势是,网络更大,因此具有更强的学习能力,这对于分类任务是重要的,在目标检测中也应该是如此。
另外,ResNet采用残差连接(residual connection) 和 BN (batch normalization) 使得深度模型的训练比较容易. 这对于 VGG 首次提出的时候没有出现。
Anchors
在获得了处理后的图片后,需要寻找 proposals,如用于分类的 RoIs(regions of interest). anchors 是用来解决长度不定问题的。目标是,寻找图片中的边界框bounding boxes,边界框是具有不同尺寸sizes和长宽比aspect ratios 的矩形。假设,已经知道图片中有两个 objects,首先想到的是,训练一个网络,输出 8 个值:两对元组Xmin,Ymin,Xmax,Ymax,分别定义了每个 object 的边界框. 这种方法存在一些基本问题. 例如,当图片的尺寸和长宽比不一致时,良好训练模型来预测,会非常复杂. 另一个问题是无效预测:预测Xmin和Xmax时,需要保证Xmin<Xmax。
事实上,有一种更加简单的方法来预测objects,即,学习相对于参考boxes的偏移量,假设参考box:Xcenter,Ycenter,Width,Height,待预测量
,一般都是很小的值,以调整参考box更好拟合所需要的。
Anchors是固定尺寸的边界框,是通过利用不同的尺寸和比例在图片上放置得到的boxes,并作为第一次预测object位置的参考boxes。
因为是对提取的卷积特征图进行处理,因此在的每个点创建anchors,需要理解的是虽然anchors是基于卷积特征图定义的,但是最终的anchos是相对于原始图片的。
由于只有卷积层和池化层,特征图的维度是原始图片的尺寸程比例关系的,即数学的表述,如果图片尺寸W*H,特征图的尺寸是w/r * h/r,其中r是下采样率(subsampling ratio)。如果在卷积特征图空间位置定义anchor,则最终的图片会是由r像素划分的anchors集,在VGG中 r =16.
为了选择anchors集,一般是先定义定义不同尺寸(如,64px,128px,256px等)和boxes长宽比(如,0.5,1,1.5等),并使用所有可能的尺寸和比例组合。
Region Proposal Network
正如我们之前提到的,RPN获得所有参考框(锚点)并输出一组对象的好建议,它通过为每个锚点提供两个不同的输出来实现这一点。
第一个是锚是物体的概率。如果你愿意,一个“客观得分”。注意RPN并不关心它是什么类的对象,只是它实际上看起来像一个对象(而不是背景)。我们将使用这个客观得分来过滤掉第二阶段的糟糕预测,第二个输出是调整锚的边界盒回归,用于调整锚点以更好地拟合它预测的对象。
RPN以完全卷积的方式高效地实现,使用基础网络返回的卷积特征映射作为输入。首先,我们使用一个包含512个通道和3x3核大小的卷积层,然后使用1x11x1核,我们有两个平行的卷积层,通道的数量取决于每个点的锚点数量。
对于分类层,每个anchor输出两个预测值:anchor是背景(background,非object)的score和anchor是前景(foreground ,object)的score。
对于回归层,也可以叫边界框调整层,每个anchor输出4个预测值:即用于 anchors 来得到最终的 proposals.
根据最终的 proposal 坐标和其对应的 objectness score,即可得到良好的 objects proposals。
训练,目标和损失函数
RPN 有两种类型的预测值输出:二值分类和边界框回归调整。
训练时,对所有的 anchors 分类为两种类别. 与 ground-truth object 边界框的 Intersection over Union(IoU) 大于 0.5 的 anchors 作为 foreground;小于 0.1 的作为 background。
然后,随机采样 anchors 来生成batchsize=256 的 mini-batch,尽可能的保持 foreground 和 background anchors 的比例平衡。
RPN 对 mini-batch 内的所有 anchors 采用 binary cross entropy 来计算分类 loss. 然后,只对 mini-batch 内标记为 foreground 的 anchros 计算回归 loss. 为了计算回归的目标targets,根据 foreground anchor 和其最接近的 groundtruth object,计算将 anchor 变换到 object groundtruth 的偏移值 correctΔ.
Faster R-CNN 没有采用简单的 L1 或 L2 loss 用于回归误差,而是采用 Smooth L1 loss. Smooth L1 和 L1 基本相同,但是,当 L1 误差值非常小时,表示为一个确定值 σσ, 即认为是接近正确的,loss 就会以更快的速度消失.
采用动态 batches 是很有挑战性的. 即使已经尝试保持 background 和 foreground 的 anchors 的平衡比例,也不总是可行的. 根据图片中 groundtruth objects 和 anchors 的尺度与比例,很有可能得不到 foreground anchors. 这种情况时,将采用与 groundtruth boxes 具有最大 IoU 的 anchors. 这与理想情况相差很远,但实际中一般总能有 foreground 样本和要学习目标。
后处理
非极大值抑制(Non-maximum suppression)
由于 Anchors 一般是有重叠的overlap,因此,相同 object 的 proposals 也存在重叠.
为了解决重叠 proposals 问题,采用 NMS 算法处理,丢弃与一个score 更高的 proposal 间 IoU 大于预设阈值的 proposals.
虽然 NMS 看起来比较简单,但 IoU 阈值的预设需要谨慎处理. 如果 IoU 值太小,可能丢失 objetcs 的一些 proposals;如果 IoU 值过大,可能会导致 objects 出现很多 proposals. IoU 典型值为 0.6.
Proposal 选择
NMS 处理后,根据 sore 对 topNtopN 个 proposals 排序. 在 Faster R-CNN 论文中 N=2000N=2000,其值也可以小一点,如 50,仍然能的高好的结果.
单独应用RPN
RPN 可以独立使用,不用 2-stage 模型.
当处理的问题是,单个 object 类时,objectness 概率即可作为最终的类别概率. 此时,“foreground” = “single class”,“background”=“not single class”.
可以应用于人脸检测(face detection),文字检测(text detection),等.
仅单独采用 RPN 的优点在于,训练和测试速度较快. 由于 RPN 是仅有卷积层的简单网络,其预测效率比采用分类 base 网络的效率高.
Rol Pooling
RPN 处理后,可以得到一堆没有 class score 的 object proposals.
待处理问题为,如何利用这些边界框 bounding boxes,并分类.
一种最简单的方法是,对每个 porposal,裁剪,并送入pre-trained base 网络,提取特征;然后,将提取特征来训练分类器. 但,这就需要对所有的 2000 个 proposals 进行计算,效率低,速度慢.
Faster R-CNN 则通过重用卷积特征图(conv feature map) 来加快计算效率. 即,采用 RoI(region of interest) Pooling 对每个 proposal 提取固定尺寸的特征图. R-CNN 是对固定尺寸的特征图分类.
目标检测中,包括 Faster R-CNN,常用一种更简单的方法,即:采用每个 proposal 来对卷积特征图裁剪crop,然后利用插值算法(一般为双线性插值 bilinear)将每个 crop resize 到固定尺寸 。裁剪后,利用2*2 Kernel的Max Pooling得到每个proposal的最终特征图。
R-CNN-Region-based CNN
R-CNN 是 Faster R-CNN 框架中的最后一个步骤.
- 计算图片的卷积特征图conv feature map;
- 然后采用 RPN 对卷积特征图处理,得到 object proposals;
- 再利用 RoI Pooling 对每个 proposal 提取特征;
- 最后,利用提取特征进行分类.
R-CNN 是模仿分类 CNNs 的最后一个阶段,采用全连接层来输出每个可能的 object 类别class 的score.
R-CNN 有两个不同的输出:
- 对每个 proposal 分类,其中类别包括一个 background 类(用于去除不良 proposals);
- 根据预测的类别class,更好的调整 proposal 边界框.
在Faster R-CNN论文中,R-CNN 对每个 proposal 的特征图,拉平flatten,并采用 ReLU 和两个大小为 4096 维的全连接层进行处理。
然而,对每个不同objects采用两个不同的全连接层处理
- 一个全连接层有 N+1个神经单元,其中 N是类别 class 的总数,包括 background class;
- 一个全连接层有4N个神经单元,回归预测输出,得到N个可能的类别classes分别预测
训练和目标
R-CNN 的目标基本上是与 RPN 目标的计算是一致的,但需要考虑不同的可能的 object 类别 classes.
根据 proposals 和 ground-truth boxes,计算其 IoU.
与任何一个 ground-truth box 的 IoU 大于 0.5 的 proposals 被设为正确的 boxes. IoU 在 0.1 到 0.5 之间时设为 background.
与 RPN 中目标组装相关,这里忽略没有任何交叉的 proposals. 这是因为,在此阶段,假设已经获得良好的 proposals,主要关注于解决难例. 当然,所有的这些超参数都是可以用于调整以更好的拟合 objects.
边界框回归的目标计算的是 proposal 与其对应的 ground-truth间的偏移量,只对基于 IoU 阈值设定类别class 后的 proposals 进行计算.
随机采用一个平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有类别class) 和 75% 的background proposals.
类似于 RPNs 的 losses,对于选定的 proposals,分类 loss 采用 multiclass entropy loss;对于 25% 的 foreground proposals 采用 SmoothL1 loss 计算其与 groundtruth box 的匹配.
由于 R-CNN 全连接网络对每个类别class 仅输出一个预测值,当计算边框回归loss 时需谨慎. 当计算 loss 时,只需考虑正确的类别.
后处理
类似于 RPN,R-CNN 最终输出一堆带有类别 class 的objects,在返回结果前,再进一步进行处理.
为了调整边界框,需要考虑概率最大的类别的 proposals. 忽略概率最大值为 background class 的proposals.
当得到最终的 objects 时,并忽略被预测为 background 的结果,采用 class-based NMS. 主要是通过对 objects 根据类别class 分组,然后根据概率排序,并对每个独立的分组采用 NMS 处理,最后再放在一起.
最终得到的 objects 列表,仍可继续通过设定概率阈值的方式,来限制每个类的 objects 数量.
Faster R-CNN 训练
Faster R-CNN 在论文中是采用分步 multi-step 方法,对每个模块分别训练再合并训练的权重. 自此,End-to-end 的联合训练被发现能够得到更好的结果.
当将完整的模型合并后,得到 4 个不同的 losses,2 个用于 RPN,2 个用于 R-CNN. RPN 和 R-CNN 的base基础网络可以是可训练(fine-tune)的,也可以是不能训练的.
base基础网络的训练与否,取决于待学习的objects与可用的计算力. 如果新数据与 base基础网络训练的原始数据集相似,则不必进行训练,除非是想尝试其不同的表现. base基础网络的训练是比较时间与硬件消耗较高,需要适应梯度计算.
4 种不同的 losses 以加权和的形式组织. 可以根据需要对分类 loss 和回归 loss 设置权重,或者对 R-CNN 和 RPNs 设置不同权重.
采用 SGD 训练,momentum=0.9. 学习率初始值为 0.001,50K 次迭代后衰减为 0.0001. 这是一组常用参数设置
采用 Luminoth 训练时,直接采用默认值开始。
评价
评价准则:指定 IoU 阈值对应的 Mean Average Precision (mAP),如 mAP@0.5.
mAP 来自信息检索,常用与计算 ranking 问题的误差计算,以及评估目标检测结果.
总结
至此,对 Faster R-CNN 的处理方式有了清晰的理解,可以根据实际应用场合来做一些应用.
如果想进一步深入理解,可以参考 Luminoth Faster R-CNN 实现.
Faster R-CNN 可以用于解决复杂的计算机视觉问题,并取得很好的效果. 虽然这里模型是目标检测,但对于语义分割,3D目标检测等,都可以基于以上模型. 或借鉴于 RPN,或借鉴于 R-CNN,或两者都有. 因此,能够深度理解其工作原理,对于更好的解决其它问题很有帮助.
参考:https://zhuanlan.zhihu.com/p/24916624
https://blog.csdn.net/zziahgf/article/details/79311275