香港中文大学陈恺:物体检测算法的近期发展及开源框架介绍
雷锋网 AI 科技评论按: 物体检测是计算机视觉的基础任务之一。香港中文大学多媒体实验室博士生陈恺在 AI 研习社的公开课上,为大家总结了深度学习背景下物体检测算法的发展,分享 COCO 比赛冠军团队所使用的算法,并介绍由港中大多媒体实验室开源的物体检测算法框架 mmdetection。
公开课回放视频网址:
https://www.mooc.ai/open/course/604?=chenkai
分享嘉宾:
陈恺,香港中文大学多媒体实验室博士生,COCO 2018 Instance Segmentation Challenge 冠军团队成员。
分享主题:物体检测算法的近期发展及开源框架介绍
分享提纲:
1. 深度学习背景下物体检测算法的发展
2. COCO 2018 Instance Segmentation 冠军团队算法分享
3. 开源物体检测框架 mmdetection 及 Open-MMLab 计划介绍
雷锋网 (公众号:雷锋网) AI 研习社将其分享内容整理如下:
我叫陈恺,来自香港中文大学多媒体实验室。我 2015 年从清华大学自动化系本科毕业,之后进入香港中文大学多媒体实验室读博,现在是博士四年级,导师是林达华老师。研究方向主要是物体检测、视频分析。
今天我报告的题目是《物体检测算法的近期发展》。
深度学习背景下物体检测算法的发展
对于物体检测,有的人可能比较了解,有的人可能还不怎么清楚,这里我借用 COCO dataset 论文(论文查看地址: https://arxiv.org/pdf/1405.0312.pdf )里面的 4 张图来形象地介绍一下相关的任务:
Image classification:图像分类,这个任务指的是给出一张图片,要识别出哪张图片属于哪个类别。
Object detection:物体检测,这个任务除了需要识别出图片属于哪个类别,还需要对相应的物体进行具体位置的定位,我们通常用矩形框来框出这个物体。
Semantic segmentation:语义分割,这个任务是指对图片中的每个 pixel 打上标签,比如这里要给它们打上 person、sheep、dog 的标签,需要进行非常精细的分类。
Instance segmentation:实例分割,可以理解为进行物体检测后,对每个矩形框中的物体进行语义分割,该任务除了需要找到物体的类别和位置之外,还需要分辨出不同物体的 pixel。
下面用这个案例来说明物体检测和实例分割之间的区别:
(关于这个案例的具体讲解,请回看视频 00:04:05-00:05:35 处)
接下来介绍一下物体检测在深度学习出现以来的发展情况。
上面绿色的字体表示的是 Two-stage Detector 的发展历程,当然还有很多其他的方法,这里列出的是一些比较有代表性的方法。
-
2014 年有一项很重要的工作是 R-CNN,它是将物体检测首次应用于深度学习中的一篇论文,引用量非常高,影响也非常广泛。它的主要思路是将物体检测转化为这么一个问题:首先找到一个 region(区域),然后对 region 做分类。之后作者又提出了 Fast R-CNN,它是一个基于 R-CNN 的算法,运算速度显著提高。
-
2015 年,这一群人又提出了 Faster R-CNN,它在速度上相比 Fast R-CNN 有了更大的提高,主要是改进了怎样在 Fast R-CNN 和 R-CNN 中找 region 的过程,Faster R-CNN 也是用深度学习的方法得到一些 region(称之为 proposal),然后再用这些 proposal 来做分类。虽然距离 Faster R-CNN 的提出已经三年多了,但它依旧是使用非常广泛的一种算法。
-
2016 年,代季峰等人提出了 R-FCN,它在 Faster R-CNN 的基础上进行了改进,当时它在性能和速度都有非常大的提高。
-
2017 年有两篇影响力非常大的论文,FPN 和 Mask R-CNN。FPN 也就是 Feature Pyramid Network,它相当于生成了 feature pyramid,然后再用多个 level 的 feature 来做 prediction。Mask R-CNN 这篇论文获得了 ICCV 2017 的最佳论文,由何恺明他们提出,其在 Faster R-CNN 基础上增加了 mask branch,可以用来做实例分割,同时因为有 multi-task learning,因此它对物体框的性能也有很大的提高。
-
2018 年,沿着 Faster R-CNN 这条路线提出的方法有 Cascade R-CNN,它将 cascade 结构用在了 Faster R-CNN 中,同时也解决了一些 training distribution 的一些问题,因此它的性能是比较高的。另外还有两篇比较重要的论文——Relaiton Network 和 SNIP。
下面蓝色字体表示的 Single-stage Detector 的发展历程:2014 年的 MultiBox 是非常早期的工作;2016 年提出了 SSD 和 YOLO,这两篇论文是 Single-stage Detector 中的代表作;2017 年提出了 RetinaNet(当时 Single-stage Detector 中性能最高的方法)和 YOLO v2;2018 年有一个新的思路,提出了 CornerNet,把物体检测看成一堆点的检测,然后将这些点 group 起来,我们下面会详细讲到它。
下面会讲一下物体检测近期(2017 年以来)的工作。由于 Faster R-CNN 是很多方法的基础,我们首先会介绍一下这个方法。
在此之前,先讲一下物体检测一般的 pipeline。下图是一个 Two-stage Detector,它的 pipeline 首先有一张图片,之后的步骤共分为三个部分:
第一部分是 Feature generation:首先图片经过 backbone(分类网络)后,会生成 feature; 之后 feature 或者直接进行 prediction,或者再过一个 neck 进行修改或增强;
第二部分是 Region proposal:这个部分是 Two-stage Detector 的第一个 stage,其中会有一堆 sliding window anchor(预先定义好大小的框),之后对这些框做 dense 的分类和回归;接着再筛除大部分 negative anchor,留出可能是物体的框,这些框称之为 proposal;
第三个部分是 Region recognition:有了 proposal 后,在 feature map 上利用 Rol feature extractor 来提取出每一个 proposal 对应的 feature(Rol feature),最后会经过 task head。
相对来说,Single-stage Detector 的 pipeline 比较简单。
图片首先经过 feature generation 模块,这里也有 sliding window anchor,但是它们不是用来生成 proposal 的,而是直接用于做最终的 prediction,通过 dense 的分类和回归,能直接生成最终的检测结果。
(对于该部分的具体讲解,请回看视频 00:12:00:00:16:25 处)
Faster R-CNN
Faster R-CNN 是 Two-stage Detector 工作的基础,它主要提出了两个东西:
RPN:即 Region Proposal Network,目前是生成 proposal 的一个标准方式。
Traning pipeline:主要讲的是 Two-stage Detector 应该怎样 train,论文里给出的是一种交替的方法。
(关于 Faster R-CNN 的具体讲解,请回看视频 00:17:00:00:21:45 处)
FPN
FPN(Feature Pyramid Network)主要也是提出了两项重要的思路:Top-down pathway 和 Multi-level prediction。
下图中的 4 张图代表了基于单个或多个 feature map 来做预测的 4 种不同的套路:
具体实现如下图所示:
(关于 FPN 的具体讲解,请回看视频 00:22:35-00:25::45 处)
Mask R-CNN
Mask R-CNN 主要也有两点贡献:
RoIAlign:在 Mask R-CNN 之前,大家用得比较多的是 Rol Pooling,实现过程是:给出一个框,在 feature map 上 pool 出一个固定大小的 feature,比如要 pool 一个 2×2 的 feature,首先把这个框画出 2×2 的格子,每个格子映射到 feature map,看它覆盖了多少个点,之后对这些点做 max pooling,这样就能得出一个 2×2 的 feature。它的劣势是如果框稍微偏一点,得出的 feature 却可能是一样的,存在截断误差。Rol Align 就是为了解决这一问题提出的。Rol Align 并不是直接对框内的点做 max pooling,而是用双线性插值的方式得到 feature。其中还有一步是:在 2×2 的每个框中会选择多个点作为它的代表,这里选择了 4 个点,每个点分别做双线性插值,之后再让这 4 个点做 max/average pooling。
Mask branch:它是一个非常精细的操作,也有额外的监督信息,对整个框架的性能都有所提高。它的操作过程如下图所示:
(关于 Mask R-CNN 的具体讲解,请回看视频 00: 26:55:00:30:20 处)
Cascade R-CNN
Cascade R-CNN 是目前 Faster R-CNN 这条线中较新的方法。这个方法也提出了两点贡献:一是提出了使用 cascade architecture;二是提出了怎样来适应 training distribution。
Cascade architecture :这个框架不是特别新的东西,之前也有类似的结构。下图左边是 Faster R-CNN,右边是 Cascade R-CNN。其中 I 代表图像或者图像生成的 feature map,H0 是 RPN,B 是 bounding box regression,C 是 classification。经过 RPN 得到的 proposal 再做 pooling 后,会有分类和回归这两个 prediction。
Cascade R-CNN 的结构是,在经过第一次分类和回归之后,会用得到 bounding box 再来做一次 pooling,然后对这些框做下一阶段的分类和回归,这个过程可以重复多次。但如果仅仅使用 Cascade R-CNN 而不做其他改变,Cascade R-CNN 带来的提高是非常有限的。
我认为 Cascade R-CNN 提出了一个很好的 motivation,这是它比较有意义的一个地方。它研究了一下采用不同的 IoU 阈值来进行 training 的情况下,Detector 和 Regressor 的性能分布。如下图所示:
基于此,Cascade R-CNN 就提出了在不同的 stage 怎样进行训练的问题。下图是 3 个 stage 的框的分布:
结果显示,越往后的 stage,它的高 IoU 的框就越多。所以在 Cascade R-CNN 中,第 1 个 stage 用的是传统的 0.5 的阈值;第 2 个 stage 用的是 0.6 的阈值;第 3 个 stage 用的是 0.7 的阈值。这篇论文的核心思想是,training distribution 在不同的 stage 需要随着 sample distribution 来改变的。
(对于 Cascade R-CNN 的具体讲解,请回看视频 00: 30:30-00:35:30 处)
RetinaNet
RetinaNet 是 Singe-stage Detector 目前比较重要的一项工作,它可以看做是由 FPN+Focal Loss 组成的,其中 FPN 只是该论文中用到的架构,而 Focal Loss 则是本论文主要提出的工作。
RetinaNet 结构如下:
RetinaNet 的结构 和 SSD 非常类似,只不过它用的是 ResNet,并在 ResNet 上加入了 FPN 的结构,每一层都有两个分支:一个用来做分类;另一个用来做框回归。此外它的每个 head 都比 SSD 和 Faster R-CNN 都要大一点,这样的话,它的参数量比较大,计算速度也比较慢。
而 Focal Loss 试图解决的问题是 class imbalance。针对 class imbalance 的问题,Two-stage Detector 一般是通过 proposal、mini-batch sampaling 两种方式来解决的;SSD 是通过 hard negative mining 来解决的;而 RetinaNet 则通过 Focal Loss 来解决该问题。
Focal loss 的核心思路是:对于 high confidence 的样本,给一个小的 loss——这是因为正负样本不平衡,或者说是由于 class imbalance 导致了这样的问题:比如说正负样本的比例是 1:1000,虽然负样本的 loss 都很小,但数目非常多,这些负样本的 loss 加起来的话,还是比正样本要多——这样的话,负样本就会主导整个框架。其具体公式表示如下图所示:
(关于 RetinaNet 更详细的讲解,请回看视频 00:35:55-00 :40:45 处)
Relation Network
在 Relation Network 之前的大部分 detectcor,在做 prediction 或 training 的时候通常只考虑到当前这一个框,而 Relation Network 提出还要考虑这个框周围的框,并基于此提出了一个 relation module,可以插在网络的任何位置,相当于是 feature refinement。Relation module 如下图所示:
它的核心思想是:当前框的 feature 除了由当前框决定之外,还要考虑当前框和周围框及其它框的关系,具体怎样计算,大家感兴趣的话可以阅读论文原文了解。
SNIP
SNIP(Scale Normalization for Image Pyramids)是我认为另一篇比较有启发性的工作。它提出的问题是:在 train 分类器的时候,究竟是要 scale specific 还是 scale invariant。传统的 detector 通常会选择 scale invariant,但 SNIP 研究了一下之前的方法后,发现之前的训练方式得到的 feature 对 scale 并没不是很 robust,因而提出要尽量减少 scale 的 variance,让训练时的 scale 尽可能地相似。
SNIP 结构图如下:
CornerNet
CornerNet,是 Singe-stage Detector 中比较新的方法,其与其他方法最不一样的地方是:之前的方法会在图像上选出框,再对框做分类的问题;CornerNet 则是在图中找到 pair 的关键点,这个点就代表物体。它的 pipeline 包括两步:第一步是检测到这样的 corner,即 keypoint;第二步是 group corner,就是说怎样将同一个物体的左上顶点和右下顶点框到一起。
其 pipeline 如下图所示:
(关于 CornerNet 的具体讲解,请回看视频 00: 41:35-00:47:40 处)
COCO 2018 Instance Segmentation 冠军团队算法分享
下面讲一下我们在 COCO Challenge 2018 中的工作。
我们实验室和商汤一起参加了 COCO Challenge 2018 比赛,然后在实例分割中取得了第一名的成绩。
下图展示了我们本次取得的成绩与 2017 年的冠军团队取得的成绩的比较:
比赛中,我们在三个方面提出了比较新的东西:
第一,针对 detection 和 segmentation,我们提出了 Hybrid Task Cascade,简称 HTC;
第二,针对 proposal 方面,我们提出了 Guided Anchoring,它是为了取代 sliding window 的 anchor;
第三,针对 backbone,我们设计了新的 backbone——FishNet。
Hybrid task cascade(HTC)
前面我们讲到过,Cascade Mask R-CNN 的×××performance 非常高,所以比赛中几乎所有的队伍都用了 Cascade Mask R-CNN,而这种方法其中的一项重要工作就是预测 mask,我们当时一个比较 naive 的想法就是把 Cascade R-CNN 和 Mask R-CNN 结合在一起,结构如下图所示:
但这种方法的问题是:每个 stage 的 branch 都做并行的 prediction,彼此间没有任何交集。
为了改善这一问题,我们提出了 interleaved execution,即交替做 bbox prediction 和 mask prediction。结构如下:
但是它仍存在一个问题是:不同 stage 的 mask branches 之间没有 information flow,所以需要人为引入 information flow,如下图所示:
不过这样的话,该方法依旧存在另外一个问题:做 mask prediction 需要一些 spatial context,然而上面这个架构中并没有引入任何 spatial context。那我们就想到可以做一个全图的 semantic segmentation,这样做的话,框架的 spatial context 就变得比较明显了:
基于这些调整和改进,HTC 最终的 performance 如下图所示:
无论是在小模型 ResNet-50 上还是大模型 ResNeXt-101 上,它的性能都有非常稳定的提升。
Guided Anchoring
Guided Anchoring 的思路是:将 sliding window anchor 变成 learnable 的东西。因此其目标就是得到 sparse anchor,同时其形状是任意的。但是在设计 anchor 的时候有两个原则:alignment 和 consistency。
下面几张图是 Guided Anchoring 的实现过程:
下图是 Guided Anchoring 的 performance:
FishNet
FishNet 这个工作的论文被 NIPS 2018 收录了。它的想法是:对于图像分类来说,需要的是深层的、低分辨率的特征,而不考虑空间上的信息;但是对于 segmentation 和 detection 来说,需要空间上的信息,因此需要的是深层的和高分辨率的特征,因此我们就将这两种思路结合起来设计了 FishNet。具体设计大家可以参考论文。
FishNet 的性能如下图所示:
在 detection 和 instance segmentation 中,性能也有比较大的提升。
(关于这三个工作的具体讲解,请回看视频 00:49:00-00:59:40 处)
下图显示了我们在比赛中的相关工作的一些细节:
(关于比赛细节的详细讲解,请回看视频 00:59:50-01:01:40)
Open-MMLab 计划及开源物体检测框架 mmdetection 介绍
最后我介绍一下 Open-MMlab 的这个项目。林达华老师在 MMLAB 知乎专栏(地址: https://zhuanlan.zhihu.com/p/47011261 )里对这个项目进行过介绍。
目前有两个代码库 :一个是 mmcv;另一个是 mmdetection。
(关于这两个项目的具体讲解,请回看视频 01:02:10-1:04:25-处。)
分享最后,嘉宾还对各位同学们的提问进行了回答,大家可回看视频 01:04:30 处
以上就是本期嘉宾的全部分享内容。更多公开课视频请到雷锋网 AI 研习社社区( https://ai.yanxishe.com )观看。关注微信公众号:AI 研习社(okweiwu),可获取最新公开课直播时间预告。 雷锋网
。