UNet复现及环境配置(含数据集)

0. 本文内容

  1. Github 上U-Net原数据集跑通
  2. 环境配置(pytorch[cpu,gpu])
  3. 自己数据集复现
  4. 其他

1. 原数据集跑通

github地址
下载程序。下载下来不包含数据集
从其他博主捞到的含数据集的,提取码:oi6e ,包含一个汽车数据集和细胞数据集。程序是GitHub下载下来的程序。

运行直接运行train.py文件即可。

2. 环境配置

anaconda,pytorch-gpu版本。

  1. 安装anaconda,创建环境。
    在这里插入图片描述

  2. 打开prompt,激活环境。
    在这里插入图片描述activate unet1
    在这里插入图片描述

  3. 配置pytorch
    在这里插入图片描述--------按照红色区域选择,复制红色框的内容到prompt运行。(其中第一行是torch版本,第三行是安装方式,conda安装比较方便。最后一行是选择要配置的CUDN的版本)
    --------等待下载完毕。如果运行超时,给conda换个下载路径,静静等待安装完毕。
    --------测试是否安装成功:import torch(尝试调用这个库)

  4. 安装其他需要的库

#比较快的方式
pip install --user 库名  -i https://pypi.tuna.tsinghua.edu.cn/simple

3. 自己数据集复现

分享的文件里包含了两个数据集,一个是car,可以直接运行的,一个是细胞的,从博主淘来的。
眼球毛细血管数据集
自己下载到本地,在程序里改调用地址就可以。

更改数据集需要修改的参数:

  1. 调用地址(改成自己的)
    在这里插入图片描述

  2. 图片格式
    查看imgs与masks的图片格式,修改对应的后缀。
    在这里插入图片描述

  3. 修改读取mask的名称格式。
    在这里插入图片描述
    masks的图片前半部分和imgs的一致,多出来的字符串添加到引号内,完全一致就为空。

不出问题的话到此可以正常运行自己的数据集了。

如果需要自己制作数据集,有labelme这个软件,自己搜教程。

4. 其他

程序开始的时候会显示使用的是cpu还是cuda
在这里插入图片描述

### 如何实现UNet模型 #### 使用PyTorch实现UNet模型 在PyTorch中构建UNet模型涉及定义编码器(收缩路径)和解码器(扩展路径),以及跳过连接来保留空间信息。下面是一个简单的UNet架构实现: ```python 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, mid_channels=None): super().__init__() if not mid_channels: mid_channels = out_channels self.double_conv = nn.Sequential( nn.Conv2d(in_channels, mid_channels, kernel_size=3, padding=1), nn.BatchNorm2d(mid_channels), nn.ReLU(inplace=True), nn.Conv2d(mid_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def forward(self, x): return self.double_conv(x) class Down(nn.Module): """Downscaling with maxpool then double conv""" def __init__(self, in_channels, out_channels): super().__init__() self.maxpool_conv = nn.Sequential( nn.MaxPool2d(2), DoubleConv(in_channels, out_channels) ) def forward(self, x): return self.maxpool_conv(x) class Up(nn.Module): """Upscaling then double conv""" def __init__(self, in_channels, out_channels, bilinear=True): super().__init__() # if bilinear, use the normal convolutions to reduce the number of channels if bilinear: self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True) self.conv = DoubleConv(in_channels, out_channels, in_channels // 2) else: self.up = nn.ConvTranspose2d(in_channels , in_channels // 2, kernel_size=2, stride=2) self.conv = DoubleConv(in_channels, out_channels) def forward(self, x1, x2): x1 = self.up(x1) # input is CHW diffY = x2.size()[2] - x1.size()[2] diffX = x2.size()[3] - x1.size()[3] x1 = F.pad(x1, [diffX // 2, diffX - diffX // 2, diffY // 2, diffY - diffY // 2]) # if you have padding issues, see # https://github.com/HaiyongJiang/U-Net-Pytorch-Unstructured-Buggy/commit/0e854509c2cea854e247a9c615f175f76fbb2e3a # https://github.com/xiaopeng-liao/Pytorch-UNet/commit/8ebac70e633bac59fc22bb5195e513d5832fb3bd x = torch.cat([x2, x1], dim=1) return self.conv(x) class OutConv(nn.Module): def __init__(self, in_channels, out_channels): super(OutConv, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=1) def forward(self, x): return self.conv(x) class UNet(nn.Module): def __init__(self, n_channels, n_classes, bilinear=False): 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 = Down(64, 128) self.down2 = Down(128, 256) self.down3 = Down(256, 512) factor = 2 if bilinear else 1 self.down4 = Down(512, 1024 // factor) self.up1 = Up(1024, 512 // factor, bilinear) self.up2 = Up(512, 256 // factor, bilinear) self.up3 = Up(256, 128 // factor, bilinear) self.up4 = Up(128, 64, bilinear) self.outc = OutConv(64, n_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) logits = self.outc(x) return logits ``` 此代码展示了如何创建一个基本的UNet网络结构,适用于二分类或多类语义分割任务。 对于TensorFlow中的UNet实现,虽然具体API有所不同,但整体思路相同:通过卷积层逐步缩小特征图尺寸,在下采样过程中捕获上下文信息;随后再利用反卷积操作恢复原始输入大小的同时融合来自早期阶段的信息[^1]。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生花~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值