• FCN(Fully Convolutional Networks),
    U-Net(Biomedical Image Segmentation),
    Mask RCNN(Instan Segmentation by FCN Mask Layer)
    分析总结
  1. 相关工作
     我们知道,CNN有很出色的特征提取能力,避免了人工提取特征的局限性,这也意味着CNN有很好的分类性能,它解决了图像识别的一大难题。那这么强大的CNN它的功能只局限于此吗?当然不,事实上,CNN现在被研究者扩展到更多的任务中了,比如目标检测RCNN、YOLO等,图像分割FCN、U-Net等,更甚有集结目标检测识别和实例分割任务于一体的Mask RCNN网络架构。当然,每天都有研究者不断在研究和开发CNN的新功能。
    在2012年,Ciresan用CNN来挑战语义分割任务。Ciresan采取滑窗的方式,取以每个像素点为中心的小图像块(patch)输入CNN来预测该像素点的语义标签。这是个很有意义的尝试,打破CNN只用于目标分类的先河,作者也取得了当年state-of-art的成就。不过,这个方法的缺点也很明显,需要遍历每个像素点提取patch进行训练、预测,速度慢、很耗时;取多大的patch才合适,太小了缺少上下文信息,太大了会增加很多计算量;无疑很多patches之间存在着大量冗余计算。
    到了2015年(实际2014年就发到arXiv上了),伯克利大学的Jonathan Long等人提出了FCN(Fully Convolutional Networks)网络架构,也就是将传统的CNN中的全连接层也替换成了卷积层,实现端到端的语义分割目标。一来,用卷积操作替换掉传统的全连接操作,可以使得网络模型在一次前向计算中得出多个输入区域的得分(相比滑窗方式遍历计算输入区域得分自然要高效很多);二来,全卷积网络避免了全连接层中输入图像尺寸必须固定的弊端,也就是可以处理任意尺寸的输入;最后,在替换掉全连接的全卷积层之后,采用反卷积的方式对输出的heat map进行上采样,使得输出的预测图和输入图的尺寸一致,这样反向传播时直接计算对应像素间的分类损失即可。
    还是2015年, 德国弗莱堡大学的Olaf Ronneberger等人提出了基于CNN的U-Net模型,并在ISBI 挑战赛的电子显微镜神经元结构分割任务中取得很好的成绩。作者也做了一些相关的实验,发现这个精致的、不算大的网络模型对生物图像边缘分割任务具有不错的性能,尤其是不需要很多的训练数据,实际上作者的训练集原本只有30张图像,经过扭曲形变进行图像增强之后也才将训练集扩展了数倍。其实作者也是借鉴了FCN模型,U-Net和FCN的网络架构有些类似,同样是在第5阶段的卷积层之后开始反卷积上采样,将高层特征与低层特征进行融合,最终输出的预测图直接和输入图计算像素语义分类的损失。但是U-Net很明显是一个对称的模型,前左半部分作者称之为收缩路径(contracting path),也就是一个完全下采样的过程,后右半部分称之为扩展路径(expanding path),主要是反卷积上采样以扩大feature map的过程,最后将各对称路径之间的feature map进行融合。此外,在U-Net中,作者完全取消了FCN中的“全连接”操作,还额外将前两个阶段的卷积结果与输出的maps进行融合,得到最终预测结果。
    2017年,Facebook人工智能研究院(FAIR)的何凯明等人提出了Mask RCNN模型,这算是RCNN系列的终极版本了(当然,这不算是RCNN结束了,作者在Mask RCNN中提出了很多可以改进的地方)。总的来说,相比Faster RCNN,Mask RCNN的改进之处就是将ROI Pooling操作换成了ROI Align,还有就是加入Mask Layer用以对前面检测到的ROI进行实例分割。
     在ROI Pooling中,由于预选框的坐标通常是由模型回归得到的,一般是浮点数,所以它映射到feature map上提取ROI区域时也通常会是浮点数,作者在这里进行了量化取整操作;另外,将ROI划分成固定大小的k*k个小单元格时,通常也不一定得完整划分(整除),作者在这里又进行了简化操作,即再次量化取整。而这两次量化过程则会造成区域的不匹配(misalignment)问题,会对结果造成影响。所以何凯明等人将ROI Pooling改进成ROI Align操作,也就是取消掉两次量化过程,采用双线性插值的方法对坐标为浮点数的位置进行赋值。当然,ROI Align的目的和ROI Pooling是一样的,都是为了将ROI内的特征映射到固定的大小。实验表明,ROI Align的效果要比简单的ROI Pooling好,虽然Misalignment在分类问题上影响并不大,但在 Pixel 级别的 Mask 上会存在较大误差。
     而Mask RCNN的另一个出色的地方就是在每个ROI上加入了用FCN实现的Mask Layer分支,这个分支最终输出的是相应ROI区域的 K m 2 Km^2 Km2个masks, K K K表示类别数, m m m表示尺寸大小。也就是每个ROI输出K个 m ∗ m m*m mm大小的预测masks,当然,在计算损失 L m a s k L_{mask} Lmask时,只需计算当前ROI所对应类别(这个是由分类分支得知的)的mask与gt之间的二值交叉熵损失即可,其他输出的masks不予考虑。每个ROI都是单独地用sigmoid来做二值分类的(而FCN、U-Net之类的,则是对全图像进行softmax分类,也就是预测像素的多个可能的类别,这训练起来麻烦多了),所以避免了类间分类的竞争,有利于训练过程。

  2. 网络架构对比分析
     FCN的特征提取骨干网络分别采用了ZF.和VGGNet,两者结构相差不多,都是5层卷积层来提取特征。作者改动的是在feature map之后用卷积层替换掉全连接层,这样使得CNN可以接受任意尺寸的输入。然后再全连接操作之后对heat map进行转置卷积上采样,使得输出分割图的大小和输入一致。这样的网络架构使得像素级别的分割十分高效。
    在这里插入图片描述
     实际上,只是以卷积的形式来实现全连接,并不是不存在全连接层了。这样做的好处是,不需要在全连接层之前将feature map映射到固定大小的特征向量,也就是可以处理任意尺寸的输入。此外,在某些情况下,这样的全卷积网络更加高效(比如,要预测一张输入图像上多个区域的分类时,这时候一次前向传播即可)。经过全连接层之后,会得到 h × w × k ( k m e a n s   k   c l a s s e s ) h\times w\times k(k means\ k\ classes) h×w×k(kmeans k classes)的heat map,然后对进行反卷积,将它上采样到输入图像的尺寸,每个像素的分类得分是根据该像素的softmax最高得分类作为预测结果,最后计算ground truth和分割map之间的损失以反向传播优化网络模型。
    在这里插入图片描述
     FCN中,经过前5层卷积网络之后,图像其实缩小了32倍,作者的第一种方案是直接对第5层池化结果进行32倍的上采样。但是仅仅这么做并不能取得好的分割结果,因为我们知道,CNN越高层的特征越抽象,其语义信息更丰富,而低层特征则包含更多的局部信息(比如边缘、位置等),如果只采用最后一个卷积层池化得到的特征来分割,目标的边缘细节会比较模糊(见下图x)。而FCN的另一个亮点是采用了跳跃连接来融合低、高层特征以提高分割性能。作者还尝试了将输出的heat map进行4倍和2倍上采样,并分别与第3层和第4层的池化结果进行融合,最终再分别以8倍和16倍将heat map上采样,得到最终分割map。实验结果证明,融合了前两层特征的FCN(也就是FCN-8s)效果更佳。
    在这里插入图片描述
     U-Net模型是基于FCN进行修改与扩展而来的,可以看到U-Net是左右对称的网络架构,左半部分称为收缩路径,右半部分称之为扩展路径。作者改动FCN的动机是想要网络在更小的数据集上训练并得到更好的分割结果。FCN的主要思想是对常规的收缩网络(卷积池化提取图像特征的过程可以视为一个不断收缩的过程)进行补充,补充的方法是使用反卷积上采样,可这还不够,还需要与低层特征融合。作者对FCN的改动主要有两个,一是对上采样过程的改进,使用 ( 2 × 2 ) u p − c o n v (2\times2)up-conv (2×2)upconv对feature map进行上采样,并且使用大量的feature channels,使得网络可以将大量的低分辨率层信息上传到高分辨率层,这样一来,扩展层与收缩层基本对称。在将低分辨率层的特征传入高分辨率层时,由于作者采用的是无填充的卷积,所以图像的边界信息是会受损的,因而需要将低分辨率层的feature map进行裁剪之后再复制到高分辨率层进行融合。改动二是取消掉了全连接操作,即直接在第5个卷积层的输出上进行 ( 2 × 2 ) u p − c o n v (2\times2)up-conv (2×2)upconv上采样,FCN在这里是先进行全连接操作。这样做的好处是,一方面取消掉全连接层,意味着网络的参数量会大大地减少(全连接层产生的参数量远比多个卷积层的参数量还大),另一方面是便于采用结构对称的 ( 3 × 3 ) c o n v (3\times3)conv (3×3)conv来融合低、高层特征。最终,就形成了如下图的U状的CNN结构。在网络的输出端,作者采用 ( 1 × 1 ) c o n v (1\times1)conv (1×1)conv来将获得最终的2类分割map,即在这个任务中,是要对图像进行二值边缘分割的。
    在这里插入图片描述
     Mask RCNN是经过Faster RCNN改进过来的,主要有两个改动,一是将ROI Pooling改成ROI Align,另一个是在ROI Align之后,添加一个FCN分支,用以对ROI进行分割。值得注意的是,这样的机制很容易实现实例分割。
     首先,由于ROI Pooling过程中存在两次量化操作,一是有模型回归得到的预选框位置一般是浮点数,预选框映射到ROI中时,量化为整数坐标;还有就是ROI Pooling的输出需要固定尺寸,也就是需要将ROI平均划分成 k × k k\times k k×k个小单元,而这ROI往往也不能恰好被k整除,ROI Pooling在这里又进行了一次量化。这两次量化会造成区域的不匹配,对于分类任务而言,影响不大,但对于像素级的语义分割却关系紧乎。ROI Align中,取消掉这两次量化的过程,将预选框映射为ROI时采用双线性插值的方法来给坐标在浮点数上的位置赋值,将ROI划分成 k × k k\times k k×k小单元格时,在每一个小单元格中取四个固定点,用双线性插值法给这些固定点赋值,最后取这四个固定点中的max值作为该单元格的输出值。
     其次,对于每一个ROI,级联的FCN分支会输出 K m 2 Km^2 Km2个masks, K , m K,m K,m分别表示类别数和mask的size。也就是说每个ROI的可能类别有K种,所以前向传播的时候,需要计算K个类别的mask。每一个ROI经过另外两个分支之后,会输出它的分类得分和边框微调坐标,也就是说每个ROI的类别已经被预测出来了,所以在对该ROI进行分割的时候不需要关注它的类别了,只需要将ROI中的背景和目标分割出来。因此,在计算像素预测时直接采用sigmoid来获得二分类概率,而FCN中则是每个像素对应多个类别的标签,所以它采用的是softmax函数来获得多分类概率。那这样每个ROI输出K个masks的话,怎么计算损失呢?前面知道,每个ROI的类别可以由分类网络分支得到,也就是说ROI是哪一类就采用那一类对应的mask来和该instance ground truth计算损失,其他masks则不管,然后反向传播优化权重的时候只更新该部分连接的权重。这样的方式,使得网络只需关注背景与目标的分割,而不需关注多类别的分割,避免了类间分类的竞争,对于网络的训练十分有帮助。
    image
    image
    实际上并不是直接对ROI特征上采样,而是经过多层卷积之后才反卷积的

  3. 实验对比分析
     在FCN中,作者采用的训练数据集除了PASCAL VOC 2011的分割训练数据集(含有1112张带标注的训练图像)外,还收集到了额外的8498张带标签PASCAL训练图像。PASCAL VOC数据集是自然场景下的图像集,可用于分类、检测和分割的目标任务。而它的语义分割数据集如下,目的是将图像中的各类别目标从背景中分割出来,图像中的每一个像素都对应着一个类别标签。
     在这个数据集的基础上,进一步做数据增强处理,得到最终训练集。作者采用的深度学习框架是Caffe,训练和测试均是在单个NVIDIA Tesla K40c上进行的。模型的初始化策略是,采用VGGnet模型来初始化“全连接层”之前的骨干网络,后面的分类得分层初始化为0,然后对网络进行微调(fine-tune)。在训练时,作者并没有采取patch-wise训练方式,而是将所有训练集图像缩放到固定大小(如224*224),然后整张图像输入网络训练。经过“全连接”层之后,开始对heat map进行反卷积,并与前3层pooling结果进行融合,最终输出预测的mask。值得注意的是,尽管只是fine-tune,但依然花费好几天的时间来训练才收敛。
    在这里插入图片描述
    依次是,FCN-8s,SDS,Ground Truth和原始图像

    在这里插入图片描述
    3种跳跃连接的结果对比

    在这里插入图片描述
    性能测试对比
     U-Net在生物医学图像分割、识别方面有较好的表现。作者则是用U-Net对电子显微镜下的细胞膜神经元结构和细胞边缘等进行边缘分割。训练集的原始图像集只有30张,作者设计U-Net模型也是出于考虑到医学领域的图像数据集的特殊性、标注良好的训练数据稀缺等因素,所以U-Net是一个结构比较紧致的模型,实际上它在很多生物医学图像分割任务中效果不错。

    在这里插入图片描述
    依次是,U-Net Prediction,Ground Truth和原始图片
     在U-Net模型中,作者采用的全部是无填充的卷积,每一层卷积输出都会变小,最终输出的分割map也不会是和输入一样的大小。那么怎么和金标准计算损失呢?作者采用了overlap-tile技术,也就是要预测一个patch的标签,就要输入比它更大的图像patch,那么对于超出原始图像边界的patches,就用镜像法扩展图像。这样一来,就可以实现边界处和重叠部分tiles的无缝分割了。
    实际上,30张原始训练图像大小为512*512,数据集很少,但由于这个数据集对应的任务比较特殊,作者对这个数据采用形变增强处理,得到大量最终的训练数据集。而每一张训练图像,作者在其四个边界处进行了镜像处理,将训练图像扩展到572*572,而最终的输出分割map为2*388*388,这是和金标准大小一样的。
    在这里插入图片描述
    作者采用overlap-tile策略来对任意大尺寸图像实现无缝分割
     作者基于Caffe深度学习框架,在一个NVidia Titan GPU (6 GB)上训练了10个小时,得到最终模型。U-Net模型分割一张512*512大小的图像平均用时不到1s。

    在这里插入图片描述
    在数据集PhC-U373和DIC-HeLa上的分割结果(IOU)
     Microsoft COCO: Common Objects in Context 原文 | 翻译
     Mask RCNN是在MS COCO数据集上进行训练和测试的。该数据集有328k张图片,包含有250万个标注实例。其中,实例分割的训练集有118287张图像,验证集有5000张图像,测试集有40670张图像。作者是在Caffe框架下搭建模型,在8块Nvidia Tesla M40 GPU上训练Mask RCNN模型,训练时间在一到两天。在单个GPU上测试时,平均每帧大概需要200ms(也就是5fps)。
    在这里插入图片描述
    Mask RCNN在COCO上的测试结果
    在这里插入图片描述
    在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐