深度学习高手笔记 卷2:经典应用

978-7-115-60895-6
作者: 刘岩(@大师兄)
译者:
编辑: 孙喆思

图书目录:

详情

本书包含深度学习的经典应用场景,从算法原理、公式推导、算法源码、实验结果等方面对各场景的算法进行分析和介绍,重点讨论深度学习算法在目标检测与分割、场景文字检测与识别等方向的发展历程以及各算法的优缺点,并分析各算法是如何针对先前算法的若干问题提出解决方案的。 通过阅读本书,你将了解如下内容。 ***深度学习在目标检测与分割领域的前沿算法,包括双阶段检测、单阶段检测、无锚点检测、特征融合、损失函数、语义分割 6个方向的算法。 ***深度学习在场景文字检测与识别领域的重要突破,包括场景文字检测、场景文字识别这两个阶段的算法。 ***深度学习的其他应用领域的算法,包括图像翻译、图神经网络、二维结构识别、人像抠图图像预训练、多模态预训练 5个方向的算法。 ***算法中的数学原理,包括双线性插值、匈牙利算法、Shift-and-Stitch、德劳内三角化、图像梯度、仿射变换矩阵等。

图书摘要

版权信息

书名:深度学习高手笔记 卷2 经典应用

ISBN:978-7-115-60895-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

版  权

著    刘 岩(@大师兄)

责任编辑 孙喆思

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内容提要

本书通过扎实、详细的内容,从理论知识、算法源码、实验结果等方面对深度学习中涉及的算法进行分析和介绍。本书共三篇,第一篇主要介绍深度学习在目标检测与分割方向的前沿算法,包括双阶段检测、单阶段检测、无锚点检测、特征融合、损失函数、语义分割这6个方向;第二篇主要介绍深度学习在场景文字检测与识别方向的重要突破,主要介绍场景文字检测、场景文字识别这两个阶段的算法;第三篇主要介绍深度学习的其他算法与应用,包括图像翻译、图神经网络、二维结构识别、人像抠图、图像预训练、多模态预训练这6个方向的算法。附录部分介绍双线性插值、匈牙利算法、Shift-and-Stitch、德劳内三角化、图像梯度、仿射变换矩阵等内容。

本书结构清晰,内容广度与深度齐备。通过阅读本书,读者可以了解前沿的深度学习算法,扩展自己的算法知识面。无论是从事深度学习科研的教师及学生,还是从事算法落地实践的工作人员,都能从本书中获益。

序1

60年前,人工智能(artificial intelligence,AI)萌芽,深度学习的种子也是在那时被播种开来。传统的AI简单来说就是模仿人类来执行任务,并且基于收集的信息对自身进行改进的系统。AI近年来发展迅速、应用广泛。例如,聊天机器人可高速地处理客户的问题并给出理想的答案,推荐引擎可以根据客户的信息和历史行为推荐合适的商品等。在不少人看来,AI意味着高度发达的类人机器取代人类大部分工作,辅助人类提升人的能力以及生产、效率。例如,哈佛商业评论曾称,得益于文本生成类的AI,美国联合通讯社(简称美联社)将新闻报道量提升了13倍,这使得专业记者可以将精力集中在更具深度的文章。

为了充分发挥AI的价值,全球科技巨头纷纷拥抱深度学习,因为自动驾驶、智能医疗、人脸识别、机器翻译,以及震惊世界的AlphaGo,背后的核心技术都是深度学习。现如今,得益于大数据和计算机算力的不断发展,AI正成为企业创新的基石。例如,西奈山伊坎医学院构建的一个AI工具Deep Patient,通过分析患者的病史,能够在患者发病前预测将近80种疾病,极大提高了诊断效率。如果一个企业想要获得更高效率、发现新的机遇,那么AI便是一个发展要务。同时,对每个个体来说,能够掌握前沿的AI知识,将成为你在未来几年乃至几十年最核心的竞争力。

有幸阅读过《深度学习高手笔记 卷2:经典应用》(简称卷1),可以看出作者对深度学习有着广泛的涉猎以及独到的见解。本书是继卷1之后对深度学习进一步的探索和分析,对比卷1,本书的内容从广度、深度以及前沿性上都更进了一步。本书的多个应用,例如目标检测、OCR、生成模型、图模型等都是目前非常重要的科研和落地方向。如果你想了解AI正在哪些地方发光发热以及AI未来几年的发展方向,本书将是你的不二选择。

唐远炎

澳门大学计算机与信息科学系首席教授,香港浸会大学计算机科学系名誉教授,

IEEE Fellow、IAPR Fellow、AIAA Fellow

序2

当前,随着通用人工智能(AGI)成果不断涌现,人工智能(AI)技术正在引领新一轮科技革命和产业变革浪潮,并将进一步助推我国现代化产业体系升级,加速经济社会进入智能时代。深度学习作为人工智能的底层核心技术,本书对其重点应用方向进行了探讨。

作为本书作者的导师,我很荣幸能为本书写序。这是一本非常出色的图书,它涵盖了目标检测、图像分割、光学字符识别(OCR)、图神经网络、图像生成等多个关键方向。本书作者以其丰富的工作经验和严谨的学术思维,将复杂的概念和技术转化为通俗易懂的内容。无论你是初学者还是专业人士,本书都会为你提供宝贵的知识和实用的指导。

相比《深度学习高手笔记 卷1:基础算法》的基础知识,本书更加注重这些基础知识的实际应用。本书第一篇介绍了目标检测与分割方向的前沿算法,这些技术在人脸检测、自动驾驶、医学人工智能等场景有着广泛的应用,具有重要的价值;第二篇则着重介绍了OCR技术,它是深度学习最早发挥价值的场景之一,被广泛应用于车牌识别、自动编辑等实际场景;第三篇详细介绍了图神经网络、图像预训练、多模态等热门应用和科研方向,这些内容也是深度学习领域学术研究与工程应用的热点方向。

作为本书作者的导师,我要衷心地向作者表示祝贺,希望本书能够成为深度学习领域的重要参考资料之一,为读者的学习和研究提供宝贵的支持和指导。

文俊浩

重庆大学大数据与软件学院教授

中国计算机学会理事,CCF重庆分部主席

前  言

人工智能是一个跨学科、跨领域的研究方向。《深度学习高手笔记 卷1:基础算法》(简称卷1)介绍了深度学习的基础知识,其中涉及卷积神经网络、自然语言处理和模型优化这3个方向。在有了这些深度学习的基础知识之后,您不仅可以实现一些简单的图像识别、文本分类等应用,还可以将不同领域的算法结合起来,设计更复杂、更有价值的应用。

本书倾向于介绍深度学习中经典的、前沿的应用,它们往往是多个不同算法、模型和策略的结合体。通过阅读本书。您不仅能了解近10年来深度学习在各个领域的进展,更重要的是,您将学到如何应用不同方向、不同领域的算法,真正打通应用深度学习的“任督二脉”。

本书包括三篇,共12章。第一篇介绍深度学习中的目标检测与分割。目标检测与分割是两个密不可分的方向,它们都可以看作特征提取、输出头预测和模型结果后处理的流程。其中,目标检测方向有清晰的优化思路,而且有诸多的应用场景,是您接触深度学习必须掌握的一个应用方向。第二篇的核心是光学字符识别(optical character recognition,OCR),在实际应用中OCR一般包括场景文字检测和场景文字识别两个阶段。场景文字检测有两种思路:一种是继承自目标检测;另一种则是继承自图像分割。场景文字识别则是经典的图像和文本结合的应用,一般采用卷积神经网络(convolution neural network,CNN)作为特征的提取器,采用循环神经网络(recurrent neural network,RNN)作为文本的生成器。第三篇将介绍更多的深度学习应用方向,如图像翻译、图神经网络、二维结构识别、人像抠图等,可作为您深入了解这些方向的“敲门砖”。

卷1和本书均源自同一个专栏,它们之间难免会有知识点的重叠和交叉。由于本书的大部分内容都依赖于卷1,因此建议您同时阅读这两本书。尤其是如果您在深度学习方面的基础较为薄弱,则强烈建议您在阅读完卷1之后再来阅读本书。

我对本书的阅读建议有3个:

如果您在深度学习方面的基础较为薄弱,那么可以结合这两本书以及本书提供的知识拓扑图和章节先验知识,选择优先阅读知识拓扑图中无入度的章节,读懂该章节后您可以在知识拓扑图中划掉这个节点,然后逐步将知识拓扑图清空;

如果您在深度学习方面有一定的基础,对一些经典的算法比较熟悉,那么您可以按顺序阅读本书,并在遇到陌生的概念时再根据每一节提供的先验知识去阅读相关章节;

如果您只想了解某些特定的算法,则可以直接阅读对应章节,因为本书各章节的内容比较独立,而且会对重要的先验知识进行复盘,所以单独阅读特定章节也不会有任何障碍。

卷1和本书是我历时5年,在阅读了上千篇论文后独立编写的两本书,对我来说,这是一个开始而且远不是一个结束。首先,由于个人的精力和能力有限,书中涉及的知识点难免有所欠缺,甚至可能因为个人理解偏差导致编写错误,在此欢迎您前去知乎专栏对应的文章下或到异步社区本书页面的“提交勘误”处积极指正,我将在后续的版本中对本书进行修正和维护。其次,随着深度学习的发展,无疑会有更多的算法被提出,也会有其他经典的算法再次流行,我会在知乎专栏继续对这些算法进行总结和分析。

卷1和本书的付梓离不开我在求学、工作和生活中遇到的诸多“贵人”。首先,感谢我在求学时遇到的诸位导师,是他们带领我打开人工智能的大门。其次,感谢我在工作中遇到的诸位领导和同事,他们给予了我巨大的帮助和支持。最后,感谢我的亲人和朋友,没有他们的支持和鼓励,这两本书是不可能完成的。

大师兄

2023年5月25日

资源与支持

资源获取

本书提供如下资源:

本书源代码;

本书思维导图;

异步社区7天VIP会员。

要获得以上资源,您可以扫描下方二维码,根据指引领取。

提交勘误

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区(https://www.epubit.com),按书名搜索,进入本书页面,点击“发表勘误”,输入勘误信息,点击“提交勘误”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给本书的责任编辑(sunzhesi@ptpress.com.cn)。

如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。

异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域多年的发展与积淀。异步图书面向IT行业以及各行业使用相关技术的用户。

第一篇 目标检测与分割

“人不过是肉做的机器,而钢铁做的机器有一天也会思考。”

——Marvin Lee Minsky

目标检测是计算机视觉领域的一个重要方向,分为单阶段检测和双阶段检测。单阶段检测是一种直接从图像中提取目标位置和类别的目标检测方法,包括YOLO和SSD等。双阶段检测是一种将目标检测分为两个阶段的方法,包括Faster R-CNN和Mask R-CNN等,第一阶段是提取图像特征,第二阶段是在图像特征上进行目标检测。总的来说,在对速度要求较高的场景下,单阶段检测可能更合适;在对准确度要求较高的场景下,双阶段检测可能更适合。特征融合策略是目标检测的一个特别重要的研究方向,其对于解决分类和检测对特征深浅需求不同的问题、提升小目标的检测效果是非常有帮助的。特征融合是在特征金字塔网络(feature pyramid network,FPN)中提出的,FPN采用的是一个自顶向下的融合策略,即将深层小分辨率的特征图不断上采样,然后和浅层的特征图组合到一起。路径聚合网络(path aggregation network,PANet)是加强版的FPN,它通过在FPN的基础上增加一条自底向上的路径,进一步增强骨干网络的表征能力。基于神经架构搜索(neural architecture search,NAS)的特征金字塔网络(NAS-FPN)则使用强化学习技术对特征融合的策略进行搜索,得出一个异常复杂的融合结构,它不仅包含PANet的自顶向下和自底向上这两条路径,还包含一条捷径(shortcut)连接。EfficientDet提出的双向特征金字塔网络(bidirectional feature pyramid network,BiFPN)是更为清晰的包含自顶向下、自底向上和捷径连接的特征融合网络,该网络还可以对网络的宽度、深度和图像分辨率之间的缩放关系进行搜索。

目标检测的另一个研究方向是损失函数。损失函数分为两条线路,一条是Ln类损失函数,另一条是交并比(intersection over union,IoU)损失函数。在Ln类损失函数中,最开始使用的是均方误差(mean square error,MSE)损失函数,而Fast R-CNN使用的Smooth L1损失函数使得训练过程中梯度爆炸的现象显著减少。Focal Loss对正负样本的不均衡和难易样本的不均衡起到了显著的改善作用。IoU损失函数是以更能反映实际检测效果的IoU为基础设计的一系列损失函数。首先,UnitBox中提出的IoU损失直接使用了IoU作为损失函数,IoU具有尺度不变性,可提升对小尺寸目标的检测效果。GIoU(generalized-IoU,广义交并比)损失解决了IoU损失在检测框和真值框没有重合区域的时候值均为1的问题。因为GIoU使用了闭包作为惩罚项,它存在通过增加预测框的面积来减小损失值这一“走弯路”问题,所以DIoU(distance-IoU,距离交并比)损失和CIoU(complete-IoU,完全交并比)损失直接使用预测框和目标框的欧氏距离作为惩罚项,实现了比GIoU损失收敛更快的效果。Focal-EIoU损失借鉴了Focal Loss的思想,并将其与设计的EIoU(efficient-IoU,高效交并比)损失进行了整合,它的核心是由EIoU损失和Focal Loss共同作为损失函数,EIoU损失解决了CIoU损失中宽和高不能同增同减的问题,Focal L1损失则解决了高、低质量检测框的回归不平衡问题。

在计算机视觉领域,分割任务是仅次于分类任务和检测任务的第三重要的任务,但它的难度远高于前两者。完成分割任务需要为图像中的每像素分配一个类别标签,根据类别标签的情况分割任务可分为3类,按照难度从小到大排列,它们依次是语义分割、实例分割和全景分割,如图6.1所示。其中,图6.1(b)所示是语义分割(semantic segmentation)的效果,根据图中物体的类别为其设置标签,同一类别的不同物体的类别标签是相同的;图6.1(c)所示是实例分割(instance segmentation)或者叫作目标分割的效果,根据检测到的实例进行分割掩码的预测,每一个实例都拥有一个不同类别的分割掩码,但是,对于非实例我们统一为其标注背景掩码,我们在1.6节介绍的Mask R-CNN的分割分支便是实例分割;图6.1(d)所示是全景分割(panoptic segmentation)的效果,它是语义分割和实例分割的结合体,它不仅要区分每一个实例,还要为图像中的每一像素设置标签。

第1章 双阶段检测

卷积神经网络(convolutional neural network,CNN)最早用于解决计算机视觉领域的分类任务,分类的目的是识别图片中物体的类别。在著名的计算机视觉竞赛ILSVRC(ImageNet Large Scale Visual Recognition Challenge,ImageNet大型视觉识别挑战赛)中,还有定位和检测两个任务。其中,定位任务不仅要识别出物体的具体类别,还要给出物体的具体位置。检测任务可以理解为多目标的定位任务,不仅要识别出图像中的多个物体,还要给出每个物体的具体位置。分类任务、定位任务和检测任务如图1.1所示。

图1.1 分类任务、定位任务和检测任务

目标检测对人类来说是非常简单的任务,人类凭借图像内容和日常经验通常可以快速给出精确的检测结果。但是这个任务对计算机来说是非常困难的,因为在计算机中,图像是使用RGB三维矩阵来表示的,计算机很难直接从矩阵中得出目标物体的位置和类别。传统的目标检测一般采用滑动窗口的方式,主要包括3步:

使用不同尺寸的滑动窗口,得到图的某一部分作为候选区域;

提取候选区域的视觉特征,例如行人检测常用的方向梯度直方图(histogram of oriented gradient,HOG)特征等;

使用分类器进行识别,常见的如支持向量机(support vector machine,SVM)分类器。

在区域卷积神经网络(region CNN,R-CNN)[1]出现之前,无论是传统方法,还是深度学习方法(如OverFeat等),都很难在目标检测方向取得令人满意的效果。2014年被提出的R-CNN则将PASCAL VOC 2007的检测精度大幅提升至58.5%,而之前的算法的检测精度从未超过40%。R-CNN是结合了CNN的骨干网络、选择性搜索(selective search)候选区域提取和SVM分类器的双阶段检测算法,即一个阶段用于候选区域提取,另一个阶段用于目标的识别和分类。R-CNN还是一个结合了传统策略、机器学习和深度学习的“杂交”模型。R-CNN对于检测精度的巨大提升开启了业界对R-CNN系列检测算法的火热研究,对这一方向做出卓越贡献的有Ross B. Girshick和何恺明等人。

[1] 参见Ross Girshick、Jeff Donahue、Trevor Darrell等人的论文“Rich feature hierarchies for accurate object detection and semantic segmentation”。

因为R-CNN需要生成长度固定的特征向量,它采用的策略是将输入图像缩放或裁剪到相同的尺寸。而SPP-Net [2]一文中指出这种缩放或者裁剪会导致输入数据丢失原本的语义信息,SPP-Net的提出便是为了解决这个问题。SPP-Net的核心模块是一个名为空间金字塔池化(spatial pyramid pooling,SPP)的结构,空间金字塔池化将不同尺度的特征图分成若干组大小相同的桶(bin),然后对每个大小相同的桶进行最大池化或者平均池化,便可以得到长度固定的特征向量。

[2] 参见Kaiming He、Xiangyu Zhang、Shaoqing Ren等人的论文“Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition”。

为了避免检测模型的漏检问题,通常需要用选择性搜索等方法提取大量的候选区域,然后将每个候选区域提供给分类器进行特征提取和分类。但是这些候选区域中存在大量的重复内容,针对这些候选区域的独立计算会产生大量的重复计算,严重影响检测算法的速度。Ross B. Girshick等人提出的Fast R-CNN[3]是在整幅输入图像上进行卷积操作,然后在输出层的特征图上提取候选区域对应的部分,从而实现参数共享。此外,Fast R-CNN使用多层感知机(multilayer perception, MLP)替代SVM进行分类,实现了检测模型的端到端训练。

[3] 参见Ross Girshick的论文“Fast R-CNN”。

Faster R-CNN[4]将候选区域的提取也交由深度学习去完成,实现了检测算法的“全深度学习化”,实现这个功能的便是Faster R-CNN最核心的区域候选网络(region proposal network,RPN)模块。RPN用于生成候选区域,因此它是一个只需要判断前景或者背景的二分类网络。RPN最重要的贡献是引入了锚点(anchor)来提升模型的收敛速度。锚点本质上是一个先验框,使模型预测框向着锚点收敛有助于降低模型学习的难度。

[4] 参见Shaoqing Ren、Kaiming He、Ross Girshick等人的论文“Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”。

目标检测和分割是一对密切相关的任务,何恺明等人将实例掩码任务加入Faster R-CNN,提出了可以同时检测和分割目标的Mask R-CNN[5]。分割任务要求的是像素级别的检测精度,而ROI池化或者空间金字塔池化会存在尺寸不匹配的问题。Mask R-CNN的一个重要模块是ROI对齐(ROI align)模块,它采用基于双线性插值的池化方法,不存在尺寸不匹配的问题,是能让掩码任务添加到Faster R-CNN中的最核心的模块。

[5] 参见Kaiming He、Georgi a Gkioxari、Piotr Dollar等人的论文“Mask R-CNN”。

目标检测的输出往往是标准矩形框,但是图像中的目标往往会有更丰富的形态。可变形卷积网络(deformable convolution network,DCN)[6][7]是一个提高模型学习复杂不变性能力的功能模块,由可变形卷积和可变形池化两个模块组成。可变形的实质是为卷积和池化操作学习一个偏移,这样卷积核和池化核便不再是一个形状固定的矩形。可变形模块可以嵌入任何检测或者分割网络,对于提升模型检测精度非常有效。

[6] 参见Jifeng Dai、Haozhi Qi、Yuwen Xiong等人的论文“Deformable Convolutional Networks”。

[7] 参见Xizhou Zhu、Han Hu、Stephen Lin等人的论文“Deformable Convnets v2: More Deformable, Better Results”。

1.1 R-CNN

2012年之前,目标检测的发展变得缓慢,一个重要的原因是基于计算机视觉的方法,如尺度不变特征转换(scale-invariant feature transform,SIFT)、HOG等,进入瓶颈期。生物学家发现人类的视觉反应是一个多层次的流程,而SIFT或者HOG只相当于人类视觉反应的第一层,这是目标检测进入瓶颈期的一个重要原因。2012年,基于随机梯度下降(stochastic gradient descent,SGD)的CNN在目标识别领域的突破性进展充分展现了其在提取图像特征方面的巨大优越性。CNN的一个重要特点是其多层次的结构更符合人类的视觉反应特征。2014年,使用CNN框架的R-CNN被提出,并大幅提高了目标检测的精度,自从这个具有里程碑意义的算法出现,使用深度学习成为目标检测的主流思路。

但大规模深度学习网络的应用对数据量提出了更高的需求。在数据量稀缺的数据集上进行训练,迭代次数太少会导致模型欠拟合,迭代次数太多会导致过拟合。为了解决该问题,R-CNN使用了在海量数据上进行无监督学习的预训练与在稀缺专用数据集上进行微调的策略。

在算法设计上,R-CNN采用了“Recognition Using Regions”[8]的思想,R-CNN使用选择性搜索提取了2000~3000个候选区域,然后针对每个候选区域单独进行特征提取和分类器训练,这也是R-CNN命名的由来。为了提高检测精度,R-CNN使用岭回归对检测位置进行了精校。以上方法的使用,使得R-CNN在PASCAL VOC 2007检测数据集上的检测精度到达了新的高度。

[8] 参见Chunhui Gu等人的论文“Recognition using regions”。

1.1.1 R-CNN检测流程

R-CNN检测流程(见图1.2)可分成5个步骤:

(1)使用选择性搜索[9]在输入图像上提取候选区域;

[9] 参见Jasper Uijlings、Koen E. A. van de Sande、Theo Gevers等人的论文“Selective Search for Object Recognition”。

(2)使用CNN在每个缩放到固定大小(227×227)的候选区域上提取特征;

(3)将CNN提取到的Pool5层的特征输入N(类别数量)个SVM分类器对物体类别进行打分;

(4)将Pool5层的特征输入岭回归位置精校器进行位置精校;

(5)使用贪心的非极大值抑制(non-maximum suppression,NMS)合并候选区域,得到输出结果。

图1.2 R-CNN检测流程

由上文可见,R-CNN的训练过程涉及CNN特征提取器、SVM分类器和岭回归位置精校器共3个模块[10]

[10] 论文中给出的图(图1.2)没有画出回归器部分。

1.1.2 候选区域提取

R-CNN输入CNN的并不是原始图像,而是通过选择性搜索得到的候选区域,选择性搜索的核心思想是层次分组算法(hierarchical grouping algorithm)[11],其核心内容为:

[11] 参见Pedro F Felzenszwalb、Daniel P Huttenlocher的论文“Efficient Graph-Based Image Segmentation”。

将图像分成若干个小区域;

计算相似度,合并相似度较高的区域,直到小区域全部合并完毕;

输出所有存在过的区域,即候选区域。

选择性搜索伪代码区域的合并规则为:

优先合并颜色相近的;

其次合并纹理相近的;

再次合并在上述合并后总面积小的;

最后优先合并在上述合并后总面积在其边界框(bounding box,bbox)中所占比例大的。

图1.3所示是通过选择性搜索得到的候选区域,选择性搜索的核心内容如算法1所示。

图1.3 选择性搜索效果示意

算法1 选择性搜索

输入:(彩色)图像

输出:目标假设位置的集合L

  1: 获取所有的区域

  2: 初始化相似度集合

  3: for 每一个邻居对do

  4:          计算相似度 

  5:           

  6: end for

  7: while ≠ ∅ do

  8:        计算最高相似度 

  9:        合并对应区域

10:        去除相似内容除了riS = S \ s(rir*)

11:        去除相似内容除了sjS = S \ s(r*rj)

12:        计算rt与其邻居之间的相似性集合St

13:        

14:        

15: end while

16: 从R的所有区域中提取对象位置框L

1.1.3 预训练及微调

1.预训练

使用ILSVRC 2012的分类数据集,训练一个N类分类任务的分类器。在该数据集上,top-1的错误率是2.2%,实现了比较理想的初始化效果。

2.微调

对每个候选区域实现一个N+1类的分类任务(在PASCAL VOC检测数据集上,N=20;在ILSVRC检测数据集上,N=200),表示该候选区域是某一类(N)或者是背景(0)。当候选区域和某一类物体的真值框的交并比(IoU,指的是两个检测框交集和并集的比值)大于0.5时,该样本被判定为正样本,否则为负样本。

1.1.4 训练数据准备

1.SVM分类器的数据准备

标签:由于SVM只能做二分类,因此在N类分类任务中,R-CNN使用了N个SVM分类器。对于第K类物体,与该类物体的真值框的IoU大于0.3的视为正样本,其余视为负样本。R-CNN论文中指出,0.3是通过栅格搜索(grid search)得到的最优阈值。

特征:在决定使用哪一层的特征作为SVM的输入时,R-CNN通过对比AlexNet网络中的最后一个池化层Pool5以及两个全连接层FC6和FC7的特征在PASCAL VOC 2007数据集上的表现,发现Pool5层得到的错误率更低,得出结论——Pool5更能表达输入数据的特征。因此,SVM使用的是从Pool5层提取的特征,原因是全连接会破坏图像的位置信息。

2.岭回归位置精校器的数据准备

特征:位置精校和分类的思路类似,不同之处是它们一个是分类任务,一个是回归任务。同SVM一样,岭回归位置精校器使用的也是从Pool5层提取的特征。候选区域选取的是和真值框的IoU大于0.6的样本。

标签:岭回归位置精校器使用的是相对位置,这有助于降低模型学习的难度,提升对不同尺寸的目标的检测能力。在这里,G = {Gx, Gy, Gw, Gh}表示真值框的坐标和长宽,P = {Px, Py, Pw, Ph}表示候选区域的大小和长宽。相对位置的回归目标为T = {tx, ty, tw, th},它的计算方式为:

  (1.1)

3.任务训练细节

CNN预训练。出于当时硬件资源的限制,R-CNN并没有选择容量更大的VGG-16,而是选择了速度更快的AlexNet。预训练指的是在ILSVRC 2013上训练分类网络,微调训练使用了小批次的SGD进行优化,批次大小是128,其中32个正样本,96个负样本。因为预训练是分类任务,所以CNN使用的损失函数是交叉熵损失函数。

SVM分类器训练。SVM的训练使用了难负样本挖掘(hard negative mining,HNM)。对于目标检测我们会事先标记出真值框,然后在算法中生成一系列候选区域,这些候选区域有和标记的真值框重合的,也有没重合的,那么IoU超过一定阈值(通常设置为0.5)的则认定为正样本,阈值之下的则认定为负样本。然后将这些样本放入SVM分类器中训练。然而,这也许会出现一个问题,那就是正样本的数量远远小于负样本,这样训练出来的分类器的效果总是有限的,会出现许多假阳性样本。把其中得分较高的假阳性样本当作所谓的难负样本,既然挖掘出了这些难负样本,就把它们放入SVM分类器中再训练一次,从而加强分类器判别假阳性的能力。

岭回归位置精校器训练。精校器的作用是找到一组映射,使候选区域的位置信息P通过某种映射,能够转化为G。这也可以理解为根据Pool5层的图像特征,学习GP的相对位置关系(1.1.4节中的t),然后根据相对位置关系,将候选区域对应成检测框,所以目标函数可以为:

  (1.2)

其中,表示候选区域Pi对应的Pool5层特征向量,是可训练的网络参数,λ是正则化系数。

1.1.5 NMS

NMS一般用于在检测任务的后处理中过滤多余的检测框。当我们执行一个检测任务时,不可避免地会出现大量且重复的检测框以及它们的分类得分。因为一个目标只有一个检测框,所以这些检测结果存在很大的冗余,需要对其进行过滤。常见的对检测框进行过滤的方案有两个:一个是提高分类得分的阈值,以减少输出的检测框;另一个是根据分类得分和检测框之间的IoU来过滤,也就是这里要介绍的NMS(见图1.4)。

图1.4 NMS示意

NMS的计算有如下几步:

(1)将所有的检测框按照分类得分进行分类,根据类别(PASCAL VOC是20类非背景类别)将检测框分成若干个列表;

(2)在每个列表内部,根据分类得分进行降序排序;

(3)从每个列表中的得分最高的检测框(即bbox1)开始,计算其他检测框(即bboxk)与得分最高的检测框之间的IoU,如果IoU大于阈值,则剔除bboxk,并将bbox1从列表中取出;

(4)从去掉bbox1的列表中再选取得分最高的检测框,重复步骤(3)的操作,直到该列表中所有检测框都被筛选完毕。

1.1.6 小结

R-CNN引发了使用深度学习来进行目标检测的潮流,也留给了后续算法很多优化的空间。

重复计算:R-CNN提取了2000个候选区域,这些候选区域都要进行卷积操作,由于它们存在很多重复的区域,因此造成了大量的重复计算。

多阶段:R-CNN的候选区域提取、特征计算、分类、检测、后处理等都是独立的不同阶段,而且每个阶段都要在硬盘上存储数据,而存储这些中间数据需要几百GB的存储空间。

SVM:R-CNN并不是一个纯粹的深度学习算法,它的分类任务需要使用SVM,而SVM是一个机器学习模型,执行速度极慢。除了这些,SVM最大的问题是无法对输入它的特征进行优化,不是一个端到端的模型。

推理速度慢:R-CNN的推理速度是非常慢的,它在GPU上处理一幅图像需要10s以上的时间,这意味着其很难实现商用。

1.2 SPP-Net

在本节中,先验知识包括:

R-CNN(1.1节)。

在前面介绍的R-CNN中,经过选择性搜索会得到不同尺寸的候选区域,然而它的CNN骨干网络需要固定尺寸的输入图像,无论是裁剪、拉伸还是加边都会对模型的效果带来负面影响。是什么原因导致它的CNN骨干网络需要固定尺寸的输入图像呢?一个原因是CNN通常由卷积层和全连接层组成,卷积层通过滑动窗口的形式得到下一层特征,卷积对输入图像的尺寸并没有要求,只是不同尺寸的输入会产生不同尺寸的特征。但是全连接层要求输入特征的尺寸是固定的,这导致了图像特征尺寸的固定,从而固定了输入图像的尺寸。空间金字塔池化(SPP)是介于特征层(卷积层的最后一层)和全连接层之间的一种池化结构,通过提取N组固定大小的特征再将它们池化到一起,便可以得到固定尺寸的全连接的输入,因此满足不同尺寸的图像都可以输入模型。SPP的思想无论是对于图像分类还是目标检测都是有用的。从生物学的角度来讲,SPP也更符合人类的视觉特征,因为当我们看一个物体时,它的尺寸并不明显影响我们对它的位置判断,而是在更深的视觉系统中进行物体信息处理。

R-CNN的另一个问题是它非常耗时,因为其在使用选择性搜索提取候选区域后,会对每幅图像的几千个候选区域重复地进行卷积操作。SPP-Net只需要在整幅图像上进行一次卷积操作,然后使用SPP-Net的金字塔池化的思想在特征图上提取特征,这一操作将运行速度提升了上百倍。SPP-Net的这一工作在ILSVRC 2014上也取得了非常优秀的成绩(检测任务第二名,分类任务第三名)。

1.2.1 空间金字塔池化

1.算法动机

SPP-Net通过可视化CNN的最后一个卷积层,发现卷积操作其实保存了输入图像的空间特征,且不同的卷积核可能响应不同的图像语义特征。如图1.5所示,通过对图1.5(a)中左侧输入图像的特征图的可视化,第175个卷积核倾向于响应多边形特征,第55个卷积核倾向于响应圆形特征;通过对图1.5(b)中左侧输入图像的特征图的可视化,第66个卷积核倾向于响应^形状,而第118个卷积核则倾向于响应 形状。上面这些响应与输入图像的尺寸没有关系,只取决于图像的内容。

在传统的计算机视觉方法中,我们首先可以通过SIFT或者HOG等方法提取图像特征,然后通过词袋或者空间金字塔池化的方法聚集这些特征。同样我们也可以用类似的方法聚集CNN得到的特征[12][13],这便是SPP-Net的算法思想。

[12] 参见Kristen Grauman、Trevor Darrell等人的论文“The Pyramid Match Kernel: Discriminative Classification with Sets of Image Features”。

[13] 参见Svetlana Lazebnik、Cordelia Schmid、Jean Ponce的论文“Beyond Bags of Features: Spatial Pyramid Matching for Recognizing Natural Scene Categories”。

图1.5 特征图响应图像特征示意

2.SPP-Net的结构

SPP的思想与多尺度输入图像的思想类似,不同的是SPP基于特征图的金字塔的特征提取。它首先通过CNN提取输入图像(尺寸无要求)的特征,然后通过SPP的方法将不同的特征图聚集成相同尺寸的特征向量,这些尺寸相同的特征向量便可以用于训练全连接层或者SVM。与传统的词袋方法相比,SPP保存了图像的空间特征。得到尺寸相同的特征向量后,便可以将其输入全连接层了。图1.6所示是SPP-Net的结构。

在图1.6中,骨干网络的最后一个卷积层(Conv5层)共有256个卷积核,SPP-Net的论文中使用了4×4、2×2、1×1这3个尺度的金字塔,在每个尺度的栅格(grid,其大小和输入图像的尺寸有关)上使用最大池化得到特征向量。最后将所有尺度的特征向量拼接在一起,就得到长度为5376的特征向量。该特征向量便是全连接层的输入。通过分析可以看出,虽然输入图像的尺寸不一样,但经过SPP-Net后都会得到相同长度的特征向量。

SPP是可以通过标准的反向传播进行训练的,然而在实际训练过程中,GPU更倾向于尺寸固定的输入图像(例如小批次训练)。为了能够使用当时的框架(Caffe)并同时考虑多尺度的因素,SPP-Net使用了多个不同输入尺寸的网络,这些网络是共享参数的。对于任意不同输入尺寸的卷积网络,经过卷积层得到特征向量的大小是a×a,如果我们要使用金字塔的某层取一个n×n的特征向量,则池化层的窗口大小是,步长是。可见,参数和输入图像的尺寸是没有关系的,因此不同的输入图像尺寸对应的网络之间权值是可以共享的。

图1.6 SPP-Net的结构

在实验中,SPP-Net使用了输入图像尺寸分别是224×224和180×180的两个不同的网络。在将图像缩放到其中一个尺寸后训练该网络,并将学到的参数共享到另一个网络中。也就是说,SPP-Net会每隔一个epoch更换一种图像尺寸,训练结束后共享参数。SPP-Net的多尺度输入的训练策略是提升检测效果的十分常见的技巧,尤其是在小目标检测的场景。

在测试时,由于不存在小批次,因此输入图像的尺寸是任意的,在推理时并不存在图像扭曲的问题。但是这里的“任意”也不是完全任意的输入,因为过小的图像输入模型会无法进行多次降采样。

1.2.2 SPP-Net的推理流程

简单地回顾一下R-CNN的推理流程。对于一个要检测n类目标的模型,R-CNN首先利用选择性搜索在输入图像上提取2000个左右的候选区域,然后将每个候选区域拉伸到227×227的尺寸,再使用标准的CNN训练这些候选区域,最后提取特征层的特征用于训练n个二分类的SVM作为分类模型以及一个岭回归位置精校器用于位置精校。R-CNN的性能瓶颈之一是在同一幅图像的2000个左右的候选区域上重复进行卷积操作时,存在大量的冗余计算,这是非常耗时的。

SPP-Net首先在输入图像上提取2000个候选区域。按照图像的短边(缩小到s)将图像缩放后(在实验中,SPP-Net使用了s∈{480, 576, 688, 864, 1200}中的多个缩放尺度,原始策略是将这5个尺度的特征连在一起作为特征向量,但是SPP-Net发现将图像缩放到接近224×224像素的那个尺度得到的效果最好),使用CNN提取整幅图像的特征(这是提升时间最关键的部分)。找到每个候选区域对应的输出特征图的部分,使用SPP的方法提取长度固定的特征向量。特征向量经过一个全连接层后输入二分类SVM用于训练SVM分类器。同R-CNN一样,SPP-Net也使用了n个二分类的SVM。SPP-Net的检测过程如图1.7所示。

图1.7 SPP-Net的检测过程

上文提到,我们需要找到原图的候选区域在特征层对应的相对位置。由于卷积操作并不影响物体在图像中的相对位置,这涉及感受野(receptive field)的计算问题。感受野的计算要从第一个全连接层从后往前推,表示为式(1.3):

  (1.3)

其中,out是上一层感受野的大小,stride是步长,ksize是核函数的大小。根据SPP-Net论文中给出的ZFNet的网络结构(见表1.1),便得出了SPP-Net论文附录A中感受野139的计算方法,如式(1.4)所示。当得到感受野之后,我们便可以得到候选区域在骨干网络输出层的位置。候选区域左上角的计算方式为,其中139/2是感受野的半径,16是有效步长,63是左上角的位置偏移;右下角的计算方式为,其中75是右下角的位置偏移。

表1.1 SPP-Net中使用的ZFNet的网络结构

模型

Conv1

Conv2

Conv3

Conv4

Conv5

ZFNet

96×72,步长为2

256×52,步长为2

384×32

384×32

256×32

LRN,池化为32,步长为 2

LRN,池化为32,步长为2

特征图大小为55×55

特征图大小为27×27

特征图大小为13×13

特征图大小为13×13

特征图大小为13×13

  (1.4)

上面通过感受野来确定候选区域的方式计算起来非常复杂,因为在一些复杂的网络中它的感受野并不是非常容易计算的。一个更简单且直接的确定候选区域的方式是按照候选区域的位置等比例地换算到特征网络输出层上。

SPP-Net的CNN是可以使用候选区域进行微调的。针对候选区域的类别(n+1个)特征,SPP-Net 在全连接层的最后一层又接了一个n+1个类别的分类层。在实验中,SPP-Net的特征层没有经过微调,只是微调了一下分类层,其使用的数据是25%的正样本(和真值框的IoU大于50%)。和R-CNN一样,SPP-Net也使用了岭回归位置精校器用于位置精校。

1.2.3 小结

SPP-Net解决了R-CNN对候选区域进行拉伸或者加边时带来的输入图像的偏差问题,它的核心结构是SPP层,SPP层的引入使得模型可以对任意长宽比的目标进行处理。但是SPP-Net依然有不少问题,这就引出了下面要介绍的Fast R-CNN。

1.3 Fast R-CNN

在本节中,先验知识包括:

SPP-Net(1.2节)。

之前介绍的R-CNN和SPP-Net检测算法,都是先通过CNN提取特征,然后根据特征训练SVM用于分类和精校器用于位置精校。这种多阶段的流程有两个问题:

保存中间结果需要使用大量的硬盘存储空间;

不能根据分类结果优化CNN的参数,造成了优化过程的中断,这在一定程度上限制了网络精度。

1.3.1 Fast R-CNN算法介绍

我们这里要介绍的Fast R-CNN通过多任务的方式将分类任务和检测任务整合成一个流程,同时带来分类和检测精度的提升。它的核心特点是通过softmax替代n个SVM分类器的分类分支,这个替代解决了训练过程中的多阶段的问题,使得Fast R-CNN成为一个可以进行端到端训练的模型。

Fast R-CNN的算法流程如图1.8所示,它包含的主要步骤如下:

(1)通过选择性搜索得到若干候选区域;

(2)将整幅图像送入神经网络,得到整幅图像的特征图(可以和步骤(1)并行执行);

(3)使用感兴趣区域(region of interest,ROI)池化层(单层的SPP层)将不同尺寸候选区域的特征图映射成相同大小的特征向量;

(4)将特征向量输入由分类任务和检测任务组成的多任务分支,分类任务分支计算每个候选区域的类别评分(K类物体和1类背景),检测任务分支得到K类任务的4个坐标信息(4×K个输出);

(5)通过NMS后处理得到最终的检测结果。

相较于SPP-Net,Fast R-CNN最大的优点是实现了目标检测任务的端到端学习,同时引进了多任务训练,在优化训练过程的同时避免了额外存储空间的使用,并在一定程度上提升了精度。在下面的介绍中,我们以源码为线索,逐渐揭开Fast R-CNN的神秘面纱。

图1.8 Fast R-CNN的算法流程

1.3.2 数据准备

Fast R-CNN也是通过选择性搜索选取的候选区域。Fast R-CNN的论文指出,随着候选区域的增多,mAP(平均精度均值)呈先上升后下降的趋势,所以候选区域的个数不宜太多,更不宜太少,Fast R-CNN则选取了2000个候选区域。

self.config = {'cleanup' : True,
               'use_salt' : True,
               'top_k' : 2000}

1.输入图像尺度

通过对比多尺度{480, 576, 688, 864, 1200}和单尺度的精度,可以发现Fast R-CNN的单尺度和多尺度的精度差距并不明显。这也从另一个角度证明了深度卷积神经网络有能力直接学习到输入图像的尺寸不变性。但Fast R-CNN依旧保留了多尺度这个功能,尺度选项可以在lib/fast-rcnn/config.py文件里设计,如下面的代码,其中SCALES可以为单个值(单尺度)或多个值(多尺度)。

# 训练期间使用的尺度(可以列出多个尺度)
# 每个尺度中的值指的是图像最短边的大小
_ _C.TRAIN.SCALES = (600,)

Fast R-CNN的源码在实验中使用了最小边长600、最大边长不超过1000的缩放图像方法,该方法通过下面的函数实现。

def prep_im_for_blob(im, pixel_means, target_size, max_size):
    im = im.astype(np.float32, copy=False)
    im -= pixel_means
    im_shape = im.shape
    im_size_min = np.min(im_shape[0:2])
    im_size_max = np.max(im_shape[0:2])
    im_scale = float(target_size) / float(im_size_min)
    # 防止最大边超过 max_size
    if np.round(im_scale * im_size_max) > max_size:
        im_scale = float(max_size) / float(im_size_max)
    im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR)
    return im, im_scale

2.数据扩充

在深度学习任务中,当我们的样本量不足以支撑模型的训练时,通常采用数据扩充的方法来增加样本量。数据扩充对增加模型的泛化能力,减轻过拟合的问题是非常有效的。在实验中,Fast R-CNN仅使用了最常见的翻转图片这一扩充方式。

1.3.3 Fast R-CNN网络结构

Fast R-CNN选择了VGG-16网络结构,并将最后一层的最大池化换成了ROI池化。经过两层共享的全连接和Dropout后,Fast R-CNN接了一个双任务的损失函数,分别用于分类和检测精校,具体结构如图1.9所示。其中Convi_j表示的是第i个网络块的第j层的卷积操作,ReLUi_j表示的是第i个网络块的第j层的ReLU激活函数;Pooli表示第i个网络块的最大池化。FC6、FC7以及FC8是3个全连接层。cls_score是分类评分,bbox_pred是预测的检测框, loss_cls和loss_box分别是分类任务和检测任务的损失函数。

图1.9 Fast R-CNN网络结构

1.ROI池化层

ROI池化层是一个单层的SPP。ROI池化可以由(r, c, w, h)定义,其中(r, c)表示候选区域的左上角坐标,(w, h)表示候选区域的宽和高。假设我们要将特征层映射成大小为H×W的特征图。ROI池化将特征层分成的栅格,每个栅格通过最大池化得到。在Fast R-CNN中,ROI池化使用的是固定栅格数量的最大池化,在反向传播时,只对栅格中选为最大值的像素更新参数,可以表示为式(1.5)。[bool(•)]在Fast R-CNN论文中叫作Iverson括号,它的本质是一个指示函数,表示当布尔值为True时,该函数的值为1,否则为0。

  (1.5)

2.候选区域的ROI池化的计算

在Fast R-CNN中,所有候选区域的卷积操作是共享的,而选择性搜索是在输入图像上完成的,所以需要将从输入图像上提取的候选区域对应到Conv5层的特征图。然后在这个特征图上进行ROI池化的操作,如图1.10所示。因为骨干网络是一个全卷积的网络结构,输入图像像素之间的相对位置不会变化,所以我们可以根据候选区域在原图中的大小占比以及相对位置等比例地换算出它应该在Conv5层上的哪个位置。在换算的过程中,我们主要关注图像尺寸下降了多少。在Fast R-CNN中,它使用了VGG-16作为骨干网络,VGG-16共有4个步长为2的最大池化操作,而卷积操作是步长为1、加边为1的卷积操作,所以它最终得到的Conv5层的特征图的尺寸是输入图像的1/16。

图1.10 Fast R-CNN算法流程以及ROI池化

输入图像上的候选区域(x1, y1, x2, y2)在与之对应的特征图的区域 的计算方式为:

  (1.6)

1.3.4 多任务损失函数

Fast R-CNN是一个多任务的模型,一个任务是用N+1个SVM分类器计算候选区域每个类别的得分,然后通过N+1类的softmax函数根据N+1个SVM分类器的得分计算得到多分类的结果;另一个任务是用精校器来精校候选区域的位置,它计算的是候选区域与真值框的相对位置偏差。

1.分类任务

分类任务的输入是候选区域经过骨干网络得到的特征向量,经过一个N+1类(N类物体和1类背景)的softmax函数得到该候选区域的概率分布,表示为。log损失表示为,其中u是该ROI的真值框,u=0表示该后续区域为背景。

2.检测任务

在Fast R-CNN中,我们需要为除了背景类的每一个类别预测一个检测框,假设类别为u, u1,那么预测的检测框可以表示为。假设该候选区域的检测框的真值框为,那么检测框的损失函数可表示为式(1.7):

  (1.7)

其中,Smooth L1表示为式(1.8),它定义在/src/caffe/layers/smooth_L1_loss_layer.cpp文件中,函数曲线如图1.11所示。Smooth L1可以理解为当| x |>1时,损失值为L1损失,它能够让模型的误差值快速下降;当| x |<1时,损失值为L2损失,它的目的是让模型精细地调整损失。

  (1.8)

图1.11 Smooth L1曲线

3.多任务损失函数

Fast R-CNN表示为式(1.9),其中λ是用来调整两个损失的权值,Fast R-CNN中设置的值为1。在实际的训练过程中,可以根据两个损失值的收敛情况灵活地调整这个权值。是我们在前文中介绍的指示函数。

  (1.9)

1.3.5 Fast R-CNN的训练细节

1.迁移学习

同R-CNN一样,Fast R-CNN同样使用ImageNet的数据对模型进行预训练。详细地讲,先使用1000类的ImageNet训练一个1000类的分类器,如图1.9的虚线部分所示;然后提取模型中的特征层及其以前的所有网络;最后使用Fast R-CNN的多任务模型训练网络,如图1.9的实线部分所示。

2.小批次训练

在Fast R-CNN中,设每个批次的大小是R。在抽样时,每次随机选择N幅图像,每幅图像中随机选择R/N个候选区域,在实验中N=2、R=128。对候选区域进行抽样时,选取25%的正样本(和真值框的IoU大于0.5),75%的负样本。

1.3.6 Fast R-CNN的推理流程

使用选择性搜索在输入图像中提取2000个候选区域,按照与训练样本相同的缩放方法调整候选区域的大小。将所有的候选区域输入训练好的神经网络,得到每一类的后验概率p和相对偏移r。通过预测概率给每一类一个置信度得分,并使用NMS对每一类确定最终候选区域。Fast R-CNN使用了奇异值分解来提升矩阵乘法的运算速度。

1.3.7 小结

Fast R-CNN是目标检测方向中极其重要的算法之一,它最大的贡献在于实现了目标检测任务的端到端的训练和推理。在R-CNN和SPP-Net中,它们的分类器还是采用的SVM,而Fast R-CNN将其替换为softmax函数,向纯粹的深度学习网络又迈进了一步。但是Fast R-CNN的速度仍然不够快,它最大的问题是使用选择性搜索进行候选区域的提取,而这一操作将会在下面要介绍的Faster R-CNN中进行优化。

1.4 Faster R-CNN

在本节中,先验知识包括:

Fast R-CNN(1.3节)。

Fast R-CNN虽然实现了端到端的训练,而且通过共享卷积的形式大幅提升了R-CNN的计算速度,但是其仍难以做到实时检测,其中最大的性能瓶颈便是候选区域的计算。在之前的目标检测算法中,选择性搜索是最常用的候选区域提取方法,它贪心地根据图像的低层特征合并超像素(super pixel)。另一个更快速的方式是EdgeBoxes,虽然EdgeBoxes的候选区域提取速度达到了5张/秒,但仍然难以做到在视频数据上的实时检测,而且EdgeBoxes为了提取速度牺牲了提取效果。选择性搜索提取速度慢的一个重要原因是,不同于检测网络使用GPU进行计算,选择性搜索使用的是CPU。从工程的角度来讲,使用GPU实现选择性搜索是一个非常有效的方法,但是其忽视了共享卷积提供的非常有效的图像特征。

1.4.1 区域候选网络

1.提出动机

由于CNN具有强大的拟合能力,很自然地我们可以想到使用CNN提取候选区域,因此,便产生了Faster R-CNN最核心的模块:区域候选网络(region proposal network,RPN)。通过SPP-Net的实验得知,CNN可以很好地提取图像语义信息,例如图像的形状、边缘等。所以,这些特征理论上也应该能够用于提取候选区域(这也符合深度学习解决一切图像问题的思想)。在Faster R-CNN的论文中给RPN的定义如下:RPN是一种可以进行端到端训练的全卷积网络,主要用来生成候选区域。

2.RPN与Fast R-CNN

RPN最核心的结构是一个叫作锚点(anchor)的模块。锚点是通过在Conv5上使用大小为3×3、步长为1的滑窗,在输入图像上取得的一系列检测框。在取锚点时,同一个中心点取3个尺度、3个比例,共9个锚点。Faster R-CNN使用的候选区域便是用RPN标注了标签为正的锚点。从另一个角度讲,RPN的思想类似于注意力机制,注意力机制中“where to look”要看的地方便是锚点。

在Faster R-CNN中,RPN用来生成候选区域,Fast R-CNN使用RPN生成的候选区域进行目标检测,且二者共享CNN的参数,这便是Faster R-CNN的核心框架(见图1.12)。由此可见,RPN和Fast R-CNN是相辅相成的,在Faster R-CNN的论文中使用了交叉训练的方法训练该网络,RPN和Fast R-CNN两个模块互相用对方优化好的参数,具体内容会在1.4.2节介绍。

图1.12 Faster R-CNN的核心框架

Faster R-CNN分成两个核心部分:

使用RPN生成候选区域;

使用这些候选区域的Fast R-CNN。

首先我们要确定RPN的输入与输出,RPN的输入是任意尺寸的图像,输出是候选区域的坐标和它们的置信度得分。当然,由于RPN是一个多任务的监督学习,因此我们也需要图像的真值框。RPN是一个多任务模块,它的任务有两个,任务一是计算当前锚点是前景的概率和是背景的概率,所以是两个二分类问题;任务二是预测锚点中前景区域的坐标(x, y, w, h),所以是一个回归任务,该回归任务预测4个值。RPN对每一组不同尺度的锚点区域,都会单独训练一组多任务损失,且这些任务参数不共享。这么做是为了避免多个锚点无法和单一的真值框对应的问题。所以,如果有k个锚点,那么RPN是一个有6×k个输出的模型。

3.RPN的锚点

首先,RPN的滑窗(步长为1)是在特征层(Conv5层)进行的,通过3×3卷积将该窗口内容映射为特征向量(图1.13中的256维的特征向量)。根据卷积的位移不变性,要将Conv5层特征映射到输入图像感受野的中心点只需要乘降采样尺度即可。由于VGG使用的都是same卷积,降采样尺度等于所有池化的步长的积,如式(1.10)所示。相对位移便是特征图上的位移除以降采样尺度。

图1.13 RPN的滑窗

  (1.10)

因此,在特征层上的步长为1的滑窗也可以理解为在输入图像上步长为_feat_stride的滑窗。例如,一个最短边缩放到600的4 : 3的输入图像,经过4次降采样后,特征图的大小为。进行步长为1的滑窗后,得到了W×H×k个锚点。由于部分锚点边界超过了图像,这部分锚点会被忽略,因此并不是所有锚点都参与采样。

特征图上的一个点可以对应输入图像上的一个区域,这个区域便是感受野。在感受野的每个中心取9个锚点,这9个锚点有3个尺度,分别是1282、2562和5122,每个尺度有3个比例,分别是1 : 1、1 : 2和2 : 1。代码中锚点的坐标为:

[[ -84.  -40.   99.   55.]
 [-176.  -88.  191.  103.]
 [-360. -184.  375.  199.]
 [ -56.  -56.   71.   71.]
 [-120. -120.  135.  135.]
 [-248. -248.  263.  263.]
 [ -36.  -80.   51.   95.]
 [ -80. -168.   95.  183.]
 [-168. -344.  183.  359.]]

可视化该锚点,得到图1.14,其中黄色部分代表中心点的感受野。在这个锚点列表中,会有很多数值为负的锚点,在实际的实现过程中,锚点的值会被向上/向下进行截断,因此不会有超出图像边界的问题。

图1.14 Faster R-CNN的锚点可视化

根据SPP-Net所介绍的感受野的知识,我们知道特征图上的一个点对应的感受野是输入图像的一个区域,该区域可以根据CNN结构反向递推得出。我们可以计算出VGG-16的感受野的大小是228,递推过程总结如图1.15所示,图中Convi-j表示的是第i个网络块的第j个卷积,箭头上方的数字表示该层的感受野的大小[14]。虽然Faster R-CNN的论文中说这种锚点并没有经过精心设计,但我认为这批锚点表现好不是没有原因的。这些锚点分别覆盖被感受野包围、和感受野大小类似以及完全将感受野覆盖3种情况,可见这样设计锚点覆盖的情况还是非常全面的。

[14] 由于RPN的特征向量是从Conv5层经过大小为3×3的卷积核获得的,因此应该从3开始向前递推。

图1.15 RPN的滑窗

在输出特征图中,每个中心对应了9个不同的锚点,进而会产生9种不同的预测结果。Faster R-CNN根据9种不同尺寸和比例的锚点,独立地训练9个不同的回归模型,这些模型的参数是不共享的,这就是RPN的模型有6k个输出的原因,如图1.16所示。

图1.16 RPN的输出层

4.损失函数

对接近2000个锚点都进行分类是不太现实的。一个原因是这2000个锚点的数量过于庞大,会影响训练速度;另一个原因是这2000个锚点绝大多数都是负样本锚点,正负样本的分布极其不均衡。RPN的分类任务使用的是名为“Image-centric”的采样方法,即每次采样少量的图像,然后从图像中随机采样锚点正负样本。具体来讲,RPN每次随机采样一幅图像,然后在每幅图像中采样256个锚点,并尽量保证正负样本的比例是1 : 1。由于负样本的数量超过128,因此当正样本数量不够时,将使用负样本补充。在回归任务中,RPN使用的是全部锚点。

RPN的损失函数是一个多任务的损失函数,其中分类任务Lcls用来判断该锚点是正样本还是负样本,回归任务用来检测目标的检测框,表示为式(1.11):

  (1.11)

式(1.11)中,NclsNreg分别是参与分类和检测的样本数,其中Ncls=256,Nreg=2000。是样本的标签值(对于正样本,值为1;对于负样本,值为0),它乘Lreg表明只有正样本参与检测框的计算,λ是用来平衡两个任务的参数,因为NclsNreg的差距过大,在Faster R-CNN的实验中,λ的值为

在检测任务中,Faster R-CNN采用的是R-CNN提出的针对锚点(候选区域)的相对位置的预测。假设模型预测框的坐标为(x, y, w, h),真值框的坐标为(x*, y*, w*, h*),锚点的坐标为(xa, ya, wa, ha),那么预测框关于锚点的相对位置的计算方式如式(1.12)。同理,真值框相对于锚点的相对位置的计算方式如式(1.13)。

  (1.12)

  (1.13)

因为在RPN中只有正负两类样本,所以Lcls使用的是二类交叉熵损失函数,而Lreg使用的是Fast R-CNN中采用的Smooth L1损失。

1.4.2 Faster R-CNN的训练

由于RPN使用Fast R-CNN的网络模型可以更好地提取候选区域,而Fast R-CNN可以使用RPN生成的候选区域进行目标检测,两者相辅相成。Faster R-CNN尝试了多种模型训练策略,并最终采用了交替训练(alternating training)。

交替训练可以分成4个步骤:

(1)使用无监督学习即ImageNet的训练结果初始化网络训练RPN;

(2)使用RPN生成的候选区域训练Fast R-CNN,Fast R-CNN和RPN使用的是两个不同的输出层,也是通过ImageNet任务进行初始化;

(3)使用Fast R-CNN初始化RPN,但是共享的卷积层固定,只调整RPN独有的网络层;

(4)固定共享的卷积层,训练Fast R-CNN。

前面指出,RPN的输出是候选区域的坐标以及它们的置信度得分,所以通过RPN生成候选区域的步骤如下:

(1)所有在图像内部的锚点均输入训练好的网络模型,得到样本得分和预测坐标;

(2)使用NMS根据得分过滤锚点,NMS的IoU阈值固定为0.7,之后生成的便是候选区域。

从Faster R-CNN的开源代码中可以看出,它使用的是近似联合训练(approximate joint training),即将RPN和Fast R-CNN的损失函数简单地加在一起,作为一个多任务的损失函数进行学习。Faster R-CNN论文中也指出,这种方法忽略了“Fast R-CNN将RPN的输出作为其输入”这一事实。实际上,Faster R-CNN的RPN和Fast R-CNN并不是并行的多任务的关系,而是串行级联的关系。图1.17说明了并行多任务和串行级联的区别。在实际应用中,并行训练和串行训练的差距其实不是很明显,但是并行训练的方式需要的人为干预更少且效率更高,因此后面得到了更广泛的使用。

图1.17 并行多任务和串行级联的区别

Faster R-CNN的检测流程在使用RPN生成候选区域后,剩下的便和Fast R-CNN一样了。这里不赘述。

1.4.3 小结

Faster R-CNN中由于引入了RPN模块,相比基于选择性搜索的方法有了明显的速度和效果上的提升,基本上做到了在当时主流GPU下能支持实时检测。Faster R-CNN提出的锚点机制能够用于不同尺寸的目标,对于提升检测效果也非常有帮助。

1.5 R-FCN

在本节中,先验知识包括:

Faster R-CNN(1.4节);           DeepLab(6.4节);

FCN(6.1节)。

位移不变性是CNN的一个重要特征,该特征是CNN在图像分类任务上取得非常好的效果的原因。所谓位移不变性,是指图像中物体的位置对图像的分类没有影响。但是在目标检测的场景中,我们需要知道检测物体的具体位置,这时候需要网络对物体的位置非常敏感,即需要网络具有“位移可变性”。R-FCN[15]的提出便是用来解决分类任务中位移不变性和检测任务中位移可变性之间的矛盾的。

[15] 参见Jifeng Dai、Yi Li、Kaiming He等人的论文“R-FCN: Object Detection via Region-based Fully Convolutional Networks”。

同时,R-FCN分析了Faster R-CNN 存在的性能瓶颈,即ROI池化之后使用Fast R-CNN 对RPN提取的候选区域进行分类和位置精校。在R-FCN中,ROI池化之后便不存在可学习的参数,从而将Faster R-CNN的推理速度提高了2.5~20倍。

在R-FCN提出之前,深度学习在分割任务上也取得了突破性的进展,其中最具代表性的算法之一便是FCN[16]。FCN是一个完全由卷积操作构成的神经网络,它预测的分割图和输入图像保持了位移敏感性。虽然FCN得到的分割图相对于原图进行了降采样,但是我们仍旧可以使用这个降采样的分割图来进行目标检测。

[16] 参见Jonathan Long、Evan Shelhamer、Trevor Darrell的论文“Fully Convolutional Networks for Semantic Segmentation”。

1.5.1 提出动机

在R-CNN系列论文中,目标检测一般分成两个阶段:

(1)提取候选区域;

(2)候选区域分类和位置精校。

在R-FCN之前,效果最好的Faster R-CNN是使用RPN生成候选区域,然后使用Fast R-CNN进行分类。在Faster R-CNN中,首先使用ROI池化层将不同大小的候选区域归一化到统一大小,之后接若干全连接层,最后使用一个多任务作为损失函数。多任务包含两个子任务:

用于目标识别的分类任务;

用于目标检测的回归任务。

在Faster R-CNN中,为了保证特征的“位移可变性”,Faster R-CNN利用RPN提取了约2000个候选区域,然后使用全连接层计算损失函数。然而候选区域有大量的特征冗余,造成了一部分计算资源的浪费。R-FCN采用了和Faster R-CNN相同的过程,不过做了如下改进:

R-FCN模仿FCN,采用了全卷积的结构;

R-FCN的两个阶段的网络参数全部共享;

使用位置敏感网络产生检测框;

位置敏感网络无任何可学习的参数。

R-FCN最大的特点是使用了全卷积的网络结构,即使用1×1卷积代替了Faster R-CNN中使用的全连接。1×1卷积起到了全连接层加非线性的作用,同时还保证了特征点的位置敏感性。R-FCN的结构如图1.18所示。从图1.18中可以看出,R-FCN的最重要的模块便是位置敏感网络。

在R-FCN的位置敏感网络中,每个ROI被划分成一个k×k的栅格,每个栅格负责检测目标物体的不同部位。例如,对于“人”这个目标,中上部区域大概率对应的是人的头部,同理,ROI的其他栅格也对应到目标物体的其他部位。当ROI的每个栅格都找到目标物体的对应部位时,分类器便会判断该ROI的类别为目标物体。当ROI的每个栅格都没有找到目标物体的对应部位时,那么该ROI就是一个背景区域。

这个解决方案有两个问题:一是目标物体之间会有重叠,例如图1.18中有人骑在马上的情况;二是目标物体会有不同的姿势,例如人可以弯腰、蹲着等。对于第一个问题,R-FCN采用的策略是输出k2×(C+1)个通道的特征图,此时每个通道只负责检测某类目标的某个部位,例如某个通道只负责检测人脸。这个策略不仅可以解决不同物体之间的重叠问题,而且可以解决同一类目标的重叠问题。其实对于第二个问题,采用的策略是如果目标的大部分区域被检测到,我们便可以认为该目标被检测到,这种策略可以解决绝大多数目标物体的不同姿势的问题。

图1.18 R-FCN的结构

1.5.2 R-FCN的网络

1.骨干架构

R-FCN使用的是残差网络的ResNet-101[17]结构,ResNet-101采用的是100层卷积 + 全局平均池化(global average pooling,GAP)+ 全连接分类器的结构,ResNet-101的最后一层卷积的特征图的个数是2048。在R-FCN中,去掉了ResNet的GAP层和全连接层,并在最后一层卷积之后使用1024个1×1×2048的卷积将通道数调整为1024,然后使用k2×(C+1)个1×1×1024的卷积生成通道数为k2×(C+1)的位置敏感卷积层。R-FCN的骨干网络也使用了预训练的策略,即ResNet-101部分使用在ImageNet上训练好的模型作为初始化参数。

[17] 参见Kaiming He、Xiangyu Zhang、Shaoqing Ren等人的论文“Deep Residual Learning for Image Recognition”。

R-FCN也尝试了通过调整步长以及使用空洞卷积[18]来提升骨干网络的表现。首先,R-FCN将ResNet-101的有效步长从32降到16,以提升输出特征图的分辨率。具体来讲,Conv4之前的网络模型没有任何变化,但是将Conv5的第一个步长为2的操作调整为步长为1。为了保证感受野不至于过小,RFN将Conv5层的卷积替换为空洞卷积,实验结果表明空洞卷积带来了2.6%的准确率的提升。

[18] 参见Liang-Chieh Chen、George Papandreou、Iasonas Kokkinos等人的论文“Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs”。

从图1.18中可以看出,R-FCN的一个分支是Faster R-CNN论文中提出的RPN模块,它被用来生成若干候选区域。位置敏感网络通过这些ROI计算得到每个ROI的类别和检测框。

2.位置敏感网络

通过RPN我们可以得到图像中的ROI,下一步则需要将这个ROI对应到物体的具体类别和它的更精细的位置。在前文中分析到,位置敏感网络是一个通道数为k2×(C+1)的特征图,它的每个通道用来响应每类物体对应的目标部位。例如在图1.19中,一个ROI会被等比例地划分成一个k×k的栅格,每个栅格为一个桶,分别表示该栅格对应的物体的敏感位置(左上、正上、右上、左中、正中、右中、左下、正下、右下)编码。

对于一个尺寸为w×h的ROI,每个桶的大小为,每个桶对应ROI的特征图的一个子区域。接下来我们使用Fast R-CNN论文中提出的ROI池化(平均池化)得到每个桶的评分,然后将它们转换成一个大小为3×3、通道数为C+1的特征图,再通过投票的方式(取均值)得到一个长度为C+1的特征向量,最后通过softmax函数得到该ROI的预测的概率分布[19]

[19] 上述池化和投票均采用了取均值的方式,这里也可以换成取最大值的方式,效果类似。

图1.19 R-FCN流程图

如图1.20所示,一个大小为w×h、通道数为k2×(C+1)的ROI可以展平成k2w×h×(C+1)个ROI,每个ROI的第(i, j)个栅格对应物体的一个不同的敏感位置,这样我们可以提取k2个尺度为的得分图,对每个得分图求均值之后再整合到一起便得到了一个k2×(C+1)的位置敏感得分。对该位置敏感得分的k2个区域求均值得到一个1×1×(C+1)的向量,使用softmax函数(注意不是softmax分类器)便可以得到每个类别的概率分布。

上面介绍的都是对ROI进行分类的过程,自然我们也会遇到对ROI中目标进行位置精校的任务。在分类任务中,我们得到了每个ROI的C+1个类别的概率分布,那么我们只需要添加一个通道数为4的输出分支来得到预测框相对于ROI的偏移即可。在R-FCN中,检测模块是一个平行于分类模块的分支,它的输出特征图的通道数为4×k2。通过ROI池化我们可以得到大小为k×k、通道数为4的特征图,最后通过取均值的方式得到长度为4的特征向量,向量的值代表了预测框相对于ROI的位置偏移。

图1.20 图解位置敏感ROI池化的过程(k=3)

3.R-FCN的训练

R-FCN也采用了分类和回归的多任务损失函数:

  (1.14)

其中,c*表示分类得到的ROI的类别,t是目标物体的真值框。是一个二值函数,它表示如果括号内的判断正确,结果为1,否则结果为0。λ为多任务的比重,是一个需要根据模型的收敛效果调整的超参数,论文的实验中其值是1。Lcls为分类损失函数,使用的是交叉熵损失函数,表示为Lreg为检测框回归损失函数,使用的是Fast R-CNN和Faster R-CNN均采用的Smooth L1损失。

在R-FCN中训练时使用了在线难负样本挖掘(online hard example mining,OHEM)[20]的策略,得益于位置敏感区域的高效性,OHEM在这里的速度也得到了很大的提升。假设我们在训练过程中每个输入图像通过RPN得到N个ROI,在前向传播的过程中我们会计算所有N个ROI的位置敏感得分。然后根据它们的损失值对这N个ROI进行排序,从中选择B个损失值最高的ROI进行反向传播的计算。

[20] 参见Abhinav Shrivastava、Abhinav Gupta、Ross Girshick的论文“Training Region-based Object Detectors with Online Hard Example Mining”。

4.R-FCN的推理

在R-FCN中,输入图像的短边先被缩放到了600,然后通过RPN产生300个候选区域,最后使用IoU阈值为0.3的NMS进行后处理,得到最终的检测结果。

1.5.3 R-FCN结果可视化

图1.21中的R-FCN结果可视化展示了R-FCN的桶的工作原理。如果ROI能够比较精确地框住物体的位置(图1.21(a)),那么每个桶对应的特征图都应该能得到非常高的响应;如果ROI (图1.21(b))的定位不是非常准确,部分桶的响应就不是非常明显,那么通过投票或者求均值的方法便能筛选出更精确的检测框。

图1.21 R-FCN结果可视化

1.5.4 小结

R-FCN是在Faster R-CNN的基础上,把RPN之后的基于全连接的计算方式使用投票的方式来替代。这么做的好处有两点:一是将计算量均集中在RPN部分,大幅提升了模型的计算速度;二是恢复了全连接破坏的位置敏感性。R-FCN的提出受了分割算法很大的启发,尤其是FCN的全卷积思想和DeepLab的空洞卷积思想。

1.6 Mask R-CNN

在本节中,先验知识包括:

Faster R-CNN (1.4节);        SSD(2.2节);

FCN(6.1节)。

我非常喜欢何恺明的论文,他的论文的思路通常非常简单,但是能精准地找到问题的根源,进而有效地解决问题。无论是著名的残差网络还是Mask R-CNN,何恺明的论文尽量遵循着这一思想。霍金在《时间简史》中说“书里每多一个数学公式,你的书就会减少一半读者”。Mask R-CNN的论文中更是一个数学公式都没有,而是通过对问题的透彻的分析,提出针对性非常强的解决方案。下面我们来一睹Mask R-CNN的真容。

1.6.1 Mask R-CNN的动机

目标检测和实例分割是计算机视觉领域非常经典的两个重要应用,而且它们都需要对目标物体进行细粒度的分析。很自然地会想到,结合这两个任务不仅可以使模型同时具有目标检测和实例分割两个功能,还可以使两个功能互相辅助,共同提高模型精度,这便是提出Mask R-CNN的动机。Mask R-CNN的结构如图1.22所示。

图1.22 Mask R-CNN的结构

如图1.22所示,Mask R-CNN的流程分成两步:

(1)使用RPN产生候选区域;

(2)分类、检测框预测、实例分割的多任务预测。

在1.3节中,我们介绍了Fast R-CNN采用ROI池化来处理候选区域尺寸不同的问题。对于实例分割任务,一个非常重要的要求便是特征层和输入层像素的一一对应,ROI池化显然不满足该要求。为了解决这个问题,Mask R-CNN提出了ROI池化更适配与分割任务的ROI对齐,从而使Faster R-CNN的特征层也能进行实例分割。

1.6.2 Mask R-CNN详解

1.骨干网络(FPN)

我们介绍过CNN的一个重要特征:深层网络容易响应语义特征,浅层网络容易响应图像特征。但是到了目标检测方向,这个特征便成了一个重要的问题,深层网络虽然能响应语义特征,但是由于特征图的尺寸较小,含有的几何信息并不多,不利于目标检测;浅层网络虽然包含比较多的几何信息,但是图像的语义特征并不多,不利于目标的分类,这个问题在小尺寸目标检测上更为显著,这也是目标检测算法对小目标检测效果普遍不好的重要原因之一。很自然地可以想到,使用合并了的深层和浅层特征来同时满足分类和检测的需求。Mask R-CNN的骨干网络使用的是FPN[21]。FPN使用的是特征金字塔的思想,以解决目标检测场景中小尺寸目标检测困难的问题。

[21] 参见Tsung-Yi Lin、Piotr Dollár、Ross Girshick等人的论文“Feature Pyramid Networks for Object Detection”。

2.两步走策略

Mask R-CNN采用了和Faster R-CNN相同的两步走策略,即先使用RPN提取候选区域。不同于Faster R-CNN中使用分类和回归的多任务回归,Mask R-CNN在其基础上并行添加了一个用于实例分割的掩码(mask)损失函数,所以Mask R-CNN的损失函数可以表示为式(1.15):

  (1.15)

式(1.15)中,Lcls表示检测框的分类损失值,Lbox表示预测框的回归损失值,Lmask表示掩码部分的损失值,如图1.23所示。在这里Mask R-CNN使用了近似联合训练,所以损失函数也会加上RPN的分类损失和回归损失。LclsLbox的计算方式与Faster R-CNN相同,下面我们重点讨论掩码损失:Lmask

图1.23 Mask R-CNN的损失函数

Mask R-CNN将目标分类和实例分割任务进行了解耦,即每个类单独预测一个二值掩码,这种解耦提升了实例分割的效果。从表1.2来看,提升效果还是很明显的,其中AP为平均准确率。

表1.2 Mask R-CNN解耦为分割带来的精度提升

损失函数

AP

AP50

AP75

softmax

24.8

44.1

25.1

sigmoid

30.3

51.2

31.5

+5.5

+7.1

+6.4

所以,Mask R-CNN基于FCN将ROI映射成一个m×m×nb_class的特征层,例如图1.23中的28×28×80。由于每个候选区域的分割是一个二分类任务,因此Lmask使用的是二值交叉熵损失函数。

loss = K.switch(tf.size(y_true) > 0,
              K.binary_crossentropy(target=y_true, output=y_pred),
              tf.constant(0.0))

3.ROI对齐

ROI对齐的提出是为了解决Faster R-CNN中ROI池化的区域不匹配的问题,下面我们来举例说明什么是区域不匹配。ROI池化的区域不匹配问题是由ROI池化过程中的取整操作产生的(见图1.24),我们知道ROI池化是Faster R-CNN中必不可少的一步,因为其会产生长度固定的特征向量,有了长度固定的特征向量才能用softmax计算分类损失。

图1.24 ROI池化的区域不匹配问题

如图1.24所示,输入是一幅800×800的图像,经过一个有5次降采样的CNN,得到大小为25×25的特征图。图中的ROI大小是600×500,经过网络之后对应的区域为,由于无法整除,ROI池化采用向下取整的方式,进而得到ROI的特征图的大小为18×15,这就造成了第一次区域不匹配。

ROI池化的下一步是对特征图分桶,假如我们需要一个7×7的桶,每个桶的大小约为,由于不能整除,ROI池化同样采用了向下取整的方式,从而每个桶的大小为2×2,即整个ROI的特征图的尺寸为14×14。第二次区域不匹配问题因此产生。

对比ROI池化之前的特征图,ROI池化在横向和纵向分别产生了4.75(18.75-14)和1.625(15.625-14)的误差,对于目标分类或者目标检测场景,这几像素的位移或许对结果影响不大,但是分割任务通常要精确到每像素,因此ROI池化是不能应用到Mask R-CNN中的。

为了解决这个问题,Mask R-CNN提出了ROI对齐。ROI对齐并没有取整的过程,可以全程使用浮点数操作,具体步骤如下:

(1)计算ROI的边长,边长不取整;

(2)将ROI均匀分成k×k个桶,每个桶的大小不取整;

(3)每个桶的值为其最邻近的特征图的4个值通过双线性插值(附录A)得到;

(4)使用最大池化或者平均池化得到长度固定的特征向量。

ROI对齐可视化如图1.25所示。

图1.25 ROI对齐可视化

ROI对齐操作通过tf.image.crop_and_resize 函数便可以实现。由于Mask R-CNN使用了FPN作为骨干网络,因此将循环保存每次池化之后的特征图。

tf.image.crop_and_resize(feature_maps[i], level_boxes, box_indices, self.
    pool_shape, method="bilinear")

1.6.3 小结

Mask R-CNN是一个多个主流算法的合成体,并且非常巧妙地设计了这些模块的合成接口:

使用残差网络作为卷积结构;

使用FPN作为骨干网络;

使用Faster R-CNN的目标检测流程,即RPN+Fast R-CNN;

增加实例分割。

Mask R-CNN的主要的创新点有:

将FCN和Faster R-CNN合并,通过构建一个三任务的损失函数来优化模型;

使用ROI对齐优化了ROI池化,解决了Faster R-CNN在分割任务中的区域不匹配问题。

1.7 MaskX R-CNN

在本节中,先验知识包括:

Mask R-CNN(1.6 节);       YOLOv2(2.3节)。

YOLO9000[22]通过半监督学习的方式将模型可检测的类别从80类扩展到了9418类,YOLO9000类别扩展有效的原因之一是目标分类和目标检测使用了共享的特征,而这些特征是由分类和检测的损失函数共同训练得到的。采用半监督学习的方式训练YOLO9000的一个重要原因就是检测数据价格高昂。所以,YOLO9000采用了数据量较小的COCO的检测标签、数据量很大的ImageNet的分类标签作为半监督学习的样本,分别训练多任务模型的检测分支和分类分支,进而得到了可以同时进行分类和检测的特征。

[22] 参见Joseph Redmon、Ali Farhadi的论文“YOLO9000: Better, Faster, Stronger”。

之所以先介绍YOLO9000,是因为本节要分析的MaskX R-CNN[23]和YOLO9000的动机和设计有很多相同点。

[23] 参见Ronghang Hu、Piotr Dollár、Kaiming He等人的论文“Learning to Segment Every Thing”。

它们都是在多任务模型中使用半监督学习来完成自己的任务的:YOLO9000用来做检测,MaskX R-CNN用来做实例分割。

使用半监督学习:因为它们想将目标类别扩展到更广的范围,所以面临数据量不够的问题,对比检测任务,实例分割的数据集更为稀缺(COCO的80类,PASCAL VOC的20类),但是Visual Genome(VG)[24]数据集有3000类108 077张带有目标框的样本。

[24] 参见Ranjay Krishna、Yuke Zhu、Oliver Groth等人的论文“Visual Genome: Connecting Language and Vision Using Crowdsourced Dense Image Annotations”。

它们的框架算法都继承自另外的框架:YOLO9000继承自YOLOv2,MaskX R-CNN继承自Mask R-CNN。

不同于YOLO9000通过构建WordTree的数据结构来使用两个数据集,MaskX R-CNN提出了一个叫作权值迁移函数(weight transfer function)的迁移学习方法,将目标检测的特征迁移到实例分割任务中,进而实现了对VG数据集中3000类样本的实例分割。这个权值迁移函数便是MaskX R-CNN的精华所在。

1.7.1 权值迁移函数T

MaskX R-CNN基于Mask R-CNN(见图1.22)。Mask R-CNN通过向Faster R-CNN中添加一个分割的分支任务来达到同时进行实例分割和目标检测的目的。在RPN之后,FCN和Fast R-CNN是完全独立的两个模块,此时若直接采用数据集C分别训练两个分支的话是行得通的,其实这就是YOLO9000的训练方式。

但是MaskX R-CNN不会这么简单就结束的,它在检测分支(Fast R-CNN)和分割分支中间加了一条叫作权值迁移函数的线路,用于将检测的信息传播到分割任务中,如图1.26所示。

图1.26 MaskX R-CNN检测以及分割流程

图1.26所示的整个流程是搭建在Mask R-CNN之上的,除了最重要的权值迁移函数,还有几点需要强调一下:

T的输入参数是权值(图1.26中的两个八边形),而非特征图;

虽然Mask R-CNN中解耦了分类和分割任务,但是权值迁移函数T是类别无关的。

对于一个类别c表示检测任务的权值,表示分割任务的权值。权值迁移函数将看作自变量,看作因变量,学习两个权值的映射函数T

  (1.16)

其中,θ是类别无关的、可学习的参数。T可以使用一个小型的MLP。可以是分类的权值、检测框的预测权值或是两者拼接到一起

1.7.2 MaskX R-CNN的训练

如果将含有分割标签和检测标签的COCO数据集定义为A,只含有检测标签的VG数据集定义为B,则所有的数据集C便是AB的并集:。图1.26显示MaskX R-CNN的损失函数由Fast R-CNN的检测任务和RPN的分类任务组成。当训练检测任务时,使用数据集C;当训练分割任务时,仅使用包括分割标签的COCO数据集,即A

当训练MaskX R-CNN时,我们有两种训练方式。

多阶段训练。先使用数据集C训练Faster R-CNN,得到,然后固定和卷积部分,再使用A训练T和分割任务的卷积部分。在这里可以看作分割任务的特征向量。在Fast R-CNN中就指出多阶段训练的模型不如端到端训练的效果好。

端到端联合训练。理论上是可以直接在数据集C上训练检测任务,在A上训练分割任务的,但是这会使模型偏向于A,这个问题在论文中叫作出入(discrepency)。为了解决这个问题,MaskX R-CNN在反向计算掩码损失函数时停止相关的梯度更新,只更新权值迁移函数中的θ

1.7.3 小结

仿照YOLO9000的思路,MaskX R-CNN使用半监督学习的方式将分割类别扩大到3000类。采用WordTree将分类数据添加到Mask R-CNN中,将分割类别扩大到ImageNet中的类别在未来应该是一个不错的研究方向。更精确、更快的权值迁移函数也是一个非常有研究前景的研究方向,毕竟去掉低效的全连接层也是现在计算机视觉领域的一个趋势。

1.8 DCNv1和DCNv2

在本节中,先验知识包括:

R-CNN(1.1节);            R-FCN(1.5节);

Fast R-CNN(1.3节);          DeepLab(6.4节);

Faster R-CNN(1.4节)。

在目标检测场景中,一个待检测的物体可能有各种形状,识别同一个物体的不同形状是目标检测任务中一项极具挑战性的工作,传统的解决这个问题的策略通常分为两类。

通过对输入图像施加大量不同的数据扩充策略来增强模型对这类数据的学习能力。这类方法的问题一是人工设计扩充策略是非常复杂的,二是一些复杂变化的场景是很难编码成扩充策略的。

设计一些具有不变性的算法,例如CNN的位移不变性等。这类方法的难点在于卷积核设计以及学习的复杂性。

可变形卷积网络(DCN)系列算法的提出旨在增强模型学习复杂的目标不变性的能力。在DCNv1中包含可变形卷积(deformable convolution)和可变形池化(deformable pooling)两个模块。在DCNv2中,DCNv1为这两个可变形模块添加了权重模块,增强了可变形卷积网络对重要信息的捕捉能力。

1.8.1 DCNv1

1.可变形卷积

DCNv1的核心思想在于它认为卷积核不应该是一个简单的矩形,而且在不同的阶段,不同的特征图甚至不同的像素上都可能有其最优的卷积核结构。因此,DCNv1提出为卷积核上的每个点学习一个偏移(offset),然后可以根据不同的数据学习不同的卷积核结构,如图1.27所示。图1.27(a)所示是标准的3×3卷积核,图1.27(b)、图1.27(c)、图1.27(d)所示是给普通卷积核加上偏移之后形成的可变形的卷积核,其中蓝色的是新的卷积核点,箭头是位移方向。

图1.27 可变形卷积核

所以,可变形卷积的核心操作有3个:

计算卷积核的位移;

根据新的卷积核生成新的特征图;

为了保证模型是可端到端学习的,上述两个操作应该是可导的。

可变形卷积的流程如图1.28所示,它首先通过一个作用在输入特征图的卷积操作得到一组卷积核偏移的预测结果,这个反映偏移的特征图(偏移野)的尺寸和输入特征图的尺寸相同。偏移特征图的通道数为2N,其中2是指每个偏移坐标是(x, y)两个值,N是卷积核的像素数,例如当卷积核的大小是3×3时,N=9。从这里可以看出,DCNv1是为输入特征图的每像素学习一组偏移,同一个特征图的不同通道数使用相同的预测偏移。

图1.28 可变形卷积的流程

对于一个普通卷积,它的计算可以概括成以下两步。

从输入特征图上采样一组像素R,例如一个3×3卷积的采样结果可以表示为R={(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 0), (0, 1), (1, -1), (1, 0), (1, 1)}。

使用卷积操作对采样的结果进行计算,得到卷积之后的结果,表示为式(1.17):

  (1.17)

对于一个可变形卷积,它不是直接改变卷积核的形状,而是对采样的结果进行修改,从而间接实现改变卷积核形状的效果。在可变形卷积中,我们可以使用对特征图上的一点pn进行扩充,其中,是图1.28上侧我们通过卷积操作预测的卷积核偏移值。此时可变形卷积的计算方式为:

  (1.18)

因为我们是使用卷积操作来预测偏移的,得到的偏移值往往是一个小数,无法直接从输入特征图上进行采样,所以DCNv1采用了双线性插值的采样方法,即当前采样的像素的值取决于偏移之后这个浮点位置周围的4个整数邻居。

2.可变形ROI池化

ROI池化是在Fast R-CNN中引入的,它通过将输入特征图均匀地划分成k×k个小区域,然后在每个区域上取最大值或均值得到。这里以均值为例,ROI 池化可以表示为式(1.19):

  (1.19)

其中nij是一个区域中的像素数,第(i, j)个区域的范围是以及

可变形ROI池化的原理和可变形卷积类似,它是通过为每个区域中的每像素学习一个偏移来间接地达到可变形池化的目的,表示为式(1.20):

  (1.20)

图1.29展示了可变形ROI池化的学习过程,它首先通过ROI池化得到大小为k×k的特征图,然后通过一个全连接层得到归一化之后的偏移,再将其与输入特征图的宽和高进行点乘(),最后乘尺度系数γ便可以得到实际的偏移结果,表示为式(1.21):

  (1.21)

其中γ是需要预先定义好的尺度系数,论文中给出的值是1。

图1.29 可变形ROI池化的学习过程

3.可变形位置敏感ROI池化

位置敏感ROI池化是在R-FCN中提出的,它的目的是解决分类网络的位移不变性和检测网络中的位移可变性之间的矛盾。位置敏感ROI池化的输入特征图的通道数是k2(C+1),其中C+1是C类物体和1类背景。对于每个ROI,它的k2(C+1)个特征图会被拆分成k2组,每组负责对一个特定区域的位置“敏感”。例如,当k=3时,这9个敏感区域依次是左上、正上、右上、左中、正中、右中、左下、正下、右下,如图1.20所示。例如,深蓝色的那组特征图负责对待检测物体的左上角恰好在ROI的左上角的情况进行响应,如果ROI正好框住待检测物体,那么9个区域便都可以得到很高的响应,所以在R-FCN中我们可以根据投票结果来确定目标类别和预测框。

在R-FCN中,我们可以通过投票的方式得到物体的类别和预测框,同样也可以使用投票的方式预测每个区域的偏移。当我们将可变形卷积应用到位置敏感池化时,它的计算方式如式(1.22),即为每像素都学习一个位置敏感的池化偏移。

  (1.22)

和R-FCN相同的是,可变形位置敏感ROI池化的偏移的计算使用了全卷积的结构,如图1.30所示。在图1.30上面的分支中,我们通过一个全卷积网络得到每个ROI的归一化位置偏移,然后通过式(1.19)得到真正的偏移。

图1.30 可变形位置敏感ROI池化的计算流程

4.可变形卷积网络

目标检测网络或者分割网络往往可以分成两个部分:特征提取模块和输出模块。其中,特征提取模块可以是各种分类网络。在特征提取模块替换方案中,每个特征网络的后面3个普通的3×3卷积被替换为了可变形卷积。而在输出模块,我们可以根据不同的算法采用不同的可变形模块。例如,在Faster R-CNN中,我们可以使用可变形ROI池化替换Faster R-CNN中的ROI池化,而在R-FCN中,我们可以使用可变形位置敏感ROI池化替换位置敏感ROI池化。

1.8.2 DCNv2

在DCNv2的论文中,使用了非常直观的可视化方法来分析DCNv1的背后原理以及DCNv1的缺陷。DCNv1的问题在于因引入了偏移模块,导致引入了过多无关的上下文,而这些无关的上下文对模型是有害的。图1.31展示的是DCNv1在检测不同大小物体时在感受野分布、采样点以及最小响应区域的情况。从图1.31中我们可以看出,DCNv1会增加很多无关信息。DCNv2的提出动机便是减少DCNv1中无关的干扰信息,提高模型对不同几何变化的适应能力。

DCNv2总共有3项重要改进:

增加更多的可变形卷积层;

除了让模型学习采样点的偏移,还要学习每个采样点的权重,这是对减轻无关因素干扰最重要的工作;

使用R-CNN对Faster R-CNN进行知识蒸馏。

图1.31 DCNv1的感受野分布、采样点以及最小响应区域的可视化结果

1.更多的可变形卷积层

DCNv2将ResNet-50的第3个卷积到第5个卷积的网络块的3×3卷积全部替换为了可变形卷积,因此可变形卷积层数达到了12。这一操作使得网络在场景更复杂的COCO数据集上有着比较明显的性能提升。

2.加权采样点偏移

在式(1.18)的基础上,DCNv2为每个采样点又添加了一个可以学习的权重系数∆m,表示为式(1.23)。其中,是一个[0,1]的小数。因为加入了一个新的要学习的参数,因此图1.28所示可变形卷积的预测结果的通道数变成了3N

  (1.23)

同理,式(1.22)的可变形ROI池化可乘这个权重,表示为式(1.24):

  (1.24)

3.R-CNN 特征模拟

在Revisiting R-CNN[25]论文中,介绍了如何使用R-CNN进一步提升Faster R-CNN的泛化能力。论文中指出,Faster R-CNN有以下3个问题。

[25] 参见Bowen Cheng、Yunchao Wei、Honghui Shi等人的论文“Revisiting RCNN: On Awakening the Classification Power of Faster RCNN”

目标检测的检测网络和分类网络共享了模型的骨干网络,而这两个任务中一个要求模型具有位移不变性,另一个要求模型具有位移敏感性,因此需要将这两个任务解耦。

Faster R-CNN的多任务的损失函数会使模型陷入局部最优,忽略对另一个任务的优化,导致产生检测得很准但是类别识别错误,或者分类错误但是检测框有很大偏差等情况。

Faster R-CNN的感受野过大,造成当我们分类小尺寸目标时会有过多的无关上下文的干扰,影响小尺寸目标的检测效果。

为了解决Faster R-CNN的上面3个问题,Revisiting R-CNN论文中提出了一个名为解耦分类微调(decoupled classification refinement,DCR)的模块,它的结构如图1.32所示。它的左侧是一个Faster R-CNN,其中假阳性样本会被送到右侧的R-CNN中再次学习。在DCR中,Faster R-CNN主要负责检测,而R-CNN主要负责分类,这实现了检测任务和分类任务的解耦。Faster R-CNN的假阳性样本是直接从原图上裁剪的,然后调整成固定尺寸的大小,这样图像的感受野不会变得很大,减少了无关因素对分类模型的负面影响。虽然DCR有提升,但是在Faster R-CNN的基础上又添加了一个R-CNN模块,模型训练速度会变得非常慢,所以之后又提出了DCRv2[26]。这里我们只需要知道Faster R-CNN的上述3个问题可以通过R-CNN来进行优化。

[26] 参见Bowen Cheng、Yunchao Wei、Rogerio Feris等人的论文“Decoupled Classification Refinement: Hard False Positive Suppression for Object Detection”。

图1.32 DCR模块的结构

DCNv2中使用了特征模仿(feature mimicking)的方式来用R-CNN指导Faster R-CNN的优化。特征模仿是一个比较高级的模型迁移策略,它主要用在知识蒸馏中。它先训练一个准确率比较高但是速度比较慢的大容量的教师(Teacher)网络,然后训练一个速度快但是泛化能力略差的小容量的学生(Student)网络。在训练学生网络的过程中,模型不仅要优化它本身任务的损失函数,还要以教师网络学习到的特征为目标,优化它中间的特征层。因为学生网络的参数数量是固定的,所以通过这个策略优化之后的学生网络不仅速度很快,而且能够达到接近教师网络的准确率。

DCNv2使用R-CNN来指导加入了可变形卷积的Faster R-CNN训练的目的是使可变形卷积能够自行学到更好的采样点的偏移和权重,从而减小无关因素对模型的负面影响。

DCNv2的特征模仿模块的结构如图1.33所示。它的结构和DCR的类似,即左侧是一个Faster R-CNN,右侧是一个R-CNN。从图1.33中我们可以看出两个网络都加入了可变形卷积和可变形ROI池化(都添加了权重)。首先,我们通过Faster R-CNN的RPN模块可以得到若干候选区域。然后,这些候选区域会被缩放到224×224的大小提供给右侧的R-CNN模块。最后,经过两个全连接层,两个网络得到各自的1024维的特征向量,其中Faster R-CNN使用它进行分类和检测,而R-CNN则只使用它进行分类。

图1.33 DCNv2的特征模仿模块的结构

DCNv2的特征模仿模块就作用在这个特征向量上,它通过最小化两个特征的余弦距离来构建模仿损失,表示为式(1.25):

  (1.25)

其中是从RPN采样的ROI。

1.8.3 小结

可变形卷积是深度学习中非常重要的一个算法,被广泛地应用到检测和分割任务中,是每个计算机视觉领域的人都要学习的一个算法。对卷积核的形状的探讨一直是深度学习领域非常重要的方向,比较有代表性的有Inception中提出的N×1和1×N的卷积核,以及DeepLab中提出的空洞卷积。而本节介绍的可变形卷积是一个可以学习的卷积操作,它能够根据数据自适应不同的卷积形状,此处的创新性再怎么赞美都不过分,更何况它的使用确实能够帮助模型大幅提升性能。

DCN目前的问题是工业化程度并不高,很多时候需要单独编译源码才能应用,增加了它的部署难度。期待DCN系列也能够像其他模块一样加入现有的深度学习框架中,且能够快速地部署和量化。

相关图书

大语言模型:基础与前沿
大语言模型:基础与前沿
动手学自然语言处理
动手学自然语言处理
智能驾驶之激光雷达算法详解
智能驾驶之激光雷达算法详解
高级算法和数据结构
高级算法和数据结构
互联网大厂推荐算法实战
互联网大厂推荐算法实战
动手学数据结构与算法
动手学数据结构与算法

相关文章

相关课程