看了这篇文章,了解深度卷积神经网络在目标检测中的进展

jopen 8年前
   <p style="text-align: center;"><a href="/misc/goto?guid=4958190462259388048" title="程序员"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/a08e318ff2ebc4ad30d5e6ff0cd93701.jpg" /></a></p>    <p>近些年来,深度卷积神经网络(DCNN)在图像分类和识别上取得了很显著的提高。回顾从 2014 到 2016 这两年多的时间,先后涌现出了 R-CNN,Fast R-CNN, Faster R-CNN, ION, HyperNet, SDP-CRC, YOLO,G-CNN, SSD 等越来越快速和准确的目标检测方法。</p>    <p><strong>1. 基于 Region Proposal 的方法</strong></p>    <p>该类方法的基本思想是:先得到候选区域再对候选区域进行分类和边框回归。 </p>    <p><strong>1. 1 R-CNN<sup>[1]</sup></strong></p>    <p>R-CNN 是较早地将 DCNN 用到目标检测中的方法。其中心思想是对图像中的各个候选区域先用 DCNN 进行特征提取并使用一个 SVM 进行分类,分类的结果是一个初略的检测结果,之后再次使用 DCNN 的特征,结合另一个 SVM 回归模型得到更精确的边界框。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/181015f8d5736f3f112117da9c416f4b.jpg" /></p>    <p>其中获取候选区域的方法是常用的 selective search。 一个图形中可以得到大约 2000 个不同大小、不同类别的候选区域,他们需要被变换到同一个尺寸以适应 CNN 所处理的图像大小(227x227)。</p>    <p>该文章中使用的 CNN 结构来自 AlexNet, 已经在 ImageNet 数据集上的 1000 个类别的分类任务中训练过,再通过参数微调使该网络结构适应该文章中的 21 个类别的分类任务。</p>    <p>该方法在 VOC 2011 test 数据集上取得了 71.8% 的检测精度。该方法的缺点是:1,训练和测试过程分为好几个阶段:得到候选区域,DCNN 特征提取, SVM 分类、SVM 边界框回归,训练过程非常耗时。2,训练过程中需要保存 DCNN 得到的特征,很占内存空间。3, 测试过程中,每一个候选区域都要提取一遍特征,而这些区域有一定重叠度,各个区域的特征提取独立计算,效率不高,使测试一幅图像非常慢。</p>    <p><strong>1. 2 Fast R-CNN<sup>[2] </sup></strong></p>    <p>在 R-CNN 的基础上,为了使训练和测试过程更快,Ross Girshick 提出了 Fast R-CNN,使用 VGG19 网络结构比 R-CNN 在训练和测试时分别快了 9 倍和 213 倍。其主要想法是: 1, 对整个图像进行卷积得到特征图像而不是对每个候选区域分别算卷积;2,把候选区域分类和边框拟合的两个步骤结合起来而不是分开做。原理图如下:</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/43f26def167663a609a7809e199ea807.jpg" /></p>    <p>该文章中使用 ROI Pooling Layer 将不同大小的候选区域的特征转化为固定大小的特征图像,其做法是:假设候选区域 ROI 的大小为, 要输出的大小为, 那么就将该 ROI 分成 个格子,每一个格子的大小为, 然后对每一格子使用 max-pooling 得到目标大小的特征图像。</p>    <p>候选区域的分类和边框拟合的结合是通过一个双任务的网络结构:使用两个全连接的输出层分别进行类别预测和边框预测 (如上图所示),将这两个任务进行同时训练,利用一个联合代价函数:</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/8ed7e2e69531cecec057e0ddb766a788.jpg" /></p>    <p>公式中的两项分别是 classification loss 和 regression loss。该方法相比于 R-CNN 快了不少。特别是在测试一幅新图像时,如果不考虑生成候选区域的时间,可以达到实时检测。生成候选区域的 selective search 算法处理一张图像大概需要 2s 的时间,因此成为该方法的一个瓶颈。</p>    <p><strong>1. 3 Faster R-CNN<sup>[3]</sup></strong></p>    <p>上面两种方法都依赖于 selective search 生成候选区域,十分耗时,那么可不可以直接利用卷积神经网络得到候选区域呢?这样的话就几乎可以不花额外的时间代价就能得到候选区域。</p>    <p>Shaoqing Ren 提出了 Faster R-CNN 来实现这种想法:假设有两个卷积神经网络,一个是区域生成网络,得到图像中的各个候选区域,另一个是候选区域的分类和边框回归网路。这两个网络的前几层都要计算卷积,如果让它们在这几层共享参数,只是在末尾的几层分别实现各自的特定的目标任务,那么对一幅图像只需用这几个共享的卷积层进行一次前向卷积计算,就能同时得到候选区域和各候选区域的类别及边框。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/37856587f13b5d6a709e6a79c29f9bec.jpg" /></p>    <p>候选区域生成网络(Region Proposal Network, RPN)方法的原理图如上,先通过对输入图像的数层卷积得到一个特征图像,然后在特征图像上生成候选区域,做法是使用一个(3)的滑动窗口,将局部的特征图像转换成一个低维特征, 预测个的区域(cls 层,个输出)是否为候选区域和对应的个边框(reg 层,个输出)。这里的个区域被称为锚(anchor), 对应着与滑动窗口具有相同的中心的不同大小和不同长宽比的矩形框。假设卷积后的特征图像大小为, 那么一共有个锚。这种特征提取和候选区域生成的方法具有位移不变性。</p>    <p>使用 RPN 得到候选区域后,对候选区域的分类和边框回归仍然使用 Fast R-CNN。这两个网络使用共同的卷积层。 由于 Fast R-CNN 的训练过程中需要使用固定的候选区域生成方法,不能同时对 RPN 和 Fast R-CNN 使用反向传播算法进行训练。该文章使用了四个步骤完成训练过程:1,单独训练 RPN;2,使用步骤中 1 得到的区域生成方法单独训练 Fast R-CNN; 3, 使用步骤 2 得到的网络作为初始网络训练 RPN。4, 再次训练 Fast R-CNN, 微调参数。</p>    <p>Faster R-CNN 的精度和 Fast R-CNN 差不多,但是训练时间和测试时间都缩短了 10 倍。</p>    <p><strong>1. 4 ION: Inside-Outside Net<sup>[4]</sup></strong></p>    <p>ION 也是基于 Region Proposal 的,在得到候选区域的基础上,为了进一步提高在每一个候选感兴趣区域 ROI 的预测精度,ION 考虑了结合 ROI 内部的信息和 ROI 以外的信息,有两个创新点:一是使用空间递归神经网络(spatial recurrent neural network)把上下文(context)特征结合,而不是只使用 ROI 内的局部特征 ,二是将不同卷积层得到的特征连接起来,作为一个多尺度特征用来预测。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/5ed5149f08f7ce238f945a03a7b1888a.jpg" /></p>    <p>ION 在上、下、左、右四个方向独立地使用 RNN,并把它们的输出连接起来组合成一个特征输出,经过两次这样的过程得到的特征作为上下文特征,再与之前的几个卷积层的输出特征连接起来,得到既包括上下文信息,又包括多尺度信息的特征。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/3850c14848ac9a94bc2b687e7d5fd4b1.jpg" /></p>    <p><strong>1. 5 HyperNet<sup>[5]</sup></strong></p>    <p>HyperNet 在 Faster R-CNN 的基础上,在得到更好的候选区域方面比 Faster R-CNN 中使用的 RPN 有了进一步的提高。其想法也是把不同卷积层得到的特征图像结合起来,产生更好的 region proposal 和检测准确率。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/f509788ca5cf6c800119066c9baca8e1.jpg" /></p>    <p>该文章把不同卷积层的输出结合起来得到的特征成为 Hyper Feature。由于不同卷积层的输出大小不一样,较浅层的特征图像分辨率较高,对提高边界框的精确性有益,但是容易对边界框内的物体错误分类;较深层得到的特征图像分辨率很低,对小一些的物体的边界框定位容易不准确,但这些特征更加抽象,可以让对物体的分类的准确性更高。因此二者的结合,对目标检测的正确率和定位精度都有帮助。</p>    <p><strong>1. 6 SDP-CRC<sup>[6]</sup></strong></p>    <p>SDP-CRC 在处理不同尺度的目标和提高对候选区域的计算效率上提出了两个策略。第一个策略是基于候选区域尺度的池化,即 Scale Department Pooling (SDP)。在 CNN 的框架中,由于输入图像要经过多次卷积,那些尺寸小的物体在最后一层的卷积输出上的特征不能很好的描述该物体。如果用前面某一层的特征,则能够更好的描述小物体,用靠后的层的特征,则能更好地描述较大的物体。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/b64d26fee42d1e17aea6112bdfa2fa6a.jpg" /></p>    <p>因此 SDP 的想法是根据物体大小选择合适的卷积层上的特征来描述该物体。例如一个候选区域的高度在 0-64 个像素之间,则使用第三个卷积层上 (例如 VGG 中的 Conv3) 的特征进行 pooling 作为分类器和边框回归器的输入特征,如果候选区域高度在 128 个像素以上,则使用最后一个卷积层 (例如 VGG 中的 Conv5) 的特征进行分类和回归。</p>    <p>第二个策略是使用舍弃负样本的级联分类器,即 Cascaded Rejection Classifer, CRC。Fast RCNN 的一个瓶颈是有很多的候选区域,对成千上万个候选区域都进行完整的分类和回归计算十分耗时。CRC 可以用来快速地排除一些明显不包含某个物体的候选区域,只将完整的计算集中在那些极有可能包含某个物体的候选区域。该文章中使用了 AdaBoost 的方法,按顺序使用每一个卷积层的特征,由一些级联的弱分类器来排除负样本。在最后一层卷积的特征图像上,留下来的那些候选区域再进行分类和回归。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/ab1ffe98971d3281a3339324e82e3ec9.jpg" /></p>    <p>SDP-CRC 的准确率比 Fast RNN 提高了不少,检测时间缩短到了 471ms 每帧。</p>    <p><strong>2. 不采用 Region Propsal, 直接预测边界框的方法</strong></p>    <p><strong>2. 1 YOLO<sup>[7]</sup></strong></p>    <p>YOLO 的思想是摒弃生成候选区域的中间步骤,通过单个卷积神经网络直接对各个边界框进行回归并且预测相应的类别的概率。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/e478bfb36a0cdb11a8b8050ffc948da1.jpg" /></p>    <p>该方法将输入图像分成大小的网格。每一个网格单元预测 B 个边界框和这些边界框的可信度,有五个预测值:边界框的中心相对于网格单元中心的坐标,边界框相对于整个图像的宽和高,还有该边界框的可信度(基于和 ground truth 之间的 IoU)。每一个单元格还预测该单元格属于个类别的概率,因此整个网络的输出是一个大小为的张量。在实验中,,因此输出的大小是。</p>    <p>在测试阶段,单元格的类别概率与该单元格的 B 个边界框的可信度相乘,得到各个边界框分别包含各个类别的物体的可信度。</p>    <p>YOLO 的优点是速度快,该文章中使用的 24 层卷积网络在测试图像上可达到 45 帧每秒,而使用另一个简化的网络结构,可达到 155 帧每秒。该方法的缺点有:1, 边界框的预测有很大的空间限制,例如每一个单元格只预测两个边界框,并且只有一个类别。2,该方法不能很好地检测到成群出现的一些小的目标,比如一群鸟。3,如果检测目标的长宽比在训练数据中没有出现过或者不常见,该模型的泛化能力较弱。</p>    <p><strong>2. 2 G-CNN<sup>[8]</sup></strong></p>    <p>G-CNN 将目标检测问题看作是把检测框从一些固定的网格逐渐变化到物体的真实边框的问题。 这是一个经过几次迭代,不断更新的过程。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/b3ee35fcb2356dde549eaa66dc00ccf4.jpg" /></p>    <p>其原理图如上所示,初始检测框是对整个图像进行不同尺度的网格划分得到的,在经过卷积后得到物体的特征图像,将初始边框对应的特征图像通过 Fast R-CNN 中的方法转化为一个固定大小的特征图像,通过回归得到更加准确的边框,再次将这个新边框作为初始边框,做新的一次迭代。经过若干次迭代后的边框作为输出。</p>    <p>G-CNN 中使用约 180 个初始边框,经过 5 次迭代, 检测帧率在 3fps 左右,准确率比 Fast R-CNN 要好一些。 </p>    <p><strong>2. 3 SSD<sup>[9]</sup></strong></p>    <p>SSD 也是使用单个的卷积神经网络对图像进行卷积后,在特征图像的每一个位置处预测一系列不同尺寸和长宽比的边界框。在测试阶段,该网络对每一个边界框中分别包含各个类别的物体的可能性进行预测,并且对边界框进行调整以适应目标物体的形状。</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/a6957f1af3a2e9075b41c8e225550241.jpg" /></p>    <p>SSD 在训练时只需要一幅输入图像和该图像中出现的物体的边界框。在不同的卷积层输出是不同尺度的特征图像(如上图中的和),在若干层的特征图像上的每一个位置处, 计算若干个(如 4 个)默认边界框内出现各个目标物体的置信度和目标物体的真实边界框相对于默认边界框的偏差。因此对于大小为的特征图像,共产生个输出。这有点类似于 Faster R-CNN 中的锚的概念,但是将这个概念用到了不同分辨率的特征图像上。SSD 和 YOLO 的对比如下图:</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/da3a2b4e3988e8f148f1163365c5eb1b.jpg" /></p>    <p>在 VOC 2007 测试图像上,对于 300300 大小的输入图像,SSD 可达到 72.1% mAP 的准确率,速度为 58 帧每秒,且能预测 7k 以上个边界框,而 YOLO 只能预测 98 个。下图是上述几个算法在性能上的对比:</p>    <p style="text-align:center"><img alt="看了这篇文章,了解深度卷积神经网络在目标检测中的进展" src="https://simg.open-open.com/show/b1cc6ffdd321868d887d40e20a751160.jpg" /></p>    <p><strong>参考文献</strong></p>    <p>[1] Girshick, Ross, et al. "<a href="/misc/goto?guid=4959007229018772598" rel="nofollow">Rich feature hierarchies for accurate object detection and semantic segmentation.</a>" CVPR 2014.</p>    <p>[2] Girshick, Ross. "<a href="/misc/goto?guid=4959007229116174794" rel="nofollow">Fast r-cnn.</a>" ICCV2015.</p>    <p>[3] Ren, Shaoqing, et al. <a href="/misc/goto?guid=4959007229233487140" rel="nofollow">"Faster R-CNN: Towards real-time object detection with region proposal networks.</a>" Advances in neural information processing systems. 2015.</p>    <p>[4] Bell, Sean, et al. "<a href="/misc/goto?guid=4959007229327711528" rel="nofollow">Inside-outside net: Detecting objects in context with skip pooling and recurrent neural networks.</a>" arXiv preprint arXiv:1512.04143 (2015).</p>    <p>[5] Kong, Tao, et al. "<a href="/misc/goto?guid=4959007229425446495" rel="nofollow">HyperNet: Towards Accurate Region Proposal Generation and Joint Object Detection.</a>" arXiv preprint arXiv:1604.00600 (2016).</p>    <p>[6] Yang, Fan, Wongun Choi, and Yuanqing Lin. "<a href="/misc/goto?guid=4959007229517409443" rel="nofollow">Exploit all the layers: Fast and accurate cnn object detector with scale dependent pooling and cascaded rejection classifiers.</a>" CVPR 2016.</p>    <p>[7] Redmon, Joseph, et al. "<a href="/misc/goto?guid=4959007229605022832" rel="nofollow">You only look once: Unified, real-time object detection.</a>" arXiv preprint arXiv:1506.02640 (2015).</p>    <p>[8] Najibi, Mahyar, Mohammad Rastegari, and Larry S. Davis. "<a href="/misc/goto?guid=4959007229691606400" rel="nofollow">G-CNN: an Iterative Grid Based Object Detector.</a>" arXiv preprint arXiv:1512.07729 (2015).</p>    <p>[9] Liu, Wei, et al. "<a href="/misc/goto?guid=4959007229789051582" rel="nofollow">SSD: Single Shot MultiBox Detector.</a>" arXiv preprint arXiv:1512.02325 (2015).</p>    <p>雷锋网按:原作者 <a href="/misc/goto?guid=4959007229879377693" rel="nofollow">taigw</a>,本文原载于<a href="/misc/goto?guid=4959007229976859396" rel="nofollow">知乎专栏</a>。</p>    <p>来自: <a href="/misc/goto?guid=4959007230055274879" id="link_source2">雷锋网</a></p>