FCN和Unet代码跑通

FCN

1拉取代码

在这里插入图片描述
我的评价是直接把仓库拉取到/content
然后把对应的文件夹fcn放到mydrive里

2拉取数据集

这是代码仓库的数据集链接
在这里插入图片描述
我们使用下面方法下载数据集

!wget -P 路径 网址

然后我们解压tar包(时间可能会很长):

!tar -xf VOCtrainval_11-May-2012.tar

解压后可以看到
在这里插入图片描述

VOCdevkit
    └── VOC2012
         ├── Annotations               所有的图像标注信息(XML文件)
         ├── ImageSets    
         │   ├── Action                人的行为动作图像信息
         │   ├── Layout                人的各个部位图像信息
         │   │
         │   ├── Main                  目标检测分类图像信息
         │   │     ├── train.txt       训练集(5717)
         │   │     ├── val.txt         验证集(5823)
         │   │     └── trainval.txt    训练集+验证集(11540)
         │   │
         │   └── Segmentation          目标分割图像信息
         │         ├── train.txt       训练集(1464)
         │         ├── val.txt         验证集(1449)
         │         └── trainval.txt    训练集+验证集(2913)
         │ 
         ├── JPEGImages                所有图像文件
         ├── SegmentationClass         语义分割png图(基于类别)
         └── SegmentationObject        实例分割png图(基于目标)


解压完成后,将train.py下数据集的路径设置为你下载的位置
在这里插入图片描述

3下载预训练权重

train.py代码里的
在这里插入图片描述

这里也给出了下载链接
在这里插入图片描述
我们继续使用wget将权重下载到和train.py同级的文件夹下
在这里插入图片描述
记得改名噢。

4 训练

!python train.py

训练一轮结果:
在这里插入图片描述
训练结果自动保存到txt
在这里插入图片描述
这里是训练完保存的pth(0代表epoch:0)
在这里插入图片描述

5预测

在predict.py里将路径改为刚才训练出来的.pth文件
在这里插入图片描述
放入一张图片当测试图片
在这里插入图片描述

看结果:请添加图片描述

在这里插入图片描述

Unet(2d)

unet是对生物医学影像领域

1拉取代码(参考fcn)

2获取数据集

b导给的百度云链接下载后,再放到google drive吧。数据集不大,不一会儿就下完了。将下载好的DRIVE文件夹放到unet文件夹下在这里插入图片描述
因为data-path默认路径为./
在这里插入图片描述

数据集(20个眼球)目录:
在这里插入图片描述

关于mask里的
在这里插入图片描述
指的是白色以外的区域不用管。
而manual(手动的)文件夹下是人工分割好的图片
在这里插入图片描述

3训练

不需要预训练权重,训练脚本和fcn的差不多。

!python train.py

训练了大概70轮, mean IoU达到80
在这里插入图片描述
训练完保存的pth:
在这里插入图片描述

4预测

在predict.py下在这里插入图片描述
预测数据直接是test里的。
预测完会生成一张图片
在这里插入图片描述

脑血管分割数据集

.mha后缀的文件打开需要3d slicer
3d slicer官网支持macOS系统。

直接将.mha文件拖到3d slicer就能看了

3d slicer

下一步思路从这个软件学习一下3d影像数据3dslicer教程

3d unet

3d图像分割思路总结

3d-unet的实现,想试试这篇文章。

代码地址

1拉取代码到google drive

在这里插入图片描述

2下载数据集

两种方法,但第一种好像行不通。
在这里插入图片描述
这篇文章使用的是这个:lits2017肝脏肿瘤数据集
数据是nii格式的
推荐的下载完的文件划分格式。

raw_dataset:
    ├── test  # 20 samples(27~46) 
    │   ├── ct
    │   │   ├── volume-27.nii
    │   │   ├── volume-28.nii
    |   |   |—— ...
    │   └── label
    │       ├── segmentation-27.nii
    │       ├── segmentation-28.nii
    |       |—— ...
    │       
    ├── train # 111 samples(0\~26 and 47\~131)
    │   ├── ct
    │   │   ├── volume-0.nii
    │   │   ├── volume-1.nii
    |   |   |—— ...
    │   └── label
    │       ├── segmentation-0.nii
    │       ├── segmentation-1.nii
    |       |—— ...

label文件夹里的segmentation-0.nii:
在这里插入图片描述
文件太大了,只用28-60.但也有5g这么多呢。
那test放28-35.train放36-60吧。
然后我们上传到google drive。

3导入必须的包

pytorch >= 1.1.0
torchvision
SimpleITK
Tensorboard
Scipy

使用

!pip install ...

在这里插入图片描述
在这里插入图片描述

4 数据预处理

然后在 preprocess_LiTS.py文件中118行更改预处理输入、输出目录:

if __name__ == '__main__':
    raw_dataset_path = '/content/drive/MyDrive/raw_dataset/train' # 输入数据集路径
    fixed_dataset_path = './fixed_data/' # 预处理后的数据集的输出路径

在这里插入图片描述
可见我们使用了25个nii文件。从36-60.

这是生成的文件夹
在这里插入图片描述

5模型训练

首先在 config.py中修改超参数–dataset_path为我们预处理后的数据根目录
在这里插入图片描述
使用这个训练

!python train.py --save model_name

发现报错1

在这里插入图片描述
错误定位
在这里插入图片描述
在这里插入图片描述
解决办法
应该是colab就提供了一个gpu,而程序默认用两个。

发现报错2

在这里插入图片描述
报错原因
大概意思是分类类别num_classes不对。

看config里这个,而我们用的是肝脏肿瘤数据集,所以应该改成3吧。
在这里插入图片描述
不对!

然后我从那个github看issue
发现和我的报错一样
在这里插入图片描述
按照它的改了以后果然成功了!!!

实验结果:pth在里面
在这里插入图片描述

6预测

上文提到test的时候还得把参数改回来。
在这里插入图片描述
把test_data路径改一下
在这里插入图片描述

!python test.py --save model_name

报错:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里提供一个简单的UNet代码示例,用于图像分割任务: ```python import torch import torch.nn as nn import torch.nn.functional as F class DoubleConv(nn.Module): def __init__(self, in_channels, out_channels): super(DoubleConv, self).__init__() self.conv = nn.Sequential( nn.Conv2d(in_channels, out_channels, 3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, 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, in_channels=3, out_channels=1, features=[64, 128, 256, 512]): super(UNet, self).__init__() self.ups = nn.ModuleList() self.downs = nn.ModuleList() self.pool = nn.MaxPool2d(kernel_size=2, stride=2) # Down part of UNet for feature in features: self.downs.append(DoubleConv(in_channels, feature)) in_channels = feature # Up part of UNet for feature in reversed(features): self.ups.append(nn.ConvTranspose2d(feature*2, feature, kernel_size=2, stride=2)) self.ups.append(DoubleConv(feature*2, feature)) self.bottleneck = DoubleConv(features[-1], features[-1]*2) self.final_conv = nn.Conv2d(features[0], out_channels, kernel_size=1) def forward(self, x): skip_connections = [] for down in self.downs: x = down(x) skip_connections.append(x) x = self.pool(x) x = self.bottleneck(x) skip_connections = skip_connections[::-1] for idx in range(0, len(self.ups), 2): x = self.ups[idx](x) skip_connection = skip_connections[idx//2] if x.shape != skip_connection.shape: x = F.interpolate(x, size=skip_connection.shape[2:], mode='bilinear', align_corners=True) concat_skip = torch.cat((skip_connection, x), dim=1) x = self.ups[idx+1](concat_skip) return self.final_conv(x) ``` 这里的代码实现了一个简单的UNet模型,其中包含了双卷积层和上采样层,用于图像分割任务。在构建模型时,可以根据任务需要自行修改输入、输出通道数以及特征层数组`features`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值