【深度学习】Unet的基础介绍
U-Net是一种用于图像分割的深度学习模型,特别适合医学影像和其他需要分割细节的任务。如图:
Unet论文原文
为什么叫U-Net?
U-Net的结构像字母“U”,所以得名。它的结构由两个主要部分组成:
下采样(编码器):图像逐渐被缩小并且提取特征。
上采样(解码器):逐渐恢复图像的尺寸,并通过“跳跃连接”将高分辨率的特征与低分辨率的特征结合,以保持细节。
网络结构
U-Net通常包括以下几部分:
(1)下采样(编码器):
这一部分通过卷积操作逐步降低图像的分辨率,同时提取越来越抽象的特征。每个卷积层后面跟着一个池化层(比如最大池化),池化层会减少图像的尺寸,帮助网络捕捉全局信息。
(2)瓶颈层:
当图像经过几次下采样后,网络会到达最小尺寸的图像,这一部分的特征信息会被压缩成最具代表性的特征。
(3)上采样(解码器):
上采样过程会将图像逐渐恢复到原始大小,通过转置卷积(反卷积)或者插值操作来扩大图像的尺寸。
(4)跳跃连接:
这里的“跳跃连接”是U-Net的一大特点。在上采样阶段,网络会将下采样阶段的特征图直接传递到解码器中,这样可以帮助网络更好地恢复图像的细节,防止图像中的细微特征丢失。
Unet的特点
- UNet也是一个编解码模型,它将各级分辨率的卷积特征图和反卷积特征图进行了融合。
- Unet输入和输出大小是同样的维度。
- 如图
网络的右侧虚线框部分叫作扩展路径(expansive path)。
它同样由4个网络块组成,每个网络块开始之前通过反卷积将特征图的尺寸乘2,同时将其通道数减半(最后一层略有不同),然后和左侧对称的压缩路径的特征图合并。由于左侧压缩路径和右侧扩展路径的特征图的尺寸不一样,U-Net是通过将压缩路径的特征图裁剪到和扩展路径的特征图相同尺寸进行归一化的。
扩展路径的卷积操作依旧使用的是有效卷积操作,最终得到的特征图的尺寸是388×388。由于该任务是一个二分类任务,因此网络有两个输出特征图。
在U-Net的网络结构中通过裁剪的方式将左侧的特征图调整到和右侧特征图相同的大小(图左侧部分中的虚线部分)
U-Net论文中没有全连接层(Linear层),且全程使用valid来进行卷积,这样可以保证分割的结果都是基于没有缺失的上下文特征得到的,因此输入输出的图像尺寸不一样。
需要注意的是,论文中的输入图像的尺寸为 572 像素×572 像素,而输出图像的尺寸是388 像素×388像素大小,输入与输出并不一致;整个网络在很多情况下,输出比输入宽高减少了 2,这主要是因为卷积层采用了“valid”的边缘填充(padding)方式,其中 stride=1,因此,输出的特征图会逐渐减小。
评价指标
Dice Loss是由Dice系数而得名的,Dice系数是一种用于评估两个样本相似性的度量函数,其值越大意味着这两个样本越相似,Dice系数的数学表达式如下:
式中,X表示真实分割图像的像素标签,Y表示模型预测分割图像的像素类别,|X∩Y|为预测图像的像素与真实标签图像的像素之间的点乘,并将点乘结果相加,|X|和|Y|分别为它们各自对应图像中的像素相加。
代码举例
class UNet(nn.Module):
def __init__(self, in_channels, num_classes):
super(UNet, self).__init__()
self.inc = InConv(in_channels, 64)
self.down1 = downsample_block(64, 128)
self.down2 = downsample_block(128, 256)
self.down3 = downsample_block(256, 512)
self.down4 = downsample_block(512, 512)
self.up1 = upsample_block(1024, 256)
self.up2 = upsample_block(512, 128)
self.up3 = upsample_block(256, 64)
self.up4 = upsample_block(128, 64)
self.outc = OutConv(64, num_classes)
def forward(self, x):
x1 = self.inc(x)
x2 = self.down1(x1)
x3 = self.down2(x2)
x4 = self.down3(x3)
x5 = self.down4(x4)
x = self.up1(x5, x4)
x = self.up2(x, x3)
x = self.up3(x, x2)
x = self.up4(x, x1)
x = self.outc(x)
return x
in_channels 是输入图像的通道数,num_classes 是输出类别数(通常为1)
U-Net的前向传播过程
编码器路径:
输入图像首先通过 InConv 模块,生成64通道的特征图 x1。
然后依次通过四个下采样模块 down1、down2、down3、down4,分别生成128、256、512、512通道的特征图 x2、x3、x4、x5。
解码器路径:
解码器路径从 x5 开始,通过 up1 模块与 x4 进行拼接,生成256通道的特征图。
然后依次通过 up2、up3、up4 模块,分别与 x3、x2、x1 进行拼接,生成128、64、64通道的特征图。
最后通过 OutConv 模块生成最终的分割结果。
其中,函数定义如下: