‘壹’ Lecture 11 检测与分割
我们之前都是图像分类的任务,最后一个全连接层得到所有分类的得分。现在我们来研究计算机视觉的其他任务,比如语义分割、图像分类与定位、目标检测、实例分割等。
在 语义分割 任务中,输入一张图片,希望输出能对图像的每个像素做出分类,判断这个像素是属于物体或者背景,不再像之前那样整张图片都是一个类。语义分割不会区分实例,只关心像素,所以如果图中有两头牛,会把两块像素都归为牛,不会分开每一头,以后会讲到 实例分割 (Instance Segmentation)可以区分实例。
实现语义分割的一个想法是 滑动窗口 ,即将图像分成一个个的小块,然后使用CNN网络计算小块的中心元素属于哪个分类。这样做的一个问题是,需要为每个像素计算一次,很多运算都是重复的,实际上没人会这么做。
另一个想法是 全卷积 ( Fully Convolutional),将网络的所有层都设计成卷积层,这样就能实现一次对图像的所有像素进行预测。比如使用3x3的卷积层然后使用零填充保持输入输出的空间尺寸,最终得到一个CxHxW的特征图,其中C是像素分类的数量,这样的一个特征图就一次计算了所有像素的分类得分。然后使用交叉熵损失、取平均、反向传播等操作进行训练。由于要为每个像素设置标签,这样的数据集花费是非常昂贵的。这里的数据集需要先确定图像属于哪个类别,比如猫,然后对图像的像素点设置类别。实际应用中,如果一直保持空间尺寸的话计算量会很庞大,所以不能设置这种结构。
使用全卷积网络的一种好的形式是在网络内部使用 降采样 (downsampling)然后使用 升采样 (upsampling),只在最初的几个卷积层保持尺寸,然后降采样比如池化或跨进卷积(strided convolution)来降低尺寸,进行一系列卷积后升采样到原来的尺寸。之所以需要去池化是因为池化减少了像素值,降低了图像的清晰度,丢失了图像空间结构,不知道这些像素原来在哪里,所以也就不明确边界应该在什么位置,所以需要进行去池化得到这些空间信息。
然后问题是如何进行升采样呢?
在一维中可能会表现的更清晰:滤波器被输入加权后直接放到输出中,输出的步长为2,下一个位置要平移两个像素,重叠的部分直接相加。最后为了使输出是输入的两倍,需要裁掉一个像素。
之所以称作转置卷积,可以通过矩阵乘法来解释,以一个一维的输入为例 a = [a, b, c, d],现在做 3x1 的卷积,卷积核为 [x, y, z],步长1填充1,此时的卷积可以看作是卷积核组成的一个大的矩阵 X 与输入 a 做乘法,如下图左边所示。(图上应为xyz,书写错误。)卷积核在输入 a 上滑动对应元素相乘后相加得到输出的过程,完全等价于卷积核组成的大矩阵与输入 a 的乘法。然后将 X 转置与 a 相乘,即转置卷积,结果就是一个正常的卷积,改变的只是填充规则。
现在如果步长为2,情况就不一样了。左边的卷积仍然可以看作是乘法,而右侧的转置卷积就变成用输入加权后的卷积核在输出上的叠加。
综上,语义分割任务的实现方法如下图所示:
此外, 多视角3D重建 ( Multi-view 3D Reconstruction)也使用了降采样和升采样的方法。
定位 ( Localization)往往是与 分类 (Classificatio)结合在一起的,如果图片分类是一只猫,同时我们也想知道猫在这张图片的什么位置,要用一个框给框起来。这与 目标检测 (Object Detection)是不同的,定位是一旦图像已经归为哪一类,比如猫,这样我们就会有一个明确的目标去寻找,找出它的边界即可。而目标检测是要检测出图像上存在的物体。
定位可以复用分类的方法,比如AlexNet。如下图所示,最后一个全连接层,除了得到1000个类别的得分,还会得到一个长为4的向量,表示目标的位置。这样最后就有两个损失,一个是正确分类的Softmax损失,另一个是正确位置的L2损失,L1、L2等损失也称作 回归损失 (Regression Loss)。最后将两个损失通过某些超参数加权得到总损失,和之前的超参数不同的是,以前的超参数改变是为了减小损失,而这里的加权超参数直接会改变损失值的表达式,损失变大变小都有可能。使用总损失求梯度。这里使用的网络是使用ImageNet 预训练过的模型,进行迁移学习。
目标检测任务是这样的:我们有几个感兴趣的类别,比如猫狗鱼等等,现在输入一张图像,图像上有几个物体事先是不知道的,当我们我们感兴趣的物体在图像上出现时,我们希望模型能自动标记出目标物体的位置,并判断出具体的分类。这实际上是很有挑战的任务,也是计算机视觉中很核心的任务,对此的研究已经经历了很多年,也有非常多的方法。
与定位最大的区别是,我们不知道图上会有多少对象。比如图像上只有一只猫,我们最终的输出只有一个位置四个数字;有两只狗一只猫,会输出3个位置12个数字;那么有一群鸭子呢?数量就很多了。所以目标检测问题不能看作定位中的回归问题。
另一个想法是把目标检测问题看作分类问题。类似语义分割的想法,将图像分成一个个的小块,让每一个小块通过卷积网络判断这块是背景?是猫?是狗?可以这么想,但是这个小块该怎么获得呢?不同的物体可能会有不同的大小、位置以及长宽比,这将是无数的情况,如果都要进行卷积,那么计算量是非常大的。
实际上,更实用的方法是 候选区域 (Region Proposals )方法。 选择性搜索 (Selective Search )方法就是在目标对象周围设定2000个形状大小位置不一的候选区域,目标物体在候选区域的可能性还是比较大的。然后对这些区域卷积,找到目标物体,虽然大多数区域都是无用的。与寻找几乎个区域比起来,这种方法要高效的多。此外,这不是深度学习的方法,是机器学习算法。 R-CNN 就是基于这种观点提出的。首先对输入图片使用区域备选算法,获取2000个感兴趣的区域(Regions of interest, roi),由于这些区域大小不一,所以需要处理成同样的尺寸才能通过CNN,之后使用SVM对区域进行分类。可以使用线性回归损失来校正包围框,比如虽然这个框选中的物体是一个缺少头部的狗,就需要对包围框进行校正。总之,这是一个多损失网络。
R-CNN的问题是计算消耗大、磁盘占用多、运行速度慢,即使测试时也要30秒测试一张图片,因为有2000个区域。解决方法时使用 快速R-CNN (Fast R-CNN ),不在原始图像生成备选区域,而是先整张图片通过卷积网络得到特征图,然后在特征图上使用备选区域算法得到感兴趣的区域在特征图的映射,之后使用 Rol Pool将所有区域变成同样尺寸。然后一方面使用softmax损失进行分类,一方面使用回归损失比如L1平滑损失校正包围框,总损失是两部分的和,然后反向传播进行训练。
如下图所示,效果还是很明显的。但是快速R-CNN也有一个问题是运行时间被区域备选方案限制。
解决方案是 更快的R-CNN (Faster R-CNN)。这种方法的改进是与其使用固定的算法得到备选区域,不如让网络自己学习自己的备选区域应该是什么。如下图所示,前面仍然是通过卷积网络获得特征图,然后通过一个 备选区域网络 (Region Proposal Network,RPN),该网络会做两件事,一是计算分类损失,选择的区域是目标还是不是目标;二是校正包围框。得到备选区域后接下来的步骤就和快速R-CNN一致了,也是得到最后的分类得分和校正包围框。训练的过程会综合这四个损失,最终效果很好。
Mask R-CNN是在Faster R-CNN基础上改进而来,是2017年发布的方法。首先将整张图像通过卷积网络和候选框生成网络,得到候选特征在特征图上的映射再调整尺寸,到这里和Faster R-CNN都是相同的;现在不仅是得到分类得分和校正包围框,还要增加一个分支通过卷积网络对每一个候选框预测一个分割区域模板。这个新增的分支就是一个在候选框中进行的微型语义分割任务。这样上下两个分支的任务就很明确了——上面的分支需要计算分类得分确定候选框中的目标属于哪个分类以及通过对候选框坐标的回归来预测边界框的坐标;下面的分支基本类似一个微型语义分割网络,会对候选框中的每个像素进行分类,判断每个像素是否属于候选框的中目标。
Mask R-CNN综合了上面讲的很多方法,最终的效果也是非常好的。比如下图最左边,不仅框出了每个物体还分割了像素,即使很远地方的人也被清晰的分割出来了。
此外,Mask R-CNN也可以识别动作,方法是在上面分支中增加一个关节坐标损失,这样就能同时进行分类、检测、动作识别、语义分割。此外,基于Faster R-CNN,运行速度也是非常快的。下图展示的效果是很令人惊讶的,可以同时识别出图上有多少人,分割出他们的像素区域,并且会标示他们的动作姿势。
使用前馈模型。
YOLO 即 “You Only Look Once” 和 SSD 即 “Single-Shot MultiBox Detector”,这两个模型是在同一时期提出的(2016),它们不会使用候选框分别进行处理,而是尝试将其作为回归问题,通过一个大的卷积网络,一次完成所有预测。给定输入图像,分成网格状比如7x7,然后在每个小单元中心处使用 B 个基本的边界框,比如高的、宽的、正方形的,这样总共有 7x7xB个基本框。现在想对每个网格单元的所有基本边界框预测目标物体,首先要预测每个基本边界框偏移来确定边界框和真实物体的位置差值,使用5个值(dx, dy, dh, dw, confidence)来表示偏差;然后预测每个网格单元里目标的 C 个分类(包括背景)得分,这样每个网格单元都会得到一个分类得分,即目标所属类别。最终的输出就是一个三维的张量:7x7x(5*B+C)。
TensorFlow Detection API(Faster RCNN, SSD, RFCN, Mask R-CNN): 点击这里
二维平面的目标检测只需确定 [x, y, w, h],3D的定位框需要确定的坐标为 [x, y, z, roll, pitch, yaw],简化后可以不需要 roll 和 pitch。比2D目标检测要复杂的多。
‘贰’ 计算机视觉面试之语义分割
在深度学习广泛应用于计算机视觉之前,人们一般使用TextonForest和Random Forest based Classifiers的方法进行语义分割。
深度学习方法中常见的一种语义分割方法是图像块分类(patch classification),即利用像素周围的图像块对每一个像素进行分类。原因是网络模型通常包含全连接层(fully connect layer),而且要求固定大小的图像输入。
2014年,加州大学伯克利分校的Long等人提出全卷积网络(FCN),使得卷积神经网络不需要全连接层就可以实现密集的像素级分类,从而成为当前非常流行的像素级分类CNN架构。由于不需要全连接层,所以可以对任意大小的图像进行语义分割,而且比传统方法要快上很多。之后,语义分割领域几乎所有的先进方法都是基于该模型进行扩展的。
为了保留像素的空间位置信息,有两种方法可以解决这个问题:
(1)编码器-解码器结构,编码器与解码器之间通常存在跨越连接(shortcut connections)。U-Net是这类架构中最常用的模型之一(源于: Convolutional Networks for Biomedical Image Segmentation )。
(2)使用带孔卷积(dilated/atrous convolutions),从而除去池化层。
条件随机场(CRF)通常用于后处理来进一步改善分割效果。CRF是一种基于底层图像的像素强度进行的平滑分割的图模型,原理是相似强度的像素更可能标记为同一类别。
主要贡献:
1. 为语义分割引入了端到端的全卷积网络。
2. 利用ImageNet的预训练网络做语义分割。
3. 使用反卷积层(取代线性插值)进行上采样。
4. 引入少量跳跃连接改善上采样粗糙的像素定位。
主要贡献:
使用编码-解码架构。并且将池化结果应用到译码的过程,使用的是Pooling indices(记录位置信息)而不是简单地复制特征。其实没有跳跃连接,更节省内存。
U-Net的结构更规整,是FCN的延伸,通过将编码器的每层结果拼接到译码器中得到更好的结果。
移去了VGG网络的最后两层池化层,并且后续的卷积层都采用带孔卷积。还训练了一个模块,输入卷积结果,级联了不同孔大小的带孔卷积层。
主要贡献:
1. 通过带孔卷积提取和聚合多尺度的信息。
2. 提出context mole来聚合多尺度的信息。
主要贡献:
1. 采用了带孔卷积。
2. 提出了金字塔形的空洞池化(Atrous Spatial Pyramid Pooling, ASPP)。
3. 采用了全连接的CRF。
由于带孔卷积需要大量的高分辨率特征图,对计算和内存的消耗很大,因此无法利用高分辨率的精细预测。
该文章采用编码解码结构。编码器是ResNet-101,解码器是RefineNet模块,用于连接编码器中高分辨率特征和先前RefineNet中低分辨率的特征。
每一个RefineNet都有两个组件,一个组件通过对低分辨率特征的上采样操作融合不同的分辨率特征,另一个组件利用窗口为5*5且步长为1的池化层来获取背景信息。这些组件都遵循恒等映射(identity mapping)思想,采用残差连接设计。
主要贡献:
1. 精心设计了译码模块。
2. 所有模块遵循残差连接设计。
金字塔池化模块通过使用大窗口的池化层来提高感受野。使用带孔卷积来修改ResNet网络,并增加了金字塔池化模块。金字塔池化模块对ResNet输出的特征进行不同规模的池化操作,并作上采样后,拼接起来,最后得到结果。
金字塔池化模块简单来说是将DeepLab(不完全一样)ASPP之前的feature map池化了四种尺度之后,将五种feature map拼接到一起,经过卷积,最后进行预测的过程。
在ResNet的第四个阶段之后(即输入到金字塔池化模块的阶段),在主分支损失之外增加辅助损失(其他论文称为中间监督)。
主要贡献:
1. 提出了金字塔池化模块来聚合图片上下文信息。
2. 使用附加的辅助损失函数。
理论上更深的ResNet能有很大的感受野,但研究表明实际上网络更适合收集较小区域(有效感受野)内的信息,因此使用大核来扩大感受野。但是核越大,计算量越大,因此将 k x k 的卷积近似转换为 1 x k + k x 1 和 k x 1 + 1 x k 卷积的和。本文称为GCN。
编码器使用ResNet(无带孔卷积),解码器由GCNs和反卷积构成。此外还用到了边界精调(Boundary Refinement, BR)的简单残差块。
主要贡献:提出具有大卷积核的编码-解码架构。
主要贡献:
1. 改进ASPP。将不同孔率的带孔卷积的结果拼接起来(DeepLab v2使用的是求和),并使用了BN。
2. 串行部署ASPP的模块。直接对中间的特征图进行带孔卷积(Dilated Convolutions(2015) 是在最后做)。
‘叁’ 图像语义分割是什么
图像语义分割属于人工智能计算机视觉领域的一个重要分支,它结合了图像分类、目标检测和图像分割等技术,主要针对图像进行像素级的分类。
语义分割的结果是将图像变成带有一定语义信息的色块。语义分割技术可以识别出每个色块的语义类别,并给每个像素都标注上其对应的标签,从而实现从底层到高层的语义推理过程,最终得到一张具有各个像素语义标注信息的分割图像。
图片来源:曼孚科技
‘肆’ 图像分类转语义分割难吗
不难。图像分类转语义分割不难,语义分割是最简单的,对每个像素做分类。图像分类,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。
‘伍’ 语义分割是什么意思
语义分割是数据标注领域常用的一种标注类型。
这是一张经过语义分割后的图片:
来源:曼孚科技SEED数据标注平台
‘陆’ 图片处理一般是怎么收费的,多少钱一张呢
影楼其实主要就是靠精修加片赚钱,很多小影楼起步价几百块,加完精修就几千了。
其实有方法能省钱的,可以借助2个微信小程序,一个是“雪绢阁”专业修图10元一张,另一个是“印鸽”打印照片,照片书,摆台,甚至更多DIY物件基本都是二十左右搞定,所以我的建议是原来套餐里的还在影楼做,谈套餐的时候底片多要点,然后如果想加精修,就别去影楼那么贵了。