U-Net 是医学图像分割等领域的经典网络,其核心结构由卷积、池化、上采样、特征裁剪拼接等操作组成。本文结合 U-Net 的结构,梳理其关键操作对应的 MindSpore API,并给出在 U-Net 中的实际使用方法。

一、U-Net 核心操作与 MindSpore API 对应关系

U-Net 的结构(如图)包含 5 类核心操作,对应 MindSpore 的 API 如下:

U-Net 操作 MindSpore API 接口 功能说明
Conv 3×3 + ReLU mindspore.nn.Conv2d + nn.ReLU 提取局部特征并引入非线性
Copy and Crop Tensor 索引(自定义裁剪) 匹配编码器与解码器特征图尺寸
Max Pool 2×2 mindspore.nn.MaxPool2d 下采样,扩大感受野
Up-conv 2×2 mindspore.nn.Conv2dTranspose 上采样,恢复特征图尺寸
Conv 1×1 mindspore.nn.Conv2d(kernel=1) 映射特征通道到分割类别数

二、U-Net 中 MindSpore API 的具体使用

1. Conv 3×3 + ReLU:特征提取

U-Net 的编码器、解码器中均通过 “3×3 卷积 + ReLU” 提取特征,MindSpore 中用SequentialCell组合这两个操作:

python

运行

import mindspore.nn as nn

# 示例:输入通道64 → 输出通道64的3×3卷积+ReLU
conv_block = nn.SequentialCell(
    nn.Conv2d(
        in_channels=64, 
        out_channels=64, 
        kernel_size=3, 
        padding=1  # 保持特征图尺寸不变
    ),
    nn.ReLU()
)

在 U-Net 中的作用:编码器每一层通过该模块对特征图进行 2 次卷积 + 激活,逐步提取高层特征;解码器中则用于融合 “上采样特征 + 裁剪后的编码器特征”。

2. Copy and Crop:特征图尺寸匹配

U-Net 的 “跳跃连接” 需要将编码器的特征图裁剪后,与解码器上采样后的特征图拼接。通过 Tensor 的索引实现中心裁剪:

python

运行

def crop_encoder_feat(encoder_feat, decoder_feat):
    # 获取编码器、解码器特征图的高/宽
    _, _, h_enc, w_enc = encoder_feat.shape
    _, _, h_dec, w_dec = decoder_feat.shape
    # 计算裁剪的起始位置(中心裁剪)
    crop_h = (h_enc - h_dec) // 2
    crop_w = (w_enc - w_dec) // 2
    # 裁剪编码器特征图
    return encoder_feat[:, :, crop_h:crop_h+h_dec, crop_w:crop_w+w_dec]

在 U-Net 中的作用:例如编码器某层输出尺寸为28×28,解码器上采样后尺寸为14×14,通过裁剪将编码器特征图缩放到14×14,再与解码器特征图拼接。

3. Max Pool 2×2:下采样

编码器中通过 2×2 最大池化实现下采样,将特征图尺寸减半:

python

运行

max_pool = nn.MaxPool2d(
    kernel_size=2, 
    stride=2  # 步长=核尺寸,实现尺寸减半
)

在 U-Net 中的作用:每经过一次池化,特征图尺寸缩小为原来的 1/2,通道数翻倍,同时扩大感受野。

4. Up-conv 2×2:上采样

解码器中通过转置卷积实现上采样,将特征图尺寸翻倍:

python

运行

up_conv = nn.Conv2dTranspose(
    in_channels=512, 
    out_channels=256, 
    kernel_size=2, 
    stride=2  # 步长=核尺寸,实现尺寸翻倍
)

在 U-Net 中的作用:解码器每一层通过转置卷积将特征图尺寸扩大为原来的 2 倍,通道数减半,为后续与编码器特征图拼接做准备。

5. Conv 1×1:输出分割图

U-Net 的最后一层通过 1×1 卷积,将多通道特征图映射为分割类别对应的通道数(如二分类输出 1 通道):

python

运行

output_conv = nn.Conv2d(
    in_channels=64, 
    out_channels=2,  # 假设为2分类任务
    kernel_size=1  # 1×1卷积不改变特征图尺寸
)

在 U-Net 中的作用:将解码器最后一层的 64 通道特征,转换为对应类别的分割概率图。

三、总结

通过 MindSpore 的上述 API,可以快速实现 U-Net 的核心结构:编码器通过 “Conv3×3+ReLU+MaxPool” 提取特征,解码器通过 “Up-conv + 特征裁剪拼接 + Conv3×3+ReLU” 恢复细节,最后通过 Conv1×1 输出分割结果。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐