首先,当前CV领域主要包括两个大的方向,”低层次的感知” 和 “高层次的认知”。
主要的应用领域:视频监控、人脸识别、医学图像分析、自动驾驶、 机器人、AR、VR。
主要的技术:分类、目标检测(识别)、分割、目标追踪、边缘检测、姿势评估、理解CNN、超分辨率重建、序列学习、特征检测与匹配、图像标定,视频标定、问答系统、图片生成(文本生成图像)、视觉关注性和显著性(质量评价)、人脸识别、3D重建、推荐系统、细粒度图像分析、图像压缩。
1、分类(image classification)
主要需要解决的问题是“我是谁?”
分类是image处理的基本问题,其他如目标检测分割等都可以细化到分类算法来解决。图像分类任务的进展,一定程度上可以对应着卷积神经网络的发展,从alexnet到inception,vgg系列等,主要是层次的加深以及优化,到resnet和densenet等残差系列,则是为了解决网络层次加深带来的难以优化的问题,再到mobilenet和shufflunet等,则是往轻型化的结构发展。可以说,resnet把图像分类带向了巅峰。顺便提一下Hinton老爷子提出的Capsule网络,其主要想解决CNN中存在的一些缺陷,比如说信息丢失,视角变化等,比如说池化(Pooling)操作会导致局部内容的准确位置和相对空间关系等信息丢失。(作为菜鸡先用着cnn,待大佬们把坑填完了再看capsule 吧。 = = )
放张resnet的局部结构图
reset局部结构图
2、目标检测与定位(object detection/ localization)
主要需要解决的问题是“我是谁? 我在哪里?”
从r-cnn到faster-rcnn,通过改进网络来提高速度与精度,但可以说都遵循了目标检测的四个基本步骤,候选区域生成,特征提取,分类,位置精修,采用的思路都是proposal+分类.yolo采用了另一种策略,将检测问题转换成回归问题,直接在输出层回归bounding box的位置和bounding box所属的类别,通俗点说这种网络的结构跟普通的简单的分类网络是一样的,只是目标不同导致loss不同。SSD与yolo类似,最大的不同是SSD会在每次卷积之后的特征层都会再次卷积然后去做回归任务,也就是低维和高维的特征上都做了检测。另外,MASK-RCNN可以同时完成分割和检测的任务。
放一张YOLO与SSD结构的对比图
yolo && SSD
3、图像分割
主要需要解决的问题是“我是谁? 我在哪里?你是否能够在像素级正确分割我?”
分割(segmentation )又有两个不同方向:semantic segmentation 和instance segmentation。Semantic segmentation的目标是在图像中分割每个像素所属的类别,但是不关心所属的实体。而instance segmentation是更精细一步分割像素是属于不同的实体。个人认为instance segmentation=Semantic segmentation+object localization。
在算法方面,全卷积神经网络FCN可以说是开山之作,还有适合医疗图像分割的基于FCN的UNET,另外改进的还有SEGNET,DECONVNET等。
下图所示image classification,object localization和segmentation 这个四个领域的区别:
再放一张FCN的结构图;
4、目标追踪(Visual tracking)主要需要解决的问题是“你能不能跟上我的步伐,尽快找到我?”,目标追踪领域是相关滤波的天下。
5、视频中的人体行为识别
主要包括两个方向:Action Recognition 以及 Temporal Action Localization:
Action Recognition的目的是给定一个视频片段进行分类,类别通常是人的各类动作。特点是简化了问题,一般使用的数据库都先将动作分割好了,一个视频片断中包含一段明确的动作,时间较短(几秒钟)且有唯一确定的label。所以也可以看作是输入为视频,输出为动作标签的多分类问题。常用数据库包括UCF101,HMDB51等。相当于对视频进行分类。
Temporal Action Localization 则不仅要知道一个动作在视频中是否发生,还需要知道动作发生在视频的哪段时间(包括开始和结束时间)。特点是需要处理较长的,未分割的视频。且视频通常有较多干扰,目标动作一般只占视频的一小部分。常用数据库包括HUMOS2014/2015, ActivityNet等。相当于对视频进行指定行为的检测。
action recognition与temporal action detection之间的关系,同 image classfication与 object detection之间的关系非常像。基于image classification问题,发展出了许多强大的网络模型(比如ResNet,VGGNet等),这些模型在object detection的方法中起到了很大的作用。同样,action recognition的相关模型(如two stream,C3D, iDT等)也被广泛的用在temporal action detection的方法中。
6、边缘检测主要需要解决的问题是:“如何准确的检测到目标的边缘?”
7、人体姿态识别
主要需要解决的问题是:“你需要通过我的姿势判断我在干什么?”
二维图像姿态估计基于CNN的单人姿态估计方法,主要有Deep Pose、CPM,hourglass以及各种hourglass结构引申之作。
二维图像姿态估计基于CNN的多人姿态估计方法,通常有2个思路(Bottom-Up Approaches和Top-Down Approaches)::
(1)two-step framework,就是先进行行人检测,得到边界框,然后在每一个边界框中检测人体关键点,连接成一个人形,缺点就是受检测框的影响太大,漏检,误检,IOU大小等都会对结果有影响,代表方法就是RMPE。
(2)part-based framework,就是先对整个图片进行每个人体关键点部件的检测,再将检测到的部件拼接成一个人形,缺点就是会将不同人的不同部位按一个人进行拼接,代表方法就是openpose。
9.理解CNN主要需要解决的问题是:“从理论上深层次的去理解CNN的原理?”
10.超分辨率重建
主要需要解决的问题是:“你如何从低质量图片获得高质量的图片?”
超分辨率技术(Super-Resolution)是指从观测到的低分辨率图像重建出相应的高分辨率图像,在监控设备、卫星图像和医学影像等领域都有重要的应用价值.
算法方面,SRCNN是将深度学习引入分辨率重建的开山之作,结构类似AE,只用了3层CNN,基于此的改进还有DRCN,ESPCN。既然是生成图片那就有必要考虑生成模型 GAN了,就有了SRGAN,其出发点是传统的方法一般处理的是较小的放大倍数,当图像的放大倍数在4以上时,很容易使得到的结果显得过于平滑,而缺少一些细节上的真实感。因此SRGAN使用GAN来生成图像中的细节,同时也改进了损失函数。放一张SRGAN的结构图。
SRGAN
11.序列学习主要解决的问题是“你知道我的下一幅图像或者下一帧视频是什么吗?”
12.特征检测与匹配主要需要解决的问题是“检测图像的特征,判断相似程度?”
13.图像描述(image caption)
主要需要解决的问题是“你能说出图像中有什么东西?他们在干什么呢?”
看图说话(Image Caption)任务是结合CV和NLP两个领域的一种比较综合的任务,Image Caption模型的输入是一幅图像,输出是对该幅图像进行描述的一段文字。这项任务要求模型可以识别图片中的物体、理解物体间的关系,并用一句自然语言表达出来。
应用场景:比如说用户在拍了一张照片后,利用Image Caption技术可以为其匹配合适的文字,方便以后检索或省去用户手动配字;此外它还可以帮助视觉障碍者去理解图像内容。类似的任务还有Video Caption,输入是一段视频,输出是对视频的描述。
算法方面,最简单的一类做法是用CNN提取图片的特征,再丢给LSTM,实际上也就是一个seq2seq结构,在就是改进的话加上attention机制。另外,比较新的一个算法的做法是,在vistual attention的基础上,提出了spatial atention,也就是空间注意力,让模型在生描述的适合,能够更加确定应该关注的空间。以下是这类算法的一种结构
14. 视频标定主要需要解决的问题是“你知道我这几帧视频说明了什么吗?”
15. 问答系统
主要需要解决的问题是:“你能根据图像正确回答我提问的问题吗?”
与image caption类似——VQA任务也同时涉及到CV和NLP两个领域,但是与image caption不同的是看图说话只需要产生对图片的一般性描述,而视觉问答根据问题的不同仅聚焦与图片中的某一部分,而且某些问题还需要一定的常识推理才能做出回答.同样,很自然的一种解决办法还是CNN和RNN的结合。
算法方面,最简单的模型是Deeper LSTM Q + norm I模型,其中I指的是提取后的图片特征,norm I指的是对CNN抽取的图像语义信息向量(1024维)做L2归一化处理。CNN抽取图像语义信息,LSTM抽取问题中包含的文本语义信息,将两者的信息融合,让模型学习到问题的含义/意图,最后送入一个以Softmax为输出层的多层MLP中产生答案输出,也就是转化成了一个分类问题。结构如下.此外还有一些模型,比如Neural-Image-QA模型,MQA模型。
16.图片生成
主要需要解决的问题是:“我能通过你给的信息准确的生成对应的图片?”
通过文字生成对应的图片是图片描述的逆操作,但是想利用CNN通过比较少的文字信息去生成一张图片就比较困难了,直觉上也好理解,[X1,X2,X3]-->[y] 这种映射好学习,但是这种[Y]-->[X1,X2,X3]就比较难了,除非提供很多很多的数据。通过上图也可以看出,即便通过句子生成了图像,句子的表述内容也是有限的,因此txt->img比img->txt难多了,本质上还是图片中蕴含的信息更丰富。
算法方面,比较早的是GAN-CLS, 利用生成模型GAN,进一步讲是条件GAN,也就是在生成器里输入描述的句子与随机向量,判别器里会输入三种信息,首先是真图片与真句子,假图片与真句子,这两点与CGAN相同,但是为了既要判断生成的图片是否合理,也要判断生成的图片是否与句子对应,因此还会输入真图片与假句子。下面是是其结构图
另外还有比较新的stackGan,也就是堆叠GAN.换句话说,就是没有一次性的通过一个网络将随机变量生成为一张图片,而是先将其生成为一张比原始图片小的的图片,送给判别器,然后这张图片再次送进另一个生成网络,z再给另一个判别器,也就是两个Gan。可以说,这种做法跟上面提出的生成图片存在的困难是对应的。
17.视觉关注性和显著性主要需要解决的问题是:“如何提出模拟人类视觉注意机制的模型?”
18.人脸识别
人脸识别的四大块:Face detection, alignment, verification and identification(recognization),分别代表从一张图中识别出人脸位置,把人脸上的特征点定位,人脸验证和人脸识别。(后两者的区别在于,人脸验证是要给你两张脸问你是不是同一个人,人脸识别是给你一张脸和一个库问你这张脸是库里的谁。人脸检测,可以说传统方法已经表现很好了,在深度学习上也可以是个目标检测问题。这里主要说一下人脸验证,比较start-of-art的算法有face++,DeepFace,FaceNet, Deepid.上一张deepid2的结构图
19.3D重建主要需要解决的问题是“你能通过我给你的图片生成对应的高质量3D点云吗?”
20.推荐系统主要需要解决的问题是“你能根据我的输入给出准确的输出吗?”
21.细粒度图像分析
主要需要解决的问题是“你能辨别出我是哪一种狗吗?等这些更精细的任务”
算法模型方面,“强监督细粒度图像分类模型”是指,在模型训练时,为了获得更好的分类精度,除了图像的类别标签外,还使用了物体标注框(object bounding box)和部位标注点(part annotation)等额外的人工标注信息,效果比较好的有Pose Normalized CNN以及mask-cnn.标注数据的代价是昂贵的,那么基于弱监督细粒度图像分类模型,思路同强监督分类模型类似,也需要借助全局和局部信息来做细粒度级别的分类。而区别在于,弱监督细粒度分类希望在不借助part annotation的情况下,也可以做到较好的局部信息的捕捉。当然,在分类精度方面,目前最好的弱监督分类模型仍与最好的强监督分类模型存在差距(分类准确度相差约1~2%)。比较有代表性的算法有Two Level Attention Model 以及bilinear CNN。上一张bilinear CNN 的图
一种对Bilinear CNN模型的解释是,网络A的作用是对物体/部件进行定位,即完成物体与局部区域检测工作,而网络B则是用来对网络A检测到的物体位置进行特征提取。两个网络相互协调作用,完成了细粒度图像分类过程中两个最重要的任务:物体、局部区域的检测与特征提取。
22. 图像压缩
主要需要解决的问题是“如何以较少的比特有损或者无损的表示原来的图像?”
传统的图像压缩的技术可以说比较成熟,比如小波变换。在深度学习领域,与图像压缩有关常见的是自动编码器(AE),将图片通过神经网络表达为更低维的向量,原理都在下图,