图像理解(Image Understanding)是计算机视觉中最基础的技术,也是计算机视觉中最接近底层原理的任务。人类用了5亿4千万年的努力达到了捕获并且理解图像的能力,但绝大多数的时间都被用在了进化大脑内用于视觉处理的器官(神经网络),而不是用于进化眼睛(摄像头)。也就是说,图像的处理始于捕捉图像,而关键部分在于理解图像。

人类看一眼下面这个画面就能够理清整个图片中的故事:任务、地点、事件等,但是计算机到现在还是无法理解。那么,我们应该如何定义理解一副图像呢?

ai深度视觉强化学习算法(一天一个AI知识点)(1)

出处:https://www.bilibili.com/video/BV1BU4y1n7Mx/?vd_source=2505e3c9eea289e60f6c0cdeea1b69ee

第一步,就是目标检测:关注一副图像中有什么目标。目标检测的难题在于,一个目标可能有多种呈现方式。例如一只猫可以是站着的,可以是躺着的,可以是趴着的,还可以倒立。如何在这些图片中都能识别出“猫”这个目标呢?更难的是,如果图像里不只有一只猫,还有一条狗,而且还有遮挡,如何识别出来呢?这就是多目标检测,是目标检测的一个热门的子话题。

李飞飞提出,不妨思考一下人脑的学习机制。如果把人眼看成一个生物照相机,那么这个照相机每200毫秒就会照一张像。那么,到三岁的时候,孩子就已经看了上亿张的真实世界的照片了。这就是ImageNet提出的初衷:用大量的图片去仿真人脑的学习过程。而这,也是深度学习在CV领域的起源。

在ImageNet中,有62000 只猫,这为机器提供了非常充足的学习资源。研究发现,ImageNet这种大型图像数据集在CNN上有非常好的性能,主要是因为多层CNN可以容纳非常多的知识,从而实现对知识多个维度的非线性存储。

第二步,就是目标关系链接:ImageNet项目同时提出,在获得图像中有关目标的信息后,计算机还需要连结这些目标。例如,在理解图像的基础上,我们希望计算机能够说出“一只猫正站在沙发上”和“一个人正在吃蛋糕”这样的句子。

用一种更细致的分类方法,我们可以将图像理解分为图像分类(classification)、目标检测(detection)和图像分割(segmentation)。其实用李飞飞的话讲,三种都属于目标检测。但是由于下游任务不同,我们使用不同的方法去检测这些目标。例如,分类就是不关心位置地检测目标;分割就是像素级检测目标。不要把这里的检测和上面的检测混淆了,上面讲的是很广义的检测,而这里的object dection是一个具体的任务。

ai深度视觉强化学习算法(一天一个AI知识点)(2)

目标检测

目标检测找出一副图像中的目标的位置和类型,并用一个bounding box围绕被探测出的目标。一个例子如下图所示:

ai深度视觉强化学习算法(一天一个AI知识点)(3)

上图中,主要角色是一条狗和一只猫,属于多目标检测。目标检测特有的bounding box也是很显眼,上面都会带置信度,100%就是完全相信。笔者半年前还在做多目标追踪(MOT),其实本质就是视频里面的目标检测和位置估计。

目标检测是稀疏检测。当一副图像里有若干个非常显眼的离散目标时,目标检测比较有效果。当目标比较稠密或者遮挡非常明显时,目标检测的精度就下来了,要用别的方法。

接下来讲讲目标检测的几个常用模型。根据算法的流程,可以分为2-stage detection 和 1-stage detection。双阶段的模型包括RCNN,Fast RCNN和Faster RCNN,而单阶段的模型包括YOLO族和SSD。我们接下来通过RCNN和YOLO简要介绍一下RCNN一族和YOLO一族的大致思想,并且给出两者的区别比较。如果对模型的具体内容和族群发展史,可以催更~

RCNN:先选取局部图像后卷积分类(2-stage)

双阶段模型其实就是基于区域(region-based)的模型,我们这里只讲RCNN。传统的计算机视觉方法强调人工制作特征(如SIFT和HOG),而深度学习方法则强调从图像中直接学习特征。在训练图像足够的情况下,深度学习的性能已经超过了人工特征。

ai深度视觉强化学习算法(一天一个AI知识点)(4)

RCNN就是Regional CNN,也就是把图像中的regions抽取出来做CNN。就像前面提到的,RCNN将检测建模成一个2-stage的任务:

  1. 基于图片提出若干可能包含物体的区域,称为region proposal,区域提议。具体的实现有很多种,RCNN paper中提出的是最简单的Selective Search算法。
  2. 在每一个region proposal上运行一个分类网络(例如AlexNet),得到每个区域内物体的类别。这一步说明检测可以被建模成一个分类的超集。

这里不得不讲一个非常重要的细节:IoU(交并比,Intersection over Union)。IoU的本质就是两个区域面积的交和并的比值,IoU越大,重合度越高。IoU被用来规定阈值,例如样本和ground truth的IoU大于0.5时,选为正样本proposal,也就是object类;样本和ground truth的IoU小于0.5时,选为负样本proposal,也就是背景类。当IoU在0.1和0.5之间时,proposal被忽略。

ai深度视觉强化学习算法(一天一个AI知识点)(5)

YOLO:网格预测法(1-stage)

单阶段模型的奠基性工作就是YOLO,我们在 1-stage 方法上只讲YOLO。YOLO把检测任务表述成一个统一的、end-to-end的回归问题,只处理一次图片就能同时得到位置和分类。

ai深度视觉强化学习算法(一天一个AI知识点)(6)

  1. 预处理。YOLO将图片缩放并且划分为等分的网格,每个网格根据与ground truth的IoU分配到所要预测的样本。
  2. 回归预测。YOLO使用一个GoogLeNet卷积网络的更改版本,每个网格对每个类别预测一个条件概率值,并在网格基础上生成B个box,每个box预测五个回归值。回归值中,四个表征位置,一个用IoU表征box含有物体的概率和位置的准确度。
  3. 后处理。使用NMS(非极大抑制,Non-Maximum Suppression)过滤得到最后的预测框。

YOLO的损失函数有三个部分:坐标误差、物体误差、类别误差。三个误差共同构成了整个任务的损失函数,因此YOLO可以综合最小化这三个误差。

这里给出YOLO族方法的优劣,YOLO的劣势就是RCNN的优势。

方法族

优势

劣势

YOLO

1. 速度快,实时性强,落地方便。2. 由于是全局处理方法,背景错误相对少。3. 泛化性能好,例如艺术作品上的效果好。

1. 网格划分粗糙。2. 网格生成的box个数限制了小尺度物体和相近物体的检测。

图像分类

图像分类,就是识别出图中的所有object并且输出其类别。比起object detection,图像分类不用找出object的具体方位,把所有的object类别输出来就可以了,这个输出的类别叫做标签(label)。如果object只有一类(例如dog),就称为单标签图像分类。反之就是多标签图像分类。多标签图像分类可以被化归为单标签图像分类问题,我们在这里不做深入,先掌握好单标签图像分类问题。

单标签图像分类基本上可以分为三大类别:跨物种语义级别的图像分类(object属于不同物种)、子类细粒度图像分类(object属于同一物种的不同子类)、实例级图像分类。

跨物种语义级别的图像分类就是object包含不同物种的图像分类。这种分类的最大特点就是聚类效应:object呈簇状,猫和猫、狗和狗之间比较近,而猫和狗之间比较远,形成了一个个小团体。用严谨的话说,就是类间方差大,类内方差小。

子类细粒度图像分类就是object是同一物种,但是又是同一物种的不同子类。例如,车辆分类就是非常典型的子类细粒度图像分类,小轿车和吉普车都是车,但是属于不同的类别。像乐高积木分类也属于这种分类任务,不同的积木有不同的形状,但是都是积木。子类细粒度分类最大的特点就是所有object都有某些共同的特征,例如吉普车和小轿车都有4个轮子,积木都有棱有角。子类细粒度图像分类比起跨物种语义级别图像分类,更加专注于细节,要区分必须靠一些子类之间不同的特征,所以更加困难。但是子类细粒度图像分类同时也是应用价值最广的分类。

实例级图像分类更是重量级,直接要求图像中的每一个object的类都是它本身。换句话说,一幅图中不可能出现两个不同类别的object,例如人脸识别。这是最困难的一项任务,最广泛应用在人脸识别中。

我们这里详细地讨论一下价值最大的子类细粒度图像分类的模型,其他的两个分类如果有兴趣可以催更~

子类细粒度图像分类(Sub-category Fine-grained Image Categorization)的最大难点在区分块(discriminative part),也就是能够区分两个物种的特征块。由于不同子类非常相似,而最好区别的地方一般在某一个特定的特征块,所以特征块对于细粒度图像分类有非常大的影响。由于CNN可以学习到非常鲁棒的图像特征表示,我们一般使用CNN作为细粒度图像分类的基础。在CNN之上,主要有四个方法:

基于常规图像分类网络,做针对细粒度图像的微调

所谓的常规图像分类网络,主要就是AlexNet、VGG-16、LeNet-5、GoogLeNet、ResNet、DenseNet、SENet这些,跑不出去的。这些网络普遍具有较强的表征能力,在常规图像分类中能取得很不错的效果,但是在细粒度分类中表现一般般,主要问题就是两个class之间的差异实在太小了。受迁移学习的启发,研究者提出了用pre-trained过的CNN大模型进行fine-tune,从general domain迁移到细粒度图像分类上。例如,可以拿pre-trained ImageNet做权值初始化,然后在细粒度分类数据集上做有监督学习对权值进行fine-tune。

使用针对细粒度的特征学习:Bilinear CNN

特征学习其实就是提取图片中的特征,可以设计一个特征提取网络或者特征提取函数来解决。一个经典的工作是2015的Bilinear CNN,使用一个VGG-D和一个VGG-M作为基准网络,分别负责提取特征A和特征B。两个VGG分别输出一个卷积特征,并且通过一个双线性操作汇聚成一个bilinear vector作为双线性特征然后过一次池化(例如累加法),将所有位置的双线性特征汇聚成一个特征,送到 logistic regression 或者 SVM分类器 里面做分类。

ai深度视觉强化学习算法(一天一个AI知识点)(7)

两个VGG的本质是互补网络(complementary network)。一个网络能够定位图像中的物体,另一个网络可以使用定位到的物体进行特征提取。虽然两个网络分别负责一个特征,但是经过bilinear后就会有这样神奇的效果,如果大家有兴趣可以催更~

检测后对齐区分块:Part-RCNN

这种方法非常新奇,甚至让人觉得有点低估了机器的能力。检测后对齐区分块方法又被称为基于目标块(object part)的方法,所谓的目标块其实就是我们第一部分object detection里面object的那个box。这种方法直觉地认为,可以先在图像中检测出object的位置,再检测出目标中的区分块,最后将object part和discrimitive part同时送入CNN进行分类。这种方法有个最大的不方便:训练一定会用到object box作为标注,甚至还需要discrimitive point的信息,这些信息在实际应用中是非常难获得的。

一个非常出色的工作是2014年的Part-RCNN,描述了一个检测鸟的种类的算法。Fast-RCNN先用RCNN检测图中鸟的位置、鸟的头部的位置、鸟的身体的位置,然后将这三个信息同时送入CNN进行训练。Part RCNN先使用Selective Search产生region proposals(与RCNN相同),然后用RCNN检测每个region并给出评分,继而给出评分最高的区域,形成一个triplet(鸟、鸟头、鸟身)。注意:原始的RCNN并不能给出一个准确的评分,因为身体可能和头部有重叠。这里作者使用了box修正,也就是对region的边框约束和几何约束。

得到triplet并修正后,再分别对每一块区域提取卷积特征,将不同区域的特征相互连接起来,构成一个集成的特征表示。这个特征表示被用来训练一个SVM classifier,从而完成最后的分类。

其实大家可能也发现了,这本质上还是一个特征学习方法,就是想要先学到一个能够代表这个子物种的高度集成的特征,再用这个特征进行分类。

视觉注意(visual attention)机制:RA-CNN

看到名字大家就知道这是啥了吧。人类的视觉系统在看物体的时候,会先通过快速的全局扫描来获得需要关注的目标区域,然后盯着看,从而忽略掉不必要的信息。在NLP界,注意力一般由Attention Layer完成,在CV界则是用基于CNN的视觉注意力。直观的看就是:

ai深度视觉强化学习算法(一天一个AI知识点)(8)

由于visual attention不需要box的标注,落地相对于“检测后对齐区分块”方法更加广泛。代表性工作是2017年的RA-CNN,本质就是三个VGG-19。第一个VGG输出的特征图给APN学习,得到关于整幅图像的discriminative part的坐标和box的半径,然后用这个坐标和半径对图像进行裁剪、放大,输入到下一个VGG。第二个VGG重复一次,输入第三个VGG。这样,就得到了两张图(第一个VGG得出的坐标半径 第二个VGG得出的坐标半径)。这两张图和原图同时送到CNN分类器里面训练,就得到了分类结果。这里不展开讲APN,可以理解成一个输入是特征图输出是坐标和半径的网络。

图像分割

图像分割是整个图像理解领域最困难的任务,本质是一种稠密的图像检测任务,因为每一个像素点都被做了一次分类。图像分割有两种类型:语义分割和实例分割。在读完上面的图像分类后,大家应该已经能猜出这两者是什么意思了。没错,语义分割是分类,而实例分割是分个体,这不就是跨物种语义级别的图像分类和实例级图像分类的区别嘛……换句话说,语义分割里面同样类型的个体会被分到同一类里面去,而实例分割里面只要是一个个体就自成一类。

图像分割基本上已经被大一统了,架构都是encoder-decoder一族。encoder通过卷积核提取图像特征,而decoder输出包含物体轮廓的分割蒙版(seg map)。随便举几个例子:Unet、FastFCN、Gated-SCNN、DeepLab、Mask R-CNN等等。我们接下来挑几个特别出色的模型讲一讲大致原理。

提取后扩展:Unet

Unet是图像分割领域奠基性的作品,性能实在是太强了,novelty也非常显著。看看下面的图,是不是一眼就能看出encoder-decoder架构?没错,encoder用来提取图像特征,捕获上下文,decoder用来输出分割蒙版,定位分割线的位置。encoder这边是不是很眼熟……这不就是VGG-16吗?!没错,VGG-16无所不能,现在竟然还可以拿来做分割的一部分……

ai深度视觉强化学习算法(一天一个AI知识点)(9)

在encoder部分,每一层网络都过CNN和ReLU然后做max pooling来降采样。在decoder部分,通过up convolution做扩展,最后一层过一个MLP来输出seg map。

Mask RCNN

你没看错,在你发现object detection的RCNN和image classification的Part-RCNN后,image segmentation也用了RCNN,叫做Mask RCNN。看名字就懂个大概了,是不是就是本质RCNN加了个Mask预测?差不多了,但是事实上,不是RCNN Mask,而是Faster RCNN Mask,也就是ResNet FPN Fast RCNN Mask。

,