news 2026/4/18 5:07:05

<span class=“js_title_inner“>UNet图像分割</span>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<span class=“js_title_inner“>UNet图像分割</span>
什么是 UNet?

UNet 是一种用于图像分割任务的卷积神经网络(CNN)架构。该模型由Olaf Ronneberger等人于 2015 年提出,因其结构的对称性,形似字母“U”而得名,UNet 能够高效地处理各类图像分割任务。简单来说,图像分割就是将一张图像中的不同部分进行标记,这对医学诊断、自动驾驶等领域至关重要,而 UNet 的出现大大提高了这些任务的精度和效率。

UNet 的架构:编码器与解码器

UNet 的核心架构由两个主要部分组成:编码器(Contracting Path)解码器(Expanding Path),它们通过跳跃连接(Skip Connections)相连。

  1. 1.编码器:这一部分类似于传统的卷积神经网络,主要用于提取图像的特征。它通过多层卷积操作来逐步减少图像的尺寸,保留更深层次的特征信息。每一层都会进行卷积、激活(ReLU)以及最大池化(Max Pooling),从而提取重要的特征。

  2. 2.解码器:解码器部分的作用是将编码器提取的特征逐步恢复为与输入图像相同大小的分割结果。这个过程使用了上采样(Upsampling)技术,并通过跳跃连接将编码器中相应层的特征拼接到解码器中,保留了更多的细节。

  3. 3.跳跃连接:它确保了解码器在进行上采样时能够利用编码器中的特征,防止细节丢失,进一步提升分割的精度。

UNet 的优势

UNet 之所以如此受欢迎,主要得益于以下几大优势:

  • 小数据集友好:UNet 最早被设计用于医学图像分割,针对小样本数据集有很好的处理能力,这使得它在一些数据稀缺的场景中表现尤为突出。

  • 精细的分割效果:得益于跳跃连接,UNet 能够保留高分辨率的图像细节,分割结果往往更为精准。

  • 灵活性强:UNet 结构简单、可扩展性强,能够根据不同的分割任务进行调整,这使得它不仅限于医学图像,也被应用于其他图像分割任务中。

使用 PyTorch 实现 UNet

为了更直观地了解 UNet,我们可以通过代码示例,使用 PyTorch 实现一个简化版的 UNet 模型

import torch import torch.nn as nn import torch.nn.functional as F class UNet(nn.Module): def __init__(self, in_channels, out_channels): super(UNet, self).__init__() # 编码器部分(下采样路径) self.encoder1 = self.double_conv(in_channels, 64) self.encoder2 = self.double_conv(64, 128) self.encoder3 = self.double_conv(128, 256) self.encoder4 = self.double_conv(256, 512) # Bottleneck(网络最深处) self.bottleneck = self.double_conv(512, 1024) # 解码器部分(上采样路径) self.upconv4 = self.upconv(1024, 512) self.decoder4 = self.double_conv(1024, 512) # 1024 是因为有跳跃连接 self.upconv3 = self.upconv(512, 256) self.decoder3 = self.double_conv(512, 256) self.upconv2 = self.upconv(256, 128) self.decoder2 = self.double_conv(256, 128) self.upconv1 = self.upconv(128, 64) self.decoder1 = self.double_conv(128, 64) # 最终输出层 self.final_conv = nn.Conv2d(64, out_channels, kernel_size=1) def double_conv(self, in_channels, out_channels): """两次3x3卷积+批归一化+ReLU激活""" return nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def upconv(self, in_channels, out_channels): """上采样:使用2x2的转置卷积""" return nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2) def forward(self, x): # 编码器路径 enc1 = self.encoder1(x) enc2 = self.encoder2(F.max_pool2d(enc1, kernel_size=2)) enc3 = self.encoder3(F.max_pool2d(enc2, kernel_size=2)) enc4 = self.encoder4(F.max_pool2d(enc3, kernel_size=2)) # Bottleneck bottleneck = self.bottleneck(F.max_pool2d(enc4, kernel_size=2)) # 解码器路径 dec4 = self.upconv4(bottleneck) dec4 = torch.cat((dec4, enc4), dim=1) # 跳跃连接 dec4 = self.decoder4(dec4) dec3 = self.upconv3(dec4) dec3 = torch.cat((dec3, enc3), dim=1) # 跳跃连接 dec3 = self.decoder3(dec3) dec2 = self.upconv2(dec3) dec2 = torch.cat((dec2, enc2), dim=1) # 跳跃连接 dec2 = self.decoder2(dec2) dec1 = self.upconv1(dec2) dec1 = torch.cat((dec1, enc1), dim=1) # 跳跃连接 dec1 = self.decoder1(dec1) return self.final_conv(dec1) # 使用示例 model = UNet(in_channels=1, out_channels=1) input_image = torch.randn(1, 1, 512, 512) # 批大小为1,单通道,512x512图像 output = model(input_image) print(output.shape) # 应该输出 torch.Size([1, 1, 512, 512])

通过上述代码,便可轻松搭建一个简化的 UNet 模型,助力图像分割任务。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 6:09:26

造相-Z-Image 文生图引擎:写实风格摄影作品生成秘籍

造相-Z-Image 文生图引擎:写实风格摄影作品生成秘籍 1. 为什么写实摄影,终于不用“碰运气”了? 你有没有试过这样:输入“一位30岁亚洲女性,自然光下咖啡馆窗边侧脸,皮肤细腻,浅焦虚化”&#xf…

作者头像 李华
网站建设 2026/4/18 5:01:58

无需显卡!DeepSeek-R1-Distill-Qwen-1.5B本地化部署全攻略

无需显卡!DeepSeek-R1-Distill-Qwen-1.5B本地化部署全攻略 你是不是也试过在笔记本上跑大模型——刚敲下python app.py,终端就跳出一行红色报错:CUDA out of memory?或者更绝望的是,连nvidia-smi都打不开,…

作者头像 李华