【PyTorch 实战2:UNet 分割模型】10min揭秘 UNet 分割网络如何工作以及pytorch代码实现(详细代码实现)

这篇具有很好参考价值的文章主要介绍了【PyTorch 实战2:UNet 分割模型】10min揭秘 UNet 分割网络如何工作以及pytorch代码实现(详细代码实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

UNet网络详解及PyTorch实现

一、UNet网络原理

  U-Net,自2015年诞生以来,便以其卓越的性能在生物医学图像分割领域崭露头角。作为FCN的一种变体,U-Net凭借其Encoder-Decoder的精巧结构,不仅在医学图像分析中大放异彩,更在卫星图像分割、工业瑕疵检测等多个领域展现出强大的应用能力。UNet是一种常用于图像分割的卷积神经网络架构,其特点在于其U型结构,包括一个收缩路径(下采样)和一个扩展路径(上采样)。这种结构使得UNet能够在捕获上下文信息的同时,也能精确地定位到目标边界。

  • 收缩路径(编码器Encoder):通过连续的卷积和池化操作,逐步减小特征图的尺寸,从而捕获到图像的上下文信息。

  • 扩展路径(解码器Decoder):通过上采样操作逐步恢复特征图的尺寸,并与收缩路径中对应尺度的特征图进行拼接(concatenate),以融合不同尺度的特征信息。

  • 跳跃连接:UNet中的跳跃连接使得扩展路径能够利用到收缩路径中的高分辨率特征,从而提高了分割的精度。

  • 输出层:UNet的输出层通常是一个1x1的卷积层,用于将特征图转换为与输入图像相同尺寸的分割图。

unet基础实验 pytorch,pytorch,网络,图像处理,计算机视觉

二、基于PyTorch的UNet实现

  下面是一个简单的基于PyTorch的UNet实现,用于图像分割任务。(环境安装可以看我往期博客)

import torch  
import torch.nn as nn  
import torch.nn.functional as F  
  
class DoubleConv(nn.Module):  
    """(convolution => [BN] => ReLU) * 2"""  
  
    def __init__(self, in_channels, out_channels):  
        super(DoubleConv, self).__init__()  
        self.conv = 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 forward(self, x):  
        return self.conv(x)  
  
  
class UNet(nn.Module):  
    def __init__(self, n_channels, n_classes, bilinear=True):  
        super(UNet, self).__init__()  
  
        self.n_channels = n_channels  
        self.n_classes = n_classes  
        self.bilinear = bilinear  
  
        self.inc = DoubleConv(n_channels, 64)  
        self.down1 = DoubleConv(64, 128)  
        self.down2 = DoubleConv(128, 256)  
        self.down3 = DoubleConv(256, 512)  
        factor = 2 if bilinear else 1  
        self.down4 = DoubleConv(512, 1024 // factor)  
        self.up1 = nn.ConvTranspose2d(1024 // factor, 512 // factor, kernel_size=2, stride=2)  
        self.up2 = nn.ConvTranspose2d(512 // factor, 256 // factor, kernel_size=2, stride=2)  
        self.up3 = nn.ConvTranspose2d(256 // factor, 128 // factor, kernel_size=2, stride=2)  
        self.up4 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2)  
        self.outc = nn.Conv2d(64, n_classes, kernel_size=1)  
  
    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)  
        logits = self.outc(x)  
        return logits

三、训练与推理的完整代码

  首先,我们需要准备数据集、定义损失函数和优化器,然后编写训练循环。

python
import torch  
import torch.nn as nn  
import torch.optim as optim  
from torch.utils.data import DataLoader  
from torchvision import transforms, datasets  
from unet_model import UNet  # 假设UNet定义在unet_model.py文件中  
  
# 设定超参数  
num_epochs = 10  
learning_rate = 0.001  
batch_size = 4  
  
# 数据预处理  
transform = transforms.Compose([  
    transforms.Resize((256, 256)),  
    transforms.ToTensor(),  
    transforms.Normalize(mean=[0.5], std=[0.5])  
])  
  
# 加载训练集  
train_dataset = datasets.ImageFolder(root='path_to_train_dataset', transform=transform)  
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)  
  
# 定义模型、损失函数和优化器  
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')  
num_classes = len(train_dataset.classes)  # 根据数据集确定类别数  
model = UNet(n_channels=3, n_classes=num_classes).to(device)  
criterion = nn.CrossEntropyLoss()  
optimizer = optim.Adam(model.parameters(), lr=learning_rate)  
  
# 训练循环  
for epoch in range(num_epochs):  
    model.train()  # 设置模型为训练模式  
    running_loss = 0.0  
    for i, data in enumerate(train_loader):  
        inputs, labels = data[0].to(device), data[1].to(device)  
          
        optimizer.zero_grad()  # 梯度清零  
        outputs = model(inputs)  # 前向传播  
        loss = criterion(outputs, labels)  # 计算损失  
        loss.backward()  # 反向传播  
        optimizer.step()  # 更新权重  
          
        running_loss += loss.item() * inputs.size(0)  
      
    epoch_loss = running_loss / len(train_loader.dataset)  
    print(f'Epoch {epoch+1}/{num_epochs}, Loss: {epoch_loss:.4f}')  
  
# 保存模型  
torch.save(model.state_dict(), 'unet_model.pth')
推理

在推理阶段,我们加载已训练好的模型,并对测试集或单个图像进行预测。

python
# 加载模型  
model.load_state_dict(torch.load('unet_model.pth'))  
model.eval()  # 设置模型为评估模式  
  
# 如果需要,准备测试集  
test_dataset = datasets.ImageFolder(root='path_to_test_dataset', transform=transform)  
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)  
  
# 对测试集进行推理  
with torch.no_grad():  
    for inputs, _ in test_loader:  
        inputs = inputs.to(device)  
        outputs = model(inputs)  
        _, predicted = torch.max(outputs, 1)  
        # 可以将predicted保存为文件或进行其他处理  
  
# 对单个图像进行推理  
image_path = 'path_to_single_image.png'  
image = Image.open(image_path).convert('RGB')  # 确保是RGB格式  
image = transform(image).unsqueeze(0).to(device)  # 对图像进行预处理并添加到batch维度  
  
with torch.no_grad():  
    prediction = model(image)  
    _, predicted = torch.max(prediction, 1)  
    predicted_class = train_dataset.classes[predicted.item()]  # 获取预测的类别名  
    # 可以将predicted保存为文件或进行可视化
这里我假设你已经有了适当的训练和测试数据集,并且它们已经被组织成了ImageFolder可以理解的格式(即每个类别的图像都在一个单独的子文件夹中)。此外,代码中的transform可能需要根据你的具体数据集进行调整。

  在推理阶段,我们使用torch.max来找出每个图像最有可能的类别,并通过predicted_class变量打印或返回该类别。对于测试集,你可能希望将预测结果保存为文件,以便后续分析或可视化。对于单个图像,你可以直接进行可视化或将其保存为带有分割结果的图像。

四、总结

  我们详细介绍了如何使用PyTorch实现并训练一个U-Net模型,以及如何在训练和推理阶段使用它。首先,我们定义了一个U-Net模型的结构,该结构通过下采样路径捕获上下文信息,并通过上采样路径精确定位目标区域。然后,我们准备了训练和测试数据集,并应用了适当的数据预处理步骤。

  在训练阶段,我们设置了模型、损失函数和优化器,并编写了一个循环来迭代训练数据集。在每个迭代中,我们执行前向传播来计算模型的输出,计算损失,执行反向传播来更新模型的权重,并打印每个epoch的平均损失以监控训练过程。训练完成后,我们保存了模型的权重。在推理阶段,我们加载了已训练的模型,并将其设置为评估模式以关闭诸如dropout或batch normalization等训练特定的层。然后,我们对测试数据集或单个图像进行推理,使用模型生成预测,并通过torch.max找到最有可能的类别。对于测试集,你可能希望保存预测结果以便后续分析;对于单个图像,你可以直接进行可视化或将其保存为带有分割结果的图像。

  通过本博客,你应该能够了解如何使用PyTorch实现和训练一个U-Net模型,并能够将其应用于图像分割任务。当然,实际应用中可能还需要考虑更多的细节和优化,如更复杂的数据增强、学习率调整策略、模型的正则化等。文章来源地址https://www.toymoban.com/news/detail-860483.html

到了这里,关于【PyTorch 实战2:UNet 分割模型】10min揭秘 UNet 分割网络如何工作以及pytorch代码实现(详细代码实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Bubbliiiing视频记录】Pytorch 搭建自己的Unet语义分割平台

    b站 地址 语义分割:对图像每个像素点进行分类 常见神经网络处理过程:Encoder提取特征,接着Docoder恢复成原图大小的图片 分为三个部分 主干特征提取部分: 卷积和最大池化的堆叠 获得五个初步有效特征层 加强特征提取部分: 五个初步有效特征层进行上采样 + 特征融合

    2024年02月12日
    浏览(41)
  • 图像分割UNet (1) : 网络结构讲解

    UNet 论文:Convolutional Networks for Biomedical Image Segmentation 这篇论文主要是针对生物医学影像这个领域提出的,所以一提到UNet一般都会联想到医学影像。 UNet它是一个encoder - decoder的结构,那么encoder对应就是这个u型网络左边这半部分,也就是我们特征提取及下采样这部分。decode

    2024年02月07日
    浏览(74)
  • 深度学习分割任务——Unet++分割网络代码详细解读(文末附带作者所用code)

    ​ 分成语义分割和实例分割 语义分割:语义分割就是把每个像素都打上标签(这个像素点是人,树,背景等)(语义分割只区分类别,不区分类别中具体单位)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 实例分割:实例分割不光要区别类别,还

    2024年02月04日
    浏览(47)
  • UNet深度学习模型在医学图像分割中的应用及其Python实现细节

    第一部分:引言和UNet架构简介 引言 : 医学图像分割是医疗图像处理的重要领域,它涉及将图像划分为多个区域,以标识和隔离感兴趣的区域(如器官、肿瘤等)。近年来,随着深度学习技术的发展,多种神经网络模型被应用于这一领域。其中,UNet模型因其出色的表现而受

    2024年02月12日
    浏览(47)
  • 计算机视觉智能中医(三):基于Unet模型的舌头舌体图片分割

    返回至系列文章导航博客 完整项目下载:下载链接 【闲鱼】https://m.tb.cn/h.52C8psW?tk=fMpwdwfqjz3 CZ3457 「我在闲鱼发布了【舌象数据集,详情见csdn!http://t.csdn.cn】」 点击链接直接打开 舌体分割是舌诊检测的基础,唯有做到准确分割舌体才能保证后续训练以及预测的准确性。此部

    2024年02月11日
    浏览(42)
  • 论文阅读—2023.7.13:遥感图像语义分割空间全局上下文信息网络(主要为unet网络以及改unet)附加个人理解与代码解析

    前期看的文章大部分都是深度学习原理含量多一点,一直在纠结怎么改模型,论文看的很吃力,看一篇忘一篇,总感觉摸不到方向。想到自己是遥感专业,所以还是回归遥感影像去谈深度学习,回归问题,再想着用什么方法解决问题。 1、易丢失空间信息 在 Decoder 阶段输出多

    2024年02月16日
    浏览(46)
  • 【Pytorch深度学习实战】(10)生成对抗网络(GAN)

     🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】 ​  🖍foreword ✔说

    2023年04月08日
    浏览(55)
  • 人工智能(pytorch)搭建模型10-pytorch搭建脉冲神经网络(SNN)实现及应用

    大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型10-pytorch搭建脉冲神经网络(SNN)实现及应用,脉冲神经网络(SNN)是一种基于生物神经系统的神经网络模型,它通过模拟神经元之间的电信号传递来实现信息处理。与传统的人工神经网络(ANN)不同,SNN 中的

    2024年02月08日
    浏览(50)
  • PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

    目录 前言 一、卷积神经网络概述 二、卷积神经网络特点 卷积运算 单通道,二维卷积运算示例 单通道,二维,带偏置的卷积示例 带填充的单通道,二维卷积运算示例 Valid卷积 Same卷积 多通道卷积计算 1.局部感知域 2.参数共享 3.池化层 4.层次化提取  三、卷积网络组成结构

    2024年02月07日
    浏览(57)
  • PyTorch深度学习实战(1)——神经网络与模型训练过程详解

    人工神经网络 ( Artificial Neural Network , ANN ) 是一种监督学习算法,其灵感来自人类大脑的运作方式。类似于人脑中神经元连接和激活的方式,神经网络接受输入,通过某些函数在网络中进行传递,导致某些后续神经元被激活,从而产生输出。函数越复杂,网络对于输入的数据拟

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包