链接:https://www.zhihu.com/question/51863955/answer/2525216135
来源:知乎
泻药。我看大部分回答都很老了,现在是2022.6.11,我们实验室刚刚完成了近三年来顶会论文趋势的survey,在这里简要地说一下结论。
计算机视觉是否已经进入瓶颈期?
先说结论:不,能做的方向太多了,但是比起以前需要能力或者更多时间:图像理解卷,但是是基础,要学但是可以不作为研究方向,图像理解的小样本学习、持续学习、医疗影像理解倒是比较乐观,3D也相对2D好一些;图像生成在大实验室,算力足,可以做;检索不推荐;Robotics建议大佬做,很有前景;图像序列的多目标跟踪、步态识别等建议专业Lab做;跨学科多模态很适合做,但是要学多个学科的知识。我们来看一下细致的分析:
- 图像理解(目标检测、图像分类、图像分割)这边,三个子领域都由于benchmark非常成熟,总体呈内卷态势,做的人很多,优秀的工作很少。仔细调查发现,这是行业的正常情况,因为这个领域和深度学习结合起来的发展时间是最长的,从李飞飞2009的ImageNet开始发展到现在,已经有13年的历史了,而ImageNet的benchmark已经相当完善,所以缺乏活力。我们总结了图像理解的突破口:一个是小样本学习的benchmark,建立一个有规模的迁移学习数据集;另一个是持续学习的benchmark。这两块,最近的会议都开始大量征稿,属于是热点方向。还有一个是医疗图像理解特别是MRI,这一块属于是造福人类的领域,世界各国给的Funding都很足。1个点在通用领域没什么价值,但在手术台上可能就直接决定一个人的生命。有研究指出多目标的工作还差点火候,可以继续做;但我们自己调查了论文的数量和质量,认为其实这也属于卷的比较严重的一边,厉害的模型像是YOLO,已经做到了非常好的效果,之后基本没有让人耳目一新的模型出现。另外,3D领域相对2D会好一些。
- 图像生成(超分辨率、文本to图像、图像去噪、风格迁移)这一块,超分辨率基本已经做烂了,而且因为本身就是个比较简单的task,内卷非常严重;文本to图像这一块卷倒是不卷,经常有好的工作出来,问题是好的工作都是几千亿算力的大公司例如Google在做,例如前段时间的DALL-E,如果在一般的实验室不建议入坑,很容易做完实验写paper的时候突然发现已经被大厂做完了,沦成同期工作;图像去噪是一个相对小众的分支,想入门看这个综述,主要与在MRI结合的方向比较有实用价值,所以可以预计这一块前景不错。风格迁移这边谈不上卷,但是跟艺术结合的领域Funding明显不够,就业面也窄,所以目前阶段各种评价都偏娱乐向。
- 图像检索(以图搜图、以文搜图)其实本质还是图像理解,而且算是一个已经比较成熟的区域了,例如搜索引擎、相似度推荐等,10年左右开始技术飞跃就困难重重了。现在这一块很少有Lab在做了,慎入。
- Robotics(计算机视觉在无人车、无人机、机械臂上的应用)这一块,能做的还有太多。这一块用到深度学习(基于统计的方法)的还很少,基本都是基于规则的方法,其实计算机图形学更多一些。最热门的算法像是SLAM,都是被规则方法统治的。问题是,想要把计算机视觉用到这些科目上的难度非常大,改模型调参的结果没有规则方法好。所以做这个方向数学一定要好,否则很容易变成做横向,我们隔壁Lab就大量接横向,研究性质的paper发的不多。
- 图像序列(目标跟踪、图像序列分类、步态识别)其实就是一串图片拼起来,多了个时间维度,这块总体就业面稍窄,无外乎安防监控、无人驾驶两个领域,这三个子领域相对更有前景。目标跟踪推荐多目标跟踪,应用价值最高,Funding也不错;热点在落地可行性,也就是实时监测和降低算力门槛。序列分类最火的是事件监测,在交通方面有比较大应用。步态识别属于偏小众的方向,但是图像序列的Lab一般都会涉猎,如果Lab是专做图像序列的,例如导师专门做这块,可以考虑入坑。图像序列工作总体上聚集程度高,在专业实验室会比较吃香。
- 与NLP的组合(特别是视频理解、视频生成、视频搜索,也就是上面三个经典图像命题的视频版本)这一块,基本上还在蓝海期。视频其实就是图像序列加上音频和文字信息。视频理解像是概括视频的内容、提取视频中的事件这些,跟图像序列主要多一个音频和文字,属于图像序列的超集。远机位视频理解的benchmark实在太少了,很缺苦干做数据集的人,现在风气太浮躁。视频理解里面,视频分类现在是大瓶颈,两三年了还是那个模型。视频生成像是从一幅图片生成一整个视频,研究算是非常火爆的,可以用作推理专家系统,从一幅图片里面进行有端联想。视频生成里面视频质量也是一个很值得做的方向,现在很多视频内容是优质的但分辨率太低,视频超分效率感人,这边的研究实在是少的可怜。视频搜索可以用来做视频推荐算法,作为视频除了标题的一个文本参照,在标题党越来越多的情况下提升推荐质量。视频这一块总体来说难度都比较大,需要对CV和NLP都有涉猎,所以你光会CV还是容易陷入内卷,博采众长才是王道。
- 多模态。这个学科就是大量知识的杂糅,其实也是一个跨学科的方向,还是很容易出paper的。其实视频方向也是一种多模态,但是和NLP的关系最大,也是多模态里面最火的一个方向,所以放到上面一条单独讲。因为我们并不认为多模态是CV的一个部分,而是CV的超集,因此没有做重点survey。
完整的survey会在下个月初放出。另外,我们最近刚好写了一篇图像理解的入门介绍,图像理解就是因为发展的最完善,所以对于所有task都有奠基性的贡献。如果你对于图像理解还不了解,可以接着读下面的文章,十五分钟就可以完全入门。
概述
图像理解(Image Understanding)是计算机视觉中最基础的技术,也是计算机视觉中最接近底层原理的任务。人类用了5亿4千万年的努力达到了捕获并且理解图像的能力,但绝大多数的时间都被用在了进化大脑内用于视觉处理的器官(神经网络),而不是用于进化眼睛(摄像头)。也就是说,图像的处理始于捕捉图像,而关键部分在于理解图像。
人类看一眼下面这个画面就能够理清整个图片中的故事:任务、地点、事件等,但是计算机到现在还是无法理解。那么,我们应该如何定义理解一副图像呢?

第一步,就是目标检测:关注一副图像中有什么目标。目标检测的难题在于,一个目标可能有多种呈现方式。例如一只猫可以是站着的,可以是躺着的,可以是趴着的,还可以倒立。如何在这些图片中都能识别出“猫”这个目标呢?更难的是,如果图像里不只有一只猫,还有一条狗,而且还有遮挡,如何识别出来呢?这就是多目标检测,是目标检测的一个热门的子话题。
李飞飞提出,不妨思考一下人脑的学习机制。如果把人眼看成一个生物照相机,那么这个照相机每200毫秒就会照一张像。那么,到三岁的时候,孩子就已经看了上亿张的真实世界的照片了。这就是ImageNet提出的初衷:用大量的图片去仿真人脑的学习过程。而这,也是深度学习在CV领域的起源。
在ImageNet中,有62000+只猫,这为机器提供了非常充足的学习资源。研究发现,ImageNet这种大型图像数据集在CNN上有非常好的性能,主要是因为多层CNN可以容纳非常多的知识,从而实现对知识多个维度的非线性存储。
第二步,就是目标关系链接:ImageNet项目同时提出,在获得图像中有关目标的信息后,计算机还需要连结这些目标。例如,在理解图像的基础上,我们希望计算机能够说出“一只猫正站在沙发上”和“一个人正在吃蛋糕”这样的句子。
用一种更细致的分类方法,我们可以将图像理解分为图像分类(classification)、目标检测(detection)和图像分割(segmentation)。其实用李飞飞的话讲,三种都属于目标检测。但是由于下游任务不同,我们使用不同的方法去检测这些目标。例如,分类就是不关心位置地检测目标;分割就是像素级检测目标。不要把这里的检测和上面的检测混淆了,上面讲的是很广义的检测,而这里的object dection是一个具体的任务。

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

上图中,主要角色是一条狗和一只猫,属于多目标检测。目标检测特有的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),而深度学习方法则强调从图像中直接学习特征。在训练图像足够的情况下,深度学习的性能已经超过了人工特征。

RCNN就是Regional CNN,也就是把图像中的regions抽取出来做CNN。就像前面提到的,RCNN将检测建模成一个2-stage的任务:
- 基于图片提出若干可能包含物体的区域,称为region proposal,区域提议。具体的实现有很多种,RCNN paper中提出的是最简单的Selective Search算法。
- 在每一个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被忽略。

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

- 预处理。YOLO将图片缩放并且划分为等分的网格,每个网格根据与ground truth的IoU分配到所要预测的样本。
- 回归预测。YOLO使用一个GoogLeNet卷积网络的更改版本,每个网格对每个类别预测一个条件概率值,并在网格基础上生成B个box,每个box预测五个回归值。回归值中,四个表征位置,一个用IoU表征box含有物体的概率和位置的准确度。
- 后处理。使用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之上,主要有四个方法:
- 基于常规图像分类网络,做针对细粒度图像的微调。
- 使用针对细粒度的特征学习(feature learning)。
- 检测(detection)后对齐(alignment)区分块。
- 视觉注意(visual attention)机制。
基于常规图像分类网络,做针对细粒度图像的微调
所谓的常规图像分类网络,主要就是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分类器 里面做分类。

两个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的视觉注意力。直观的看就是:

由于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无所不能,现在竟然还可以拿来做分割的一部分……

在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。至于具体的结构,有兴趣可以催更~
内容中包含的图片若涉及版权问题,请及时与我们联系删除
评论
沙发等你来抢