社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

深度学习笔记 | 第7讲:CNN目标检测发家史之从R-CNN到yolo

狗熊会 • 6 年前 • 893 次点击  


大家好!又到了每周一狗熊会的深度学习时间了。在上一期的笔记分享中,小编和大家回归了卷积神经网络在图像分类和识别方面的发展历程,和大家梳理了经典的卷积网络结构,了解了卷积网络的发展脉络,我们从上个世纪经典的 LeNet-5 网络一直介绍到近年来的 ResNet。在本节内容中,小编将继续和大家介绍卷积神经网络在计算机视觉的第二大任务——目标检测中的发展历程和应用,对影响目标检测发展历史的经典网络和算法逐一进行简单介绍和概要。本期小编就和大家一起来看深度学习计算机视觉的第二大任务——目标检测。                                                                                            

1

目标检测概述

     正如下图中第二和第三幅小图所示,目标检测的任务描述起来十分简单:就是要让计算机不仅能够识别出输入图像中的目标物体,还要能够给出目标物体在图像中的位置。

正是说起容易做起难,看似让简单的任务描述,在计算机视觉的发展过程中可谓历经艰辛。在深度学习正式成为计算机视觉领域的主题之前,传统的手工特征图像算法一直是目标检测的主要方法。在早期计算资源不发达的背景下,研究人员的图像特征表达方法有限,只能尽可能的设计更加多元化的检测算法来进行弥补,包括早期的 SIFT 检测算法、HOG 检测算法和后来著名的 DPM 模型等。

目标检测发展历程

深度学习之前的早期目标检测算法的发展历程如上图左边浅蓝色部分所示,鉴于本篇要讲述的是CNN目标检测,对于深度学习之前的目标检测算法不再详述,感兴趣的同学可根据上述算法关键词逐一搜索相应的论文进行研读。

而 2013 年之后,神经网络和深度学习逐渐取代了传统的图像检测算法而成为目标检测的主流方法。纵观这几年的深度学习目标检测发展历程,基于深度学习算法的一系列目标检测算法大致可以分为两大流派:

  • 两步走(two-stage)算法:先产生候选区域然后再进行CNN分类(RCNN系列)

  • 一步走(one-stage)算法:直接对输入图像应用算法并输出类别和相应的定位(yolo系列)

深度学习目标检测发展历程

深度学习目标检测算法发展历程如上图所示,接下来小编就和大家一起分别从两步走和一步走算法两个方面来梳理目标检测算法的发展历程。

2

CNN目标检测算法

两步走(two-stage)算法系列
1
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

R-CNN Tensorflow 实现参考:https://github.com/yangxue0827/RCNN


2
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

SPP-Net Tensorflow 实现参考https://github.com/chengjunwen/spp_net

3
Fast-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

Fast R-CNN caffe 源码参考:https://github.com/rbgirshick/fast-rcnn

4
Faster-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

Faster R-CNN 源码参考:https://github.com/shaoqingren/faster_rcnn

5
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

mask rcnn Tensorflow参考:https://github.com/matterport/Mask_RCNN

以上便是两步走目标检测算法的大致发展历程和简单概述。两步走目标检测算法历经了:

R-CNN—SPP-Net—Fast R-CNN—Faster R-CNN—Mask R-CNN

当然,其间有大量学者对两步走的目标检测网络进行了更多更丰富的改进,笔者只是选取主要的有代表性的论文和网络进行简单介绍。两步走暂告一段落,我们继续来看一步走的目标检测算法。

一步走(one-stage)算法系列

纵然两步走的目标检测算法在不断进化,检测准确率也越来越高,但两步走始终存在的速度的瓶颈。在一些实时的目标检测需求的场景中,R-CNN 系列算法终归是有所欠缺。因而一步走(one-stage)算法便应运而生了,其中以 yolo 算法系列为代表,演绎了一种端到端的深度学习系统的实时目标检测效果。yolo 算法系列的主要思想就是直接从输入图像得到目标物体的类别和具体位置,不再像 R-CNN 系列那样产生候选区域。这样做的直接效果便是快。

1
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

yolo v1 pytorch参考:https://github.com/xiongzihua/pytorch-YOLO-v1

2
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

SSD Tensorflow 源码参考:https://github.com/balancap/SSD-Tensorflow

3
yolo v2/yolo9000

针对 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 9000 源码参考:https://github.com/philipperemy/yolo-9000

4
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 v3 源码参考:https://github.com/ayooshkathuria/pytorch-yolo-v3

以上便是一步走目标检测算法的大致发展历程和简单概述。一步走目标检测算法历经了:

 yolo v1—SSD—yolo v2 / yolo 9000 —yolo v3 

完整的深度学习目标检测算法概要如下图所示:

R-CNN 系列和 yolo 系列部分算法的检测精度比较:


总而言之,随着深度学习在计算机视觉领域的不断发展,目标检测算法的两大流派之间也在不断的借鉴和相互改进中,无论使用哪种检测算法,最后都要在速度和精度之间找到一个最好的平衡。

以上便是本期的主要内容。

本篇笔记小编和大家介绍了以深度学习为主导的计算机视觉目标检测算法的发展历程和基本概要。对两步走和一步走的目标检测算法框架有了基本的了解。对各个检测算法网络细节感兴趣和想要了解更多内容的朋友,不妨将这几篇论文一一找来仔细研读,这样对深度学习目标检测定有更深的理解和认识。这一期到这里就结束啦,咱们下期见!

                            


【参考资料】

https://www.deeplearning.ai/

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

Deep Learning for Generic Object Detection: A Survey

https://zhuanlan.zhihu.com/p/33277354


作者简介


鲁伟,狗熊会人才计划一期学员。目前在杭州某软件公司从事数据分析和深度学习相关的研究工作,研究方向为贝叶斯统计、计算机视觉和迁移学习。

识别二维码,查看作者更多精彩文章






识别下方二维码成为狗熊会会员!

友情提示:

个人会员不提供数据、代码

视频only!

个人会员网址:http://teach.xiong99.com.cn

点击“阅读原文”,成为狗熊会会员!

今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/SxGnLCkz39
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/24106
 
893 次点击