我们花了大约很多篇的内容来讲 CNN 卷积神经网络和相关的图像分类经典网络等。但图像分类仅仅是我们入门计算机视觉的第一个任务。作为计算机视觉的三大核心任务——图像分类、目标检测和图像分割,后面两大任务还有着更多的内容等待我们探索和学习。以下图为例:
从图中我们可以简单描述下计算机视觉三大任务的要义:图像分类就是要回答这张图像是一只猫的问题,目标检测则不仅需要回答图像中有什么,而且还得给出这些物体在图像中位置问题,以图中为例就是不仅要识别图中的阿猫阿狗,还得给出阿猫阿狗的具体定位。而图像分割则是需要实现像素级的图像分割,以图中为例就是要把每个物体以像素级的标准分割开来,这对算法的要求则更高。
从本节开始,笔者将花费数讲的时间对计算机视觉的第二大任务——目标检测进行一个全面细致的学习和讲解。既是对前面的 CNN 图像分类的内容延伸,也是继续深入研究图像算法的必走之路。在正式的学习各类目标检测算法之前,本节将首先对影响目标检测算法发展历史的主要算法进行一个综述,以期对后面的内容起到一个提纲挈领的作用。
在 2012 年深度学习正式介入计算机视觉目标检测任务之前,传统的目标检测算法一直是以滑动窗口卷积等较为传统的方式进行区域选择、特征提取和分类回归等步骤,例如在深度学习兴起之前目标检测领域较为优秀的可变形的组件模型(DPM)方法等。
在深度学习兴起并逐渐成为计算机视觉的核心方法之后,基于深度学习算法的一系列目标检测算法大致可以分为两大流派:
两步走(two-stage)算法:先产生候选区域然后再进行CNN分类(RCNN系列)
一步走(one-stage)算法:直接对输入图像应用算法并输出类别和相应的定位(yolo系列)
无论是两步走还是一步走算法,它们都是在识别的快和准两点上寻找一个平衡点和或者极端点。要么准要么快,但随着深度学习和计算机视觉的向前发展,既快有准的算法也在逐渐的实现当中。
本节就以目标检测这两大流派的目标检测算法进行简单的介绍。
两步走(two-stage)算法系列:
R-CNN
R-CNN 作为将深度学习引入目标检测算法的开山之作,在目标检测算法发展历史上具有重大意义。R-CNN 算法是两步走方法的代表,即先生成候选区域(region proposal),然后再利用 CNN 进行识别分类。由于候选框对于算法的成败起着关键作用,所以该方法就以 Region 开头首字母 R 加 CNN 进行命名。
相较于传统的滑动卷积窗口来判断目标的可能区域,R-CNN 采用 selective search 的方法来预先提取一些较可能是目标物体的候选区域,速度大大提升,计算成本也显著缩小。总体而言,R-CNN 方法分为四个步骤:
生成候选区域
对候选区域使用CNN进行特征提取
将提取的特征送入SVM分类器
最后使用回归器对目标位置进行修正
虽然 R-CNN 在 2013年的当时可谓横空出世,但也存在许多缺陷:selective search 方法生成训练网络的正负样本候选区域在速度上非常慢,影响了算法的整体速度;CNN 需要分别对每一个生成的候选区域进行一次特征提取,存在着大量的重复运算,制约了算法性能。
论文:Rich feature hierarchies for accurate object detection and semantic segmentation
SPP-Net
针对 R-CNN 的问题,提出 ResNet 的何恺明大佬提出了 SPP-Net。该算法通过在网络的卷积层和全连接层之间加入空间进字体池化层(Spatial Pyramid Pooling)来对利用 CNN 进行卷积特征提取之前的候选区域进行裁剪和缩放使 CNN 的输入图像尺寸一致。
空间金字塔池化解决了输入候选区域尺寸不一致的问题,但更重要的意义在于减少了 R-CNN 中的重复计算,大大提高的算法的速度和性能。
SPP-Net 的缺点在于经过空间金字塔层的处理后,虽然 CNN 的输入尺寸一致了,但候选框的感受野因而也变得很大,使得卷积神经网络在训练时无法有效更新模型权重。
论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
Fast R-CNN
针对 SPP-Net 的问题,2015年微软研究院在借鉴了 SPP-Net 的空间金字塔层的基础之上,对 R-CNN 算法进行了有效的改进。
Fast R-CNN 的结构如上图所示。Fast R-CNN 的改进之处在于设计了一种 ROI Pooling 的池化层结构,有效解决了 R-CNN 算法必须将图像区域剪裁、缩放到相同尺寸大小的操作。提出了多任务损失函数,每一个 ROI 都有两个输出向量:softmax 概率输出向量和每一类的边界框回归位置向量。
Fast R-CNN 虽然借鉴了 SPP-Net 的思想,但对于 R-CNN 的 selective search 的候选框生成方法依然没做改进,这使得 Fast R-CNN 依然有较大的提升空间。
论文:Fast R-CNN
Faster R-CNN
为了解决从 R-CNN 就遗留下来的候选框生成问题,R-CNN 系列的几个作者大佬一起提出了 Faster R-CNN 方法。Faster R-CNN 的关键在于设计了 RPN(Region Proposal Network)区域候选网络,将候选框的选择和判断交给 RPN 进行处理,将 RPN 处理之后的候选区域进行基于多任务损失的分类定位。Faster R-CNN 的优点在于 CNN 提取的特征信息能够做到全网络的权值共享,解决了之前的大量候选框导致的速度慢的问题。但是由于RPN网络可在固定尺寸的卷积特征图中生成多尺寸的候选框,导致出现可变目标尺寸和固定感受野不一致的情况。
论文:
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Mask R-CNN
到了 2017 年,何恺明等大佬再度发威,在之前的基础上继续改善 R-CNN 算法,提出了 Mask R-CNN 算法。Mask R-CNN 的整体架构如图所示:
Mask R-CNN 将 Fast R-CNN 的 ROI Pooling 层升级成了 ROI Align 层,并且在边界框识别的基础上添加了分支FCN层,即mask层,用于语义 Mask 识别,通过 RPN 网络生成目标候选框,然后对每个目标候选框分类判断和边框回归,同时利用全卷积网络对每个目标候选框预测分割。Mask R-CNN 本质上一个实例分割算法(Instance Segmentation),相较于语义分割(Semantic Segmentation),实例分割对同类物体有着更为精细的分割。Mask R-CNN 在 coco 测试集上的图像分割效果如下:
论文:Mask R-CNN
以上便是两步走目标检测算法的大致发展历程和简单概述。两步走目标检测算法历经了:
R-CNN—SPP-Net—Fast R-CNN—Faster R-CNN—Mask R-CNN
当然,其间有大量学者对两步走的目标检测网络进行了更多更丰富的改进,笔者只是选取主要的有代表性的论文和网络进行简单介绍。两步走暂告一段落,我们继续来看一步走的目标检测算法。
一步走(one-stage)算法系列:
纵然两步走的目标检测算法在不断进化,检测准确率也越来越高,但两步走始终存在的速度的瓶颈。在一些实时的目标检测需求的场景中,R-CNN 系列算法终归是有所欠缺。因而一步走(one-stage)算法便应运而生了,其中以 yolo 算法系列为代表,演绎了一种端到端的深度学习系统的实时目标检测效果。yolo 算法系列的主要思想就是直接从输入图像得到目标物体的类别和具体位置,不再像 R-CNN 系列那样产生候选区域。这样做的直接效果便是快。
yolo v1
yolo v1 算法的核心思想就是将整张图像作为网络的输入,直接在网络的输出层输出目标物体的类别和边界框的具体位置坐标。yolo v1 将输入图像划分为 S*S 的网格(grid),每个网格预测两个边界框,如果目标物体落入相应的网格中,该网格就负责检测出该目标物体。
由论文可知 yolo v1 算法的三个步骤:缩放图像-运行卷积网络-非极大值抑制。
yolo v1 虽然快,但缺点也明显:由于一个网格只能预测两个边界框,这使得yolo v1 对于密集很小的物体检测效果并不好,时常在定位上出现较大的偏差,此外 yolo v1 也存在着泛化性能较弱等问题。
论文:You Only Look Once: Unified, Real-Time Object Detection
SSD
针对 yolo v1 的定位不够准确的问题,2016年底提出的 SSD 算法(Single shot Multibox Detector)的解决方案在于将 yolo 的边界框回归方法和 Faster R-CNN 的 anchor boxes 机制结合起来,通过在不同卷积层的特征图上预测目标物体区域,输出为具备不同的 aspect ratio 的离散化的多尺度多比例的边界框坐标。这些改进使得 SSD 能够在输入分辨率较低的图像时也能保证检测的精度。这也使得 SSD 的检测准确率超过了此前的 yolo v1。
论文:SSD: Single Shot MultiBox Detector
yolo v2 / yolo 9000
针对 yolo v1 的定位不准确问题,yolo v2 重点对此问题给出了解决方案:使用 Darknet-19作为预训练网络,增加了 BN(Batch Normalization)层,提出了一种新的训练方法——联合训练算法,这种算法可以把这两种的数据集混合到一起。使用一种分层的观点对物体进行分类,用大量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来。另一方面,相较于 yolo v1 直接用全连接层预测边界框坐标,yolo v2 则是借鉴了R-CNN 中的 anchor boxes,使用Anchor Box会让精确度稍微下降,但用了它能让YOLO能预测出大于一千个框,同时recall达到88%,mAP达到69.2%。
yolo 9000 的检测效果:
论文:YOLO9000: Better, Faster, Stronger
yolo v3
为了在保证速度的同时实现更高的定位准确率,yolo v3 采用了更为复杂的网络结构。相较于此前的网络,yolo v3 的改进之处包括多尺度预测(FPN)、更复杂的网络的结构Darknet53、取消 softmax 作为候选框分类,这些都使得 yolo v3 的速度更快,准确率也有相应提高。与需要数千张单一目标图像的 R-CNN 不同,yolo v3 通过单一网络评估进行预测。这使得 YOLOv3 非常快,同等条件下它比 R-CNN 快 1000 倍、比 Fast R-CNN 快 100 倍。yolo v3 与各算法的速度对比:
论文:YOLOv3: An Incremental Improvement
以上便是一步走目标检测算法的大致发展历程和简单概述。一步走目标检测算法历经了:
yolo v1—SSD—yolo v2 / yolo 9000 —yolo v3
R-CNN 系列和 yolo 系列部分算法的检测精度比较:
总而言之,随着深度学习在计算机视觉领域的不断发展,目标检测算法的两大流派之间也在不断的借鉴和相互改进中,无论使用哪种检测算法,最后都要在速度和精度之间找到一个最好的平衡。
参考资料:
Rich feature hierarchies for accurate object detection and semantic segmentation
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
Fast R-CNN
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Mask R-CNN
You Only Look Once: Unified, Real-Time Object Detection
SSD: Single Shot MultiBox Detector
YOLO9000: Better, Faster, Stronger
YOLOv3: An Incremental Improvement
https://zhuanlan.zhihu.com/p/33277354
往期精彩:
一个数据科学从业者的学习历程