神奇的视觉图(神奇的视觉图片原理)
图像理解(Image Understanding)是计算机视觉中最基础的技术,也是计算机视觉中最接近底层原理的任务。人类用了5亿4千万年的努力达到了捕获并且理解图像的能力,但绝大多数的时间都被用在了进化大脑内用于视觉处理的器官(神经网络),而不是用于进化眼睛(摄像头)。也就是说,图像的处理始于捕捉图像,而关键部分在于理解图像。
人类看一眼下面这个画面就能够理清整个图片中的故事:任务、地点、事件等,但是计算机到现在还是无法理解。那么,我们应该如何定义理解一副图像呢?
出处:https://www.bilibili.com/video/BV1BU4y1n7Mx/?vd_source=2505e3c9eea289e60f6c0cdeea1b69ee
第一步,就是目标检测:关注一副图像中有什么目标。目标检测的难题在于,一个目标可能有多种呈现方式。例如一只猫可以是站着的,可以是躺着的,可以是趴着的,还可以倒立。如何在这些图片中都能识别出“猫”这个目标呢?更难的是,如果图像里不只有一只猫,还有一条狗,而且还有遮挡,如何识别出来呢?这就是多目标检测,是目标检测的一个热门的子话题。
李飞飞提出,不妨思考一下人脑的学习机制。如果把人眼看成一个生物照相机,那么这个照相机每200毫秒就会照一张像。那么,到三岁的时候,孩子就已经看了上亿张的真实世界的照片了。这就是ImageNet提出的初衷:用大量的图片去仿真人脑的学习过程。而这,也是深度学习在CV领域的起源。
在ImageNet中,有62000 只猫,这为机器提供了非常充足的学习资源。研究发现,ImageNet这种大型图像数据集在CNN上有非常好的性能,主要是因为多层CNN可以容纳非常多的知识,从而实现对知识多个维度的非线性存储。
第二步,就是目标关系链接:ImageNet项目同时提出,在获得图像中有关目标的信息后,计算机还需要连结这些目标。例如,在理解图像的基础上,我们希望计算机能够说出“一只猫正站在沙发上”和“一个人正在吃蛋糕”这样的句子。
用一种更细致的分类方法,我们可以将图像理解分为图像分类(classification)、目标检测(detection)和图像分割(segmentation)。其实用李飞飞的话讲,三种都属于目标检测。但是由于下游任务不同,我们使用不同的方法去检测这些目标。例如,分类就是不关心位置地检测目标;分割就是像素级检测目标。不要把这里的检测和上面的检测混淆了,上面讲的是很广义的检测,而这里的object dection是一个具体的任务。
YOLO:网格预测法(1-stage)
单阶段模型的奠基性工作就是YOLO,我们在 1-stage 方法上只讲YOLO。YOLO把检测任务表述成一个统一的、end-to-end的回归问题,只处理一次图片就能同时得到位置和分类。
两个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。
如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。