【深度学习】Unet的基础介绍

U-Net是一种用于图像分割 的深度学习模型,特别适合医学影像和其他需要分割细节的任务。如图:

Unet论文原文

为什么叫U-Net?

U-Net的结构像字母"U",所以得名。它的结构由两个主要部分组成:

下采样(编码器):图像逐渐被缩小并且提取特征。

上采样(解码器):逐渐恢复图像的尺寸,并通过"跳跃连接"将高分辨率的特征与低分辨率的特征结合,以保持细节。

网络结构

U-Net通常包括以下几部分:

(1)下采样(编码器):

这一部分通过卷积操作 逐步降低图像的分辨率,同时提取越来越抽象的特征。每个卷积层后面跟着一个池化层 (比如最大池化),池化层会减少图像的尺寸,帮助网络捕捉全局信息。

(2)瓶颈层:

当图像经过几次下采样后,网络会到达最小尺寸的图像,这一部分的特征信息会被压缩成最具代表性的特征。

(3)上采样(解码器):

上采样过程会将图像逐渐恢复到原始大小 ,通过转置卷积(反卷积)或者插值操作来扩大图像的尺寸。

(4)跳跃连接:

这里的"跳跃连接"是U-Net的一大特点。在上采样阶段,网络会将下采样阶段的特征图直接传递到解码器中,这样可以帮助网络更好地恢复图像的细节,防止图像中的细微特征丢失。

Unet的特点

  1. UNet也是一个编解码模型,它将各级分辨率的卷积特征图和反卷积特征图进行了融合。
  2. Unet输入和输出大小是同样的维度。
  3. 如图
    网络的右侧 虚线框部分叫作扩展路径 (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|分别为它们各自对应图像中的像素相加。

代码举例

python 复制代码
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 模块生成最终的分割结果。

其中,函数定义如下:




相关推荐
wayman_he_何大民17 分钟前
初识机器学习算法 - AUM时间序列分析
前端·人工智能
什么都想学的阿超1 小时前
【大语言模型 00】导读
人工智能·语言模型·自然语言处理
lxmyzzs1 小时前
【图像算法 - 16】庖丁解牛:基于YOLO12与OpenCV的车辆部件级实例分割实战(附完整代码)
人工智能·深度学习·opencv·算法·yolo·计算机视觉·实例分割
明心知1 小时前
DAY 45 Tensorboard使用介绍
人工智能·深度学习
维维180-3121-14552 小时前
AI大模型+Meta分析:助力发表高水平SCI论文
人工智能·meta分析·医学·地学
程序员陆通2 小时前
CloudBase AI ToolKit + VSCode Copilot:打造高效智能云端开发新体验
人工智能·vscode·copilot
程高兴2 小时前
遗传算法求解冷链路径优化问题matlab代码
开发语言·人工智能·matlab
拾零吖2 小时前
吴恩达 Machine Learning(Class 1)
人工智能·机器学习
数据皮皮侠2 小时前
最新上市公司业绩说明会文本数据(2017.02-2025.08)
大数据·数据库·人工智能·笔记·物联网·小程序·区块链
智算菩萨3 小时前
【计算机视觉与深度学习实战】05计算机视觉与深度学习在蚊子检测中的应用综述与假设
人工智能·深度学习·计算机视觉