【深度学习】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 模块生成最终的分割结果。

其中,函数定义如下:




相关推荐
星融元asterfusion1 分钟前
基于路径质量的AI负载均衡异常路径检测与恢复策略
人工智能·负载均衡·异常路径
zskj_zhyl6 分钟前
智慧养老丨从依赖式养老到自主式养老:如何重构晚年生活新范式
大数据·人工智能·物联网
创小匠8 分钟前
创客匠人视角下创始人 IP 打造与知识变现的底层逻辑重构
人工智能·tcp/ip·重构
xiangduanjava24 分钟前
关于安装Ollama大语言模型本地部署工具
人工智能·语言模型·自然语言处理
zzywxc78744 分钟前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
超龄超能程序猿1 小时前
(1)机器学习小白入门 YOLOv:从概念到实践
人工智能·机器学习
大熊背1 小时前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
江理不变情1 小时前
图像质量对比感悟
c++·人工智能
张较瘦_3 小时前
[论文阅读] 人工智能 + 软件工程 | 需求获取访谈中LLM生成跟进问题研究:来龙去脉与创新突破
论文阅读·人工智能