【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解

【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解

提示:最近开始在【医学图像分割】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。



前言

UNet是由德国弗赖堡大学的Olaf Ronneberger等人在《U-Net: Convolutional Networks for Biomedical Image Segmentation【MICCAI-2015】》【论文地址】一文中提出的U型编码和解码模型,即一个用于捕获上下文的收缩路径(编码器,下采样)和一个支持精确定位的对称扩展路径(解码器,上采样),并通过跳跃连接操作更好的融合浅层的位置信息和深层的语义信息。
在详细解析UNet网络之前,首要任务是搭建UNet【Pytorch-demo地址】所需的运行环境,并完成模型训练和测试工作,展开后续工作才有意义。
数据预处理模块解析


UNet模型运行环境搭建

在win10环境下装anaconda环境,方便搭建专用于UNet模型的虚拟环境。

  • 查看主机支持的cuda版本(最高)

    # 打开cmd,执行下面的指令查看CUDA版本号
    nvidia-smi
    

  • 安装GPU版本的torch【官网
    博主的cuda版本是12.2,但这里cuda版本最高也是12.1,博主选的11.8也没问题。
    其他cuda版本的torch在【以前版本】找对应的安装命令。

  • 博主安装环境参考

    # 创建虚拟环境
    conda create -n UNet python=3.9
    # 查看新环境是否安装成功
    conda env list
    # 激活环境
    activate UNet
    # 分别安装pytorch和torchvision
    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    # 查看所有安装的包
    pip list
    conda list
    


UNet模型运行

数据集与模型权重下载

名称下载地址说明
DRIVE数据集官网】【百度网盘:8no8】用于眼科图像处理研究的公共数据集,用于血管分割任务
模型权重百度网盘: p50a使用U-Net在DRIVE数据集上训练得到的权重,仅供测试使用

将下载好的训练集解压并拷贝到当前工程目录下(建议)

将下载好的预训练权重(训练好的)best_model.pth拷贝到save_weights目录下(建议)。

UNet训练与测试

  1. 训练:可以直接运行train.py,也可以根据硬件条件修改代码中部分训练参数epochs和batch-size修改训练次数和训练的batchsize等,详细的代码内容将在后续博文中介绍。

    正在训练,训练权重保存在save_weights目录下:

  2. 测试:可以直接运行predict.py,也可以根据任务需求修改代码中部分变量img_path和roi_mask_path等,选择测试的图片。

    对于DRIVE数据集img_path和roi_mask_path必须同时给定且一一对应,其他数据集以及个人数据集的训练和测试,博主会在后续的内容中给出修改后的代码。

    测试结果保存为当前工程目录下的test_result.png,可以对比查看效果:


总结

尽可能简单、详细的介绍了UNet的安装流程以及UNet的使用方法。后续会根据自己学到的知识结合个人理解讲解UNet的原理和代码。

UNet是一种流行的卷积神经网络结构,专用于图像分割任务。在PyTorch实现UNet需要导入必要的库,构建编码器解码器结构,并训练模型。下面是一个简化的UNet代码示例: ```python import torch import torch.nn as nn from torch.utils.data import DataLoader from torchvision.datasets import ImageFolder from torchvision.transforms import ToTensor # 定义UNet的基本模块 class UNetBlock(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1, dropout_rate=0.5): super(UNetBlock, self).__init__() self.encoder = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding), nn.BatchNorm2d(out_channels), nn.ReLU(), nn.Dropout(dropout_rate) ) self.decoder = nn.Sequential( nn.ConvTranspose2d(out_channels, in_channels // 2, kernel_size, stride, padding), nn.BatchNorm2d(in_channels // 2), nn.ReLU(), nn.Dropout(dropout_rate) ) def forward(self, x): x1 = self.encoder(x) return self.decoder(x1) # 全局定义UNet class UNet(nn.Module): def __init__(self, num_classes): super(UNet, self).__init__() self.down1 = UNetBlock(3, 64) # 输入通道数为3 (RGB), 输出通道数为64 self.pool1 = nn.MaxPool2d(2, 2) self.down2 = UNetBlock(64, 128) self.pool2 = nn.MaxPool2d(2, 2) self.down3 = UNetBlock(128, 256) self.pool3 = nn.MaxPool2d(2, 2) self.center = UNetBlock(256, 512) self.up3 = UNetBlock(512 + 256, 256) self.up2 = UNetBlock(256 + 128, 128) self.up1 = UNetBlock(128 + 64, 64) self.outconv = nn.Conv2d(64, num_classes, 1) def forward(self, x): x1 = self.down1(x) x2 = self.pool1(x1) x3 = self.down2(x2) x4 = self.pool2(x3) x5 = self.down3(x4) x = self.pool3(x5) x = self.center(x) x = torch.cat((x5, x), dim=1) x = self.up3(x) x = torch.cat((x4, x), dim=1) x = self.up2(x) x = torch.cat((x3, x), dim=1) x = self.up1(x) x = self.outconv(x) return x # 示例用法 num_classes = 2 # 二分类问题,比如前景和背景 model = UNet(num_classes) # 加载数据、设置优化器、损失函数等并开始训练... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值