U-Net(网络结构对称,形似英文字母U)提出之初就是做医学图像分割的
后面有很多演变,比如FCN(全卷积网络,)、SegNet(旨在解决自动驾驶或者智能机器人的图像语义分割深度网络)、PSPNet(引入金字塔池化模型,是一种有效的全局上下文先验模型)、DeepLab(采用的 atrous(带孔)算法扩展感受野,获取更多的上下文信息),与FCN一样,都是encoder(负责特征提取)、decoder(解码器)的结构,结构简单并且有效。在一些类别较少的数据集上,一般使用unet来做语义分割,尤其用于二分类的结构上。
图 1U-Net网络学习
损失函数表示预测和目标之间的差异,常用交叉熵、Dice loss等。
评价参数是评价图像分割好坏的重要参数,常用 Dice等。
评价参数
先了解机器学习中的混淆矩阵:主要是解决二分类问题。
混淆矩阵参数:
精确率表示的是预测为正的样本中有多少被预测正确.
召回率就是召回目标类别,即表示样本中的正样本有多少被预测正确.
准确率是评估获得所有成果中目标成果所占的比率.
综合评价指标(F-Measure)是综合精确率和召回率的评估指标,用于反映整体的情况.
IoU通过预测边框和真实边框的比值计算两个样本的相似度或者重叠度.
mIoU为语义分割的标准度量
Dice计算两个样本的相似度或者重叠度
SSIM图像质量评价结构相似性指标,是基于样本x 和 y 之间对于亮度、对比度、结构这 3 个方面进行比较,其范围为[0,1],值越大,两图像之间的差异越小。
损失函数:
交叉熵损失函数:在0-1 之间.对于正样本而言,输出越大,意味着损失越小;对于负样本而言,越小,则损失越小。
Focal loss就是用来处理数据集中的难分样本.Dice 系数可以用来处理数据分类不均衡的情况。对于二分类,可以只考虑待分割区域,即是Dice loss函数。
基于 U-Net 改进的各类的图像分割方法
1、问题:传统的2D 图像处理模型处理 3D 的医学影像时,一是效率不高,二是会丢失大量的上下文。
解决方法:提出3D U-net输入输出是三维图像,提升了U-Net模型对三维图像的分割准确性。提出V-net输入 3D 图像按照通道拆分的同时,在每一层加入残差结构,以确保短时间收敛.降采样采用卷积操作替换最大池化操作,减小输入信号的尺寸的同时扩大特征感受野范围。
2、问题: 聚焦目标特征、抑制无关特征
解决方法:加入 SE模块 通过学习的方式来自动获取到每个特征通道的重要程度 ,依照这个重要程度去提升有用的特征,并抑制对当前任务用处不大的特征。
加入 attention块将计算资源偏向信号最具信息性的部分的方法。由于病灶较小且形状变化较大,常在 encoder(编码器) 和decoder(译码器) 对应特征拼接之前,或是在 U-Net的瓶颈处增加 attention模块来减少假阳性预测. 该模块将生成一个门控信号g,用以消除不相关和嘈杂的歧义在跳过连接中的响应,以突出通过跳过连接传递的显着特征。
一般在编解码器和瓶颈处加入 SE或者 attention模块,这两个模块都可以从空间和通道两个方面进行激励,以达到增强特征的效果。
3、问题:3D 卷积占用 CPU量过大
解决方法:
主要解决方法,一种方法是扩大 patch(补丁) 中的volume(体积),另一种方法是用较小的 batch size(一次训练所选取的样本数) 训练。
改进方法:(1)、加入稠密卷积块:以 2D网络的快速分割结果来指导
3D 模型的学习并实施分割。在编解码器引入 Dense connectivity 密集连接,避免了冗余特征的学习,增强了信息流动,在性能接近的前提下进一步减少了网络参数,降低了计算成本。
(2)、将 U-Net的编解码器每个单元采用可逆序列,同时使用传统的不可逆操作来进行下采样和上采样以及跳跃连接,激活只需要在每个可逆序列的末尾和不可逆的组件上保存。
(3)、加入SE 残差块:第 1 层是下采样,其余由 SE residual block代替,采用了 SE 残差块学习有效特征,以提升分割小解剖结构的性能。
(4)、通道分组:将循环通道分成多个组,这样可以减少特征映射和核心之间的连接,从而显著地节省参数。
(5)、加入 Inception块:采用 Dense-Inception模块,在增加网络深度的同时,又不会增加参数的数量;上下采样采用 Inception模块,保证图像分割的准确性。
(6)、 PBR-Unet:主要包括提取像素级概率图的功能提取模块和用于精细分割的双向递归模块。
4、问题:网络的上下文特征的融合、不同模态特征的融合。
解决方法:(1)对于上下文特征的融合:编解码器加入新的模块,能获取更高层次的信息,并保留2D 医学影像分割中的医学信息;在跳连处改进,U-Net的跳连结构主要是融合上下文的语义特征,以更好地分割病灶。由一系列带有残差连接的卷积层构成的 Res path取代 U-Net的级联,使低级特征经过进一步处理再与高级特征级联,以消除编码器的低级特征和解码器的高级特征融合时造成的语义差异。外接特征金字塔,从扩展路径的各个层次提取特征,最后将提取的特征串联,形成64 通道的最终特征映射,并传给用于特征分类滤波器中。
(2)对于不同模态的特征融合:传统的 U-Net网络对于多模态图像输入,采用先混合处理再输入的方式。提出深度级联脑肿瘤分割方法:是将编码器并行分出几个路径分别学习不同模态的特征表示,在跳连和 bottleneck(瓶颈)处采用像素最大化操作再与解码器级联。
5、问题:提高泛化能力(指网络可以混合训练来自不同提供商的图像)
解决方法:(1)从内部结构提出适应不同提供商图像的域适配器(2)从外部接入 Cycle-GAN 网络,Cycle-GAN是一个为未配对的图像到图像转换而设计的既定架构。
6、问题:对小样本训练数据集的改进
解决方法:从重复的网络结构和数据集标签两个方面进行
(1)重复的网络结构
在 bottleneck(瓶颈层) 重复使用 SRU门控单元,也可以重复使用整个 U-Net。
(2)数据集标签
以结合贝叶斯训练给定数据标签再进行网络训练,提升分割准确性;或者将一幅图像仅使用一个单一全局标签,以降低对数据量的要求。
基于 U-Net 面向结构模块的改进
1、编码器解码器结构的改进方法:一是卷积操作的改进,如加入协调引导卷积、长短残差结构;二是编解码器单元的改进,如可以可形变卷积块、循环残差卷积和概率模块;三是上、下采样的改进,如可以采用长短残差结构和最近邻插值的方法.
2、基于损失函数的改进方法:
(1)函数自身改进:Dice loss函数的一个局限性在于 FP与 FN的检测权重相等,这将导致分割图有较高的准确率(评估获得所有成果中目标成果所占的比率)和较低的召回率(表示样本中的正样本有多少被预测正确),而FN需要比 FP 高很多才能提高召回率,对分割求偏导数,从而不需要为不同类别分配权重,提出一个新的损失函数Cos-Dice损失函数,来加速学习进程。(2)两个函数的混合:针对医学数据类不平衡的问题,提出了一个广义的损失函数Focal Tversky Loss(FTL),在训练较小结构可以更好地权衡准确率与召回率之间的关系。
3、针对增加数据流路径的改进方法:
一是采用 DenseNet 的思想,增加网络中不同模块之间的连接;二是将U-Net 网络串行使用两次(桥连接)从而达到信息成倍数流通的目的。
4、基于自动搜索最优网络结构的改进方法:
解决三维图像分割中大量手动调参和网络体系结构优化的问题,在每一层加入一个新的块结构Mg-Blk,其中的可学习块block的学习训练将一个块结构表示成一个有向无环图,通过学习节点数以及扩张率来训练整个网络的准确性.
5、基于瓶颈(bottleneck)的改进方法
瓶颈:U 型网络收缩路径和扩张路径中间的部分,主要接受了所有来自编码器提取的特征信息,并将分割好的的图像通过解码器恢复到原有分辨率。
多采用 attention机制,将通道注意力和空间注意力相结合,以更好地分割。
U-Net 结构改进中常用结构模块
1、残差结构
如果简单地增加网络的层数,就会面对梯度消失或是梯度爆炸的问题,将每两层网络中增加一个跳连,以保证增加层数后不会削弱网络的表达性能。
2、Attention模块
强化特征,在医学影像里常用于分割细节较多的血管、肺叶等
3、SE模块
通道的压缩和激励,通过找到特征较好的通道,强调这一通道,压缩不相关的通道,以减少参数,强化分割精度.
4、DenseNet模块
将每一层的网络复制到下一层的全连接结构,增强数据流动的同时减少计算量。
5、Inception模块
由于在医学影像中,病灶所占区域在不同的图像中变化极大,因而卷积核的选择非常重要.Inception将扩张率不同、大小不同的卷积都囊括在内,通过不同尺度提取特征,从而达到精确提取特征的目的。
6、CycleGAN模块
生成对抗性网络(GAN)将图像从一个领域转换成另外一领域,通过将图像先经过 CycleGAN再进行训练,从而达到更好的训练效果。
代码部分
Pycharm、Anaconda和pipe的关系:
Pycharm提供编译环境和调试工作、Anaconda和pipe都是负责处理图像的方法,区别是:Anaconda(像超市一样)规范、pipe(像菜市场一样)不太规范。
虚拟环境:让不同的程序在同一台电脑上运行,建立虚拟环境的方式来适配不同的程序需求。相当于简化虚拟机
数据处理:
自己标注数据集步骤:
1.安装LabelMe
2.标注物体的轮廓
3.得到jason文件
4.labelme2seg.py可以将jason文件转换成所需的标签文件
数据集分成:测试和训练两个部分,文件又分成原始的图片和标签。
标签中是全黑的图片,原因为:语义分割对于皮肤病而言有两个类别,有皮肤病的区域为1,没有的区域位0,在标签文件中的值是不同的。若用自己的数据集时,要保证名称不要改变,变图片和标签就可以了。
数据集:
标签一定为黑白分明的二值图像,前景区域为白色,背景区域为黑色,医学分割主要做二分类问题。
result目录主要用来放置模型预测的结果。
原始图片为jpg格式,标签文件为png格式,因为标签文件和测试集的命名图片名称是一一对应的
模型训练(train.py):
更换56行数据集地址(注意windows下要使用反斜杠/),控制轮数epachs
把loss最下的模型存在当前的目录下,是一个best_model.pth文件(模型文件)
组成部分:数据集加载、定义优化器、损失函数。
模型主文件在model下:unet_model.py和unet_parts.py定义了unet网络结构
代码详解:
image目录下:存放UI界面上的图片和中间处理的结果的图片
model目录下: 定义unet模型
results目录下:存放测试的结果,包括模型测试的mloU(mIoU 为语义分割的标准度量,在每个类上计算 IoU 之后进行平均)、mPA以及精度和召回的结果
utils目录下:工具类
主目录下的文件:test.py主要做模型测试使用;train.py主要用来训练模型使用,修改为自己的数据集时,只需要修改data_path目录即可;ui.py主要是主界面程序,启动界面上传图片来做检测,在tmp目录下可以找到相应图片,以results结尾为实际结果