Unet网络概述
Unet提出的初衷是为了解决医学图像分割的问题。Unet网络非常的简单前半部分就是特征提取后半部分是上采样。在一些文献中把这种结构叫做编码器-解码器结构由于网络的整体结构是一个大些的英文字母U所以叫做U-net。其实可以将图像->高语义feature map的过程看成编码器高语义->像素级别的分类score map的过程看作解码器
-
Encoder左半部分由两个3x3的卷积层RELU再加上一个2x2的maxpooling层组成一个下采样的模块
-
Decoder右半部分由一个上采样的卷积层反卷积层特征拼接concat两个3x3的卷积层非线性ReLU层
在当时Unet相比更早提出的FCN网络使用拼接来作为特征图的融合方式。
-
FCN是通过特征图对应像素值的相加来融合特征的
-
U-net通过通道数的拼接这样可以形成更厚的特征当然这样会更佳消耗显存
Unet与FCN网络的区别
U-Net和FCN非常的相似U-Net比FCN稍晚提出来但都发表在2015年和FCN相比U-Net的第一个特点是完全对称也就是左边和右边是很类似的而FCN的decoder相对简单。第二个区别就是skip connectionFCN用的是加操作summationU-Net用的是叠操作concatenation。这些都是细节重点是它们的结构用了一个比较经典的思路也就是编码和解码encoder-decoder)结构。其实可以将图像->高语义feature map的过程看成编码器高语义->像素级别的分类score map的过程看作解码器
此外, 由于UNet也和FCN一样, 是全卷积形式, 没有全连接层(即没有固定图的尺寸),所以容易适应很多输入尺寸大小,但并不是所有的尺寸都可以,需要根据网络结构决定
为什么Unet在医疗图像分割中表现好
-
医疗影像语义较为简单、结构固定。因此语义信息相比自动驾驶等较为单一因此并不需要去筛选过滤无用的信息。医疗影像的所有特征都很重要因此低级特征和高级语义特征都很重要所以U型结构的skip connection结构特征拼接更好派上用场
-
医学影像的数据较少获取难度大数据量可能只有几百甚至不到100因此如果使用大型的网络例如DeepLabv3+等模型很容易过拟合。大型网络的优点是更强的图像表述能力而较为简单、数量少的医学影像并没有那么多的内容需要表述因此也有人发现在小数量级中分割的SOTA模型与轻量的Unet并没有优势
-
医学影像往往是多模态的。比方说ISLES脑梗竞赛中官方提供了CBFMTTCBV等多中模态的数据这一点听不懂也无妨。因此医学影像任务中往往需要自己设计网络去提取不同的模态特征因此轻量结构简单的Unet可以有更大的操作空间。
因此大多数医疗影像语义分割任务都会首先用Unet作为baseline
模型结构
Unet模型的整体结构由两部分组成,即特征提取网络和特征融合网络,其结构也被称为“编码器-解码器结构”,并且由于网络整体结构类似于大写的英文字母“U”,故得名Unet,在其原始论文中定义的网络结构如图所示。
整个模型结构就是在原始图像输入后,首先进行特征提取,再进行特征融合:
a) 左半部分负责特征提取的网络结构(即编码器结构)需要利用两个3x3的卷积核与2x2的池化层组成一个“下采样模块”,每一个下采样模块首先会对特征图进行两次valid卷积,再进行一次池化操作。由此经过4个下采样模块后,原始尺寸为572x572大小、通道数为1的原始图像,转换为了大小为28x28、通道数为1024的特征图。
b) 右半部分负责进行上采样的网络结构(即解码器结构)需要利用1次反卷积操作、特征拼接操作以及两个3x3的卷积核作为一个“上采样模块”,每一个上采样模块首先会对特征图通过反卷积操作使图像尺寸增加1倍,再通过拼接编码器结构中的特征图使得通道数增加,最后经过两次valid卷积。由此经过4个上采样模块后,经过下采样模块的、大小为28x28、通道数为1024的特征图,转换为了大小为388x388、通道数为64的特征图。
c) 网络结构的最后一部分是通过两个1x1的卷积核将经过上采样得到的通道数为64的特征图,转换为了通道数为2的图像作为预测结果输出。
1.2 模型特点
a) 利用拼接操作将低级特征图与高级特征图进行特征融合
b) 完全对称的U型结构使得高分辨率信息和低分辨率信息在目标图片中增加,前后特征融合更为彻底。
c) 结合了下采样时的低分辨率信息(提供物体类别识别依据)和上采样时的高分辨率信息(提供精准分割定位依据),此外还通过融合操作填补底层信息以提高分割精度。
2 案例实现
2.1 环境准备与数据读取
本案例基于MindSpore-CPU版本实现,在CPU上完成模型训练。
案例实现所使用的数据即ISBI果蝇电镜图数据集,下载好的数据集包括3个tif文件,分别对应测试集样本、训练集标签、训练集样本,文件路径结构如下:
.data/
├── test-volume.tif
├── train-labels.tif
└── train-volume.tif
复制
其中每个tif文件都由30副图片压缩而成,所以接下来需要获取每个tif文件中所存储的所有图片,将其转换为png格式存储,得到训练集样本对应的30张png图片、训练集标签对应的30张png图片以及测试集样本对应的30张png图片。
具体的实现方式首先是将tif文件转换为数组形式,之后通过io操作将每张图片对应的数组存储为png图像,处理过后的训练集样本及其对应的标签图像如图2所示。将3个tif文件转换为png格式后,针对训练集的样本与标签,将其以2:1的比例,重新划分为了训练集与验证集。
2.2 数据集创建
在进行上述tif文件格式转换,以及测试集和验证集的进一步划分后,就完成了数据读取所需的所有工作,接下来就需要利用处理好的图像数据,通过一定的图像变换来进行数据增强,并完成数据集的创建。
数据增强部分是引入了mindspore.dataset.vision,针对训练集样本和标签,首先通过A.resize()方法将图像尺寸重新调整为统一大小,之后再进行转置以及水平翻转、垂直翻转,完成针对训练集样本和标签的数据增强。针对验证集的样本和标签,仅通过resize()方法将图像尺寸重新调整为统一大小。
2.3 模型训练及评估
在模型训练时,首先是设置模型训练的epoch次数为1000,再通过自定义的create_dataset方法创建了训练集和验证集,其中训练集batch_size大小为4,验证集batch_size大小为2,图像尺寸统一调整为224x224;损失函数使用nn.BCELoss,优化器使用nn.Adam,并设置学习率为0.01。回调函数方面使用了LossMonitor和TimeMonitor来监控训练过程中每个epoch结束后,损失值Loss的变化情况以及每个epoch、每个step的运行时间,还实例化了2.5节中自定义的回调类EvalCallBack,实现计算每个epoch结束后,打印5个评估指标,并保存当前最优模型。