语义分割算法复习
本文介绍了语义分割算法的复习,包括UNet系列、FCN、FPN、SegNet、PSPNet和DeepLab系列。UNet系列是编码器-解码器架构,使用跳跃连接和特征拼接。FCN使用全卷积网络和特征融合。FPN使用金字塔池化和特征相加。SegNet使用编码器-解码器结构和maxpool索引。PSPNet使用金字塔池化和空洞卷积。DeepLab系列使用空洞卷积和条件随机场。最后介绍了DeepLab v3+的解码器模块和性能。
type
status
date
slug
summary
tags
category
icon
password
目录
语义分割网络剖析
语义分割是图像分割中的基本任务,是指对于图像将每个像素都标注上对应的类别,不区分个体。
1.UNet系列
1.1 UNet
编码器-解码器架构,四次下采样(maxpooling),四次上采样(转置卷积),形成了U型结构。
网络首先对输入图片进行了4组卷积和下采样操作来获取图像的高阶特征,之后同样通过4组反卷积将图像放大回接近输入图像的大小。
Unet最核心的一个思想: 特征图的拼接
Unet一个重要的创新是在相同深度的block之间加入了跳转连接。
UNet网络有几个主要的特点:
① 网络可以从中间分为左右两部分,左边是收缩路径,利用降采样和卷积模块提取不同尺度的特征;右边是扩展路径,利用上采样和卷积模块恢复尺度并融合先前特征,逐渐恢复图像;
② 卷积模块由两层连续的卷积层组成,它可以实现更大尺寸和更高深度的特征提取;降采样实现图像尺度的缩小;上采样(或反卷积层)实现图像尺度的变大;
③ 图中灰色的箭头线表示跳连,作用是在同一尺度下,将收缩路径上的特征合并到扩展路径上的特征,这样可以在扩展路径上提供更好的约束,网络也更容易输出我们期望的结果。
从UNet结构图可以知道,收敛路径主要的过程为
(1) 首先定义重复使用的卷积模块(函数)
重复两次“卷积层 -> 标准化层 -> 激活函数”,即创建了两个串联的卷积层,这是一种常用的特征提取器,最后输出X。
(2) 收敛路径
输入图片 -> ①(卷积模块 -> 下采样 -> dropout层) -> ②(卷积模块 ->下采样 -> dropout层) -> ③(卷积模块 ->下采样 -> dropout层) -> ④(卷积模块 ->下采样 -> dropout层)
img = Input(shape=self.shape) # self.shape是图片维度大小
c1 = conv2d_block(img, n_filters=n_filters * 1, kernel_size=3, batchnorm=batchnorm, padding=padding)
p1 = MaxPooling2D((2, 2))(c1)
p1 = Dropout(dropout * 0.5)(p1)
......
(3) 扩展路径
输入上一层的输出 -> ⑥(上采样 -> 特征合并 -> dropout层 -> 卷积模块) -> ⑦(上采样 -> 特征合并 -> dropout层 -> 卷积模块) -> ⑧(上采样 -> 特征合并 -> dropout层 -> 卷积模块) -> ⑨(上采样 -> 特征合并 -> dropout层 -> 卷积模块)。
u6 = Conv2DTranspose(n_filters * 8, (3, 3), strides=(2, 2), padding='same')(c5)
u6 = concatenate([u6, c4])
u6 = Dropout(dropout)(u6)
c6 = conv2d_block(u6, n_filters=n_filters * 8, kernel_size=3, batchnorm=batchnorm, padding=padding)
......
(4) 输出层
根据输出图片的数据格式,可以定义我们的输出层:
output = Conv2D(1, (1, 1), activation='sigmoid')(c9)
return Model(img, output)
简要总结:
- 首先进行Conv+Pooling下采样;
- 然后反卷积进行上采样,crop之前的低层feature map,进行融合;
- 再次上采样。
- 重复这个过程,直到获得输出388x388x2的feature map,
- 最后经过softmax获得output segment map。总体来说与FCN思路非常类似。
FCN、Unet、Unet++: 医学图像分割网络一览
1.2 UNet++
UNet++是在UNet的基础上添加嵌套和密集跳过连接的CNN.
借鉴了DenceNet的密集连接,对Unet改进的点主要是skip connection,下图所示,其中黑色部分代表的就是原始Unet结构,绿色代表添加的卷积层,蓝色代表改进的skip connection,每一个水平层就是非常标准的DenseNet的结构。
引入了深度监督的思路。网络的loss函数是由不同层得到的分割图的loss的平均,每层的loss函数为 Dice loss 和 Binary cross-entropy loss 之和,引入DSN(deep supervision net)后,通过model pruning(模型剪枝)能够实现模型的两种模式:高精度模式和高速模式。
UNet++性能的提升和参数量无直接关系,和网络结构有关。
为什么UNet++可以被剪枝?
测试时,剪掉部分对剩余结构不做影响;训练时,剪掉的分支对剩余部分有影响。
如何剪枝? 根据子网络在验证集的结果来决定剪多少。
剪枝好处在哪里? 模型的内存可以节省18倍 (移动端使用)。
1.3 UNet 3+
使用全尺度的跳跃连接把不同尺度的特征图相融合,并且通过深度监督从多尺度聚合的特征图中学习特征表达,还提出了一种混合损失函数,将分类任务和分割任务相结合可以增强器官边界和减少非器官图像的过度分割,从而获得更准确的分割结果。
2.FCN
思路:通过将全连接层变成上采样层来恢复特征图的尺寸,进行端到端训练。采用VGG作为效果最好,但是推理最慢;
核心的思想是特征图的融合;
backbone是分类网络,下采样都是maxpooling,上采样使用的是双线性插值初始化的转置卷积。
做语义分割,核心思想:
- 不含全连接层(fc)的全卷积(fully conv)网络。可适应任意尺寸输入。
- 增大数据尺寸的反卷积(deconv)层。能够输出精细的结果。
- 结合不同深度层结果的跳级(skip)结构。同时确保鲁棒性和精确性。
FPN
单一维度的图片作为输入,然后它会选取所有层的特征来处理然后再联合起来做为最终的特征输出组合。
1.普通CNN特征自底至上逐层浓缩表达特征的一个过程;
2.自上至下的:在将上层feature map等比例放大后再与本层的feature maps做逐个元素地(element wise)相加。
3.CNN层特征与每一级别输出之间的表达关联。用1x1的Conv即可生成较好的输出特征,它可有效地降低中间层次的channels 数目。
FCN,FPN,UNet对比总结:
三者都是对称的下采样再上采样的全卷积网络。
在上采样方式上:
FCN和U-Net都是使用以双线性插值为初始值的反卷积;
FPN最近邻上采样。
在特征融合:
FCN将不同尺度的特征简单相加 ;(tf.add)
U-Net将浅层特征截取后和高层特征拼接;(tf.concat)
FPN是用1*1卷积处理浅层特征图再和高级特征相加。
3.SegNet
使用编码器-解码器结构,backbone是2个VGG16,去掉全连接层;
核心的想法是提出了maxpool索引来解码的方法,节省了内存;
4.PSPNet
核心idea是提出了金字塔池化模块,模型带有空洞卷积;
金字塔池化(Pyramid pooling)融合了四个比例的特征,结合多尺寸信息:SPP
其backbone为修改Resnet-101 为 ResNet-103,而且有辅助 loss,上采样是双线性插值 。
5.DeepLab 系列
5.1 DeepLab v1
核心思想是使用空洞卷积扩大感受野,条件随机场(CRF)细化边界
backbone是VGG16,下采样8倍
5.2 DeepLab v2
和v1比多了ASPP(空洞空间卷积池化金字塔)
流程上是DCNN + Atrous convlution + CRF
backbone是VGG16和ResNet-101,下采样8倍
ASPP是多尺度下融合特征,CRF是进行边界的精确化
5.3 DeepLab v3
和v2的区别在于ASPP多了image-level feature,没有使用CRF
提出了mutil-grid,改进了级联网络的性能
流程上是端到端训练,backbone是ResNet-101
下采样有8倍和16倍两种,8倍性能更好
计算损失时,将输出的上采样
5.4 DeepLab v3+
和v3的区别是多了一个解码器模块,backbone用了Aligned Xception(其中有深度可分解卷积)
PASCAL VOC 2012达到了87.8%的mIOU,在JFT预训练的DeepLab v3+在PASCAL VOC 2012上至今领先,
达到了80%,但是JFT-300M是谷歌的内部数据集,不开源
钱包余额 0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
Loading...