Deep Learning In Image Segmentation
简介
图像分割是指根据灰度、色彩、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些区域在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。图像分割可以认为是按照像素进行分类的问题。
传统分割方法
- 基于阈值的分割方法
阈值法的基本思想是基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值作比较,最后将像素根据比较结果分到合适的类别中。因此,该方法最为关键的一步就是按照某个准则函数来求解最佳灰度阈值。
图像若只有目标和背景两大类,那么只需要选取一个阈值进行分割,此方法成为单阈值分割;但是如果图像中有多个目标需要提取,单一阈值的分割就会出现作物,在这种情况下就需要选取多个阈值将每个目标分隔开,这种分割方法相应的成为多阈值分割。
- 基于区域的图像分割方法
区域生长是从一组代表不同生长区域的种子像素开始,接下来将种子像素邻域里符合条件的像素合并到种子像素所代表的生长区域中,并将新添加的像素作为新的种子像素继续合并过程,知道找不到符合条件的新像素为止,该方法的关键是选择合适的初始种子像素以及合理的生长准则。
区域生长算法需要解决的三个问题:
(1)选择或确定一组能正确代表所需区域的种子像素;
(2)确定在生长过程中能将相邻像素包括进来的准则;
(3)指定让生长过程停止的条件或规则。
- 区域分裂合并
区域生长是从某个或者某些像素点出发,最终得到整个区域,进而实现目标的提取。而分裂合并可以说是区域生长的逆过程,从整幅图像出发,不断的分裂得到各个子区域,然后再把前景区域合并,得到需要分割的前景目标,进而实现目标的提取。其实如果理解了上面的区域生长算法这个区域分裂合并算法就比较好理解啦。
四叉树分解法就是一种典型的区域分裂合并法,基本算法如下:
(1)对于任一区域,如果H(Ri)=FALSE就将其分裂成不重叠的四等分;
(2)对相邻的两个区域Ri和Rj,它们也可以大小不同(即不在同一层),如果条件H(RiURj)=TURE满足,就将它们合并起来;
(3)如果进一步的分裂或合并都不可能,则结束。
其中R代表整个正方形图像区域,P代表逻辑词。
- 分水岭算法
分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。
- 基于边缘检测的分割算法
基于边缘检测的图像分割算法试图通过检测包含不同区域的边缘来解决分割问题。它可以说是人们最先想到也是研究最多的方法之一。通常不同区域的边界上像素的灰度值变化比较剧烈,如果将图片从空间域通过傅里叶变换到频率域,边缘就对应着高频部分,这是一种非常简单的边缘检测算法。
基于深度学习的图像分割
基于深度学习的图像分割技术主要分为两类:语义分割及实例分割。
语义分割
语义分割会为图像中的每个像素分配一个类别,但是同一类别的对象不会进行区分。对应上图中间部分。
实例分割
实例分割不仅要进行像素级别的分类,还要再此基础上区分开不同的实例。所以实例分割需要在语义分割的基础上对同类物体进行更精细的分割。
全卷积层(FCN)
传统的CNN其确定的网络输入图像的大小也是固定的,因为全连接层的每个节点都与上一层的全部节点项链,当输入图像大小不同时,全连接层前的feature map的大小也不相同。由于卷积只需要用卷积核在图像上遍历即可得到结果,并不会限制输入图像的尺寸。所以只要将全连接层也转化为卷积层,就可以使得神经网络输入图像的尺寸不受到限制。
且实现全连接层需要进行Flatten操作,将二维的feature maps被压缩成一维,丢失了空间信息,这对语义分割造成了困难,所以我们需要丢弃全连接层。
FCN对图像进行像素级的分类,从而解决了语义级别的图像分割问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图(heatmap)上进行逐像素分类。最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。
Mask R-CNN
- ROI Align
ROI Pooling的量化误差问题
由于ROI Pooling操作会产生区域不匹配的问题,而像素值只能为整数,此时就只能对像素取整处理,引入了一次量化误差
示例:输入特征图尺寸为55,而网络输入尺寸为22,那么网格的划分结果为
而对于每个小网格进行Max Pooling又要进行一次量化操作,这两次量化操作在feature maps上映射会原图就会产生较大的误差。
为了解决ROI Pooling的上述缺点,作者提出了ROI Align这一改进的方法。ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。(双线性插值是一种比较好的图像缩放算法,它充分的利用了原图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将虚拟的位置点对应的像素值估计出来。)
- Instance segmentation
Mask-RCNN的BackBone为ResNet,当输入的Bounding Box传入网络到ResNet的倒数第四层时,得到7x7x1024的ROI Feature,然后分为两个分支,其中一个与Faster R-CNN一样负责分类和回归计算,另一分支采用FCN(全卷积网络)进行升维到与输入图像尺寸一致的单通道map。每个像素的值用0和1表示,1代表属于该分类物体,0代表不属于,生成的map称为Mask(即做到像素级的分类,以达到实例分割的效果)。
- 损失函数
$$
L=L_{cls}+L_{box}+L_{mask}
$$
Lmask定义为the average binary cross-entropy loss ,定义的Lmask允许网络为每一类生成一个mask,而不用和其它类进行竞争;我们依赖于分类分支所预测的类别标签来选择输出的mask。这样将分类和mask生成分解开来。
PAN(路径聚合网络)
PANet是基于Mask-RCNN的改进,目的是基于推荐区域的实例分割框架中促进信息流的增长,其主要改进如下:
- 通过自底向上的路径增强特征在较低层中使用准确的定位信息来增强整个特征层次结构,从而缩短了较低层与最高特征之间的信息路径。
- 提出了自适应特征层,该特征池链接了特征网格和所有特征级别,以使每个特征级别中的有用信息直接传播到以下层子网。
- 创建一个为每个候选区域捕获不同视图的互补分支,以进一步改善Mask预测。
- 自底向上增强路径
在FPN层后面添加bottom-up path augmentation(对应图中绿色虚线),由少于10层组成。这样浅层特征经过底下原来FPN的lateral connection连接到P2再从P2沿着bottom-up path augmentation传递到顶层,能较好地保留浅层特征信息。
- bottom-up path augmentation
Ni 经过卷积核尺寸为3x3,stride=2的卷积层,特征图尺寸缩减为原来的一半,然后和Pi +1做 element-wise add,得到的结果再经过一个卷积核尺寸为3x3,stride=1的卷积层得到Ni+1 ,特征图尺寸不变。
- Adaptive Feature Pooling
Mask R-CNN中RPN网络生成的ROI都需要经过ROI Align提取ROI特征,提取的特征都是单层特征。Adaptive Feature Pooling将此处的单层特征替换成多层特征,将多层特征全卷积后进行融合再进行ROI Align操作。
- 全连接融合
与FCN相比,FC层能产生不同的属性。FCN在局部像素的基础上对每个像素进行预测,并且在不同的空间位置共享参数。相反,FC层是位置敏感的,通过改变参数集可以实现不同空间位置的预测,因此它具有适应不同空间位置的能力。还使用整个推荐区域的全局信息在每个空间位置进行预测,对区分实例并识别属于同一目标的独立部分很有帮助。给定FC层和卷积层的属性互不相同,针对原有的分割支路(FCN)引入了一个前、背景二分类的全连接支路,通过融合这两条支路的输出得到更加精确的分割结果,可以获得更好的Mask预测。