U-net
U-net
参考资料
论文链接:U-Net: Convolutional Networks for Biomedical Image Segmentation | SpringerLink
U-net的结构
因为U-net的操作过程如“U”形,故而称为U-net,其具体结构如图8:
若已经理解前面U-net的基础知识,将能更好地看懂整个U-net的结构。首先看一下图例的含义:
①深蓝色箭头:利用3×3的卷积核对图片进行卷积后,通过ReLU激活函数输出特征通道;
②灰色箭头:对左边下采样过程中的图片进行裁剪复制;
③红色箭头:通过最大池化对图片进行下采样,池化核大小为2×2;
④绿色箭头:反卷积,对图像进行上采样,卷积核大小为2×2;
⑤青色箭头:使用1×1的卷积核对图片进行卷积。
该U-net网络一共有四层,分别对图片进行了4次下采样和4次上采样。由于结构部分数字比较多,过程比较繁琐,下面将按照自己的理解尽可能地把整个过程描述清楚。
从最左边开始,输入的是一张572×572×1的图片,然后经过64个3×3的卷积核进行卷积,再通过ReLU函数后得到64个570×570×1的特征通道。然后把这570×570×64的结果再经过64个3×3的卷积核进行卷积,同样通过ReLU函数后得到64个568×568×1的特征提取结果,这就是第一层的处理结果。
第一层的处理结果是568×568×64的特征图片,通过2×2的池化核,对图片下采样为原来大小的一半:284×284×64,然后通过128个卷积核进一步提取图片特征。后面的下采样过程也是以此类推,每一层都会经过两次卷积来提取图像特征;每下采样一层,都会把图片减小一半,卷积核数目增加一倍。最终下采样部分的结果是28×28×1024,也就是一共有1024个特征层,每一层的特征大小为28×28。
右边部分从下往上则是4次上采样过程。从最右下角开始,把28×28×1024的特征矩阵经过512个2×2的卷积核进行反卷积,把矩阵扩大为56×56×512(注意不是1024个卷积核,结果仅仅是右半边蓝色部分的512个特征通道,不包含左边白色的),由于反卷积只能扩大图片而不能还原图片,为了减少数据丢失,采取把左边降采样时的图片裁剪成相同大小后直接拼过来的方法增加特征层(这里才是左半边白色部分的512个特征通道),再进行卷积来提取特征。由于每一次valid卷积都会使得结果变小一圈,因此每次拼接之前都需要先把左边下采样过程中的图片进行裁剪。矩阵进行拼接后,整个新的特征矩阵就变成56×56×1024,然后经过512个卷积核,进行两次卷积后得到52×52×512的特征矩阵,再一次进行上采样,重复上述过程。每一层都会进行两次卷积来提取特征,每上采样一层,都会把图片扩大一倍,卷积核数目减少一半。最后上采样的结果是388×388×64,也就是一共有64个特征层,每一层的特征大小为388×388。
在最后一步中,选择了2个1×1的卷积核把64个特征通道变成2个,也就是最后的388×388×2,其实这里就是一个二分类的操作,把图片分成背景和目标两个类别。
U-net的输入
由于在不断valid卷积过程中,会使得图片越来越小,为了避免数据丢失,在图像输入前都需要进行镜像扩大,如图9所示:
可以看到图像在输入前,四个边都进行了镜像扩大操作,以保证在通过一系列的valid卷积操作之后的结果能够与原图大小相一致。由于有些计算机的内存较小,无法直接对整张图片进行处理(医学图像通常都很大),会采取把大图进行分块输入的训练方式(如图9中的黄色框),最后将结果一块块拼起来。为了避免在拼接过程中边缘部分出现不连接等问题,在训练前,每一小块都会选择镜像扩大而不是直接补0扩大(如图9中的蓝色框),以保留更多边缘附近的信息。
U-net的卷积核大小、卷积核数量、卷积核中的数值、训练深度怎么确定?
①U-net卷积核的大小为什么是3×3?
其实卷积核的大小是可以自己定义的,或者根据实验结果的优劣来进行选择。但一般的选择原则为卷积核越小越好,且一般为奇数×奇数的正方形。卷积核越小,能够大大地降低计算复杂性,但其中1×1的卷积核不具有提升感受野的作用,而卷积核为偶数×偶数时不能保证图片在进行same卷积操作后,还能够还原到原本的大小(会比原图多一条边/少一条边,自己画个图就明白了),因此通常选用3×3的卷积核。
②每一层的卷积核数量为什么是64→128→256→512→1024?
目前卷积核的数量也没有一个金标准,也是自己设置或者根据实验结果的好坏进行选择。但是卷积核过少会导致特征提取得不充分,导致训练效果差,而卷积核过多则会大大加大计算量,会存在过多冗余信息。在U-net浅层中,提取的一般是颜色、轮廓等比较浅显的图像特征,因此卷积核数量不需要特别多,而随着U-net训练层数越深,提取的很多都是图片中无法命名的抽象特征,因此需要更多的卷积核才能够把这些特征提取出来。而U-net每一层都会把卷积核数量翻一倍,是因为经过下采样后图片大小会变成原来的一半,因此认为卷积核应该增多一倍才能够更全面地提取图片特征。
③卷积核中的数值如何确定?
前面提到过,卷积核中的数值实际上就相当于是一般全连接神经网络中的权值,在全连接神经网络中,权值的确定一般都是经过“初始化→根据训练结果逐步调整→训练精度达到目标后停止调整→确定权值”这样一个过程,因此U-net卷积核中数值的确定过程也是类似的,一开始也是先用随机数(服从高斯分布)进行初始化,后面则根据前面提到的损失函数逐步对数值进行调整,当训练精度符合要求后停止,即能确定每个卷积核中的数值。而调整卷积核数值的过程,实际上就是U-net的训练过程,当卷积核结束训练确定数值后,则U-net训练完成,下面将可以用测试集来测试网络的鲁棒性和对新的图片进行分割预测。
④U-net训练深度如何确定?
这跟全连接神经网络中“神经网络层数如何确定”这样一个问题是类似的,目前也没有一个专门的标准,一般根据经验选取,或设置多种不同的深度,通过训练效果来选择最优的层数。U-net原文中也没有提到为什么要选择4层,可能是在该训练项目中,4层的分割效果最好。
如何解决U-net训练样本少的问题?
医学影像数据存在一个共同的特点,就是样本量一般较少,当训练样本过少时,容易使得训练效果不佳。解决该问题的方法是数据增强,数据增强可以在训练样本较少时,也能够让神经网络学习到更多的数据特征,不同的训练任务,数据增强的方法也不尽相同。由于U-net文章中的任务是分割Hela细胞,作者选择了弹性变换的方式进行数据增强,如图10所示:
————————————————
1 | 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 |
原文链接:https://blog.csdn.net/qq_33924470/article/details/106891015
图10的弹性变换其实就是把原图进行不同的弹性扭曲,形成新的图片,扩大样本量,由于这种弹性变化在细胞中是十分常见的,人为增加这种数据量能够让U-net学习到这种形变的不变性,当遇到新的图像时候可以进行更好地分割。
U-net 可以如何改进?
可以对U-net中的损失函数进行改进。损失函数有很多种,U-net原文中采用的是有权重的交叉熵损失函数,主要为了更好地分离粘连在一起的同类细胞设计的,如果分割的任务不同,也可以往损失函数中添加权重或进行其他的改进,以增强分割的准确性和鲁棒性。
②可以对U-net结构进行改进,如采用U-net++网络,如图11所示: