Ubuntu运行pytorch版本的pspnet

以下步骤是在数据集与环境都准备好的情况下执行的。
项目使用的是pspnet官方项目的pytorch版本

运行环境:

ubuntu18.04
GTX3090
Cuda11.1
Cudnn8.0.4
pytorch编译安装版本

1. 添加数据集

将准备好的数据集存放在semseg/dataset/[数据集名称]/image路径下,将影像文件和标签文件分开存放,保存后目录如下:

semseg # 工程文件夹
└── dataset
    └── [数据集名称]
        └── image
            ├── 影像文件夹
            │   ├── image.png
            │   └── ...
            └── 标签文件夹
                ├── label.png
                └── ...

2. 生成影像标签索引文件

使用semseg/tool中的createTxtFile,修改输入的参数,运行后会在semseg/dataset/[数据集名称]/list下生成两个txt文件,如下所示。

semseg # 工程文件夹
└── dataset
    └── [数据集名称]
        ├── image
        │   ├── 影像文件夹
        │   │   ├── image.png
        │   │   └── ...
        │   └── 标签文件夹
        │       ├── label.png
        │       └── ...
        └── list
            ├── training.txt
            └── validation.txt

3. 修改程序

为了避免不同数据集或不同工程之间的代码互相污染,将semseg/tool下的test和train的py文件复制到**semseg/exp/[数据集名称]/[预训练模型名称]**目录下,结果如下:

semseg # 工程文件夹
└── exp
    └── [数据集名称]
        └── [预训练模型名称]
            ├── test.py
            └── train.py

4. 创建分类数据

接下来创建的两个文件夹和训练无关,是在预测时为预测结果添加RGB和类别名称属性的。

semseg/data下创建文件夹,并在其中创建两个txt文件,分别名为[数据集名称]_colors.txt和[数据集名称]_name.txt,结果如下所示:

semseg # 工程文件夹
└── data
    └── [数据集名称]
        ├── [数据集名称]_colors.txt
        └── [数据集名称]_name.txt

修改name文件中的内容,按照分类,每一类为一行,如果数据中有NoData值,也要包括在其中。

修改colors文件中的内容,与name文件对应,每行一组RGB值,RGB用空格隔开,最终行数会与name文件相同。示例如下:

示例:[数据集名称]_name.txt

person
tree
dog
cat
ball

示例:[数据集名称]_colors.txt

101 223 65
23 12 43
255 21 46
123 34 12
65 23 255

5. 创建配置文件

此程序几乎所有的可以进行调整的参数都被放进了配置文件,所以配置文件中有大量的参数,为了准确且高效的得到我们所需要的配置文件,我采用了复制原有配置文件的方法。

复制semseg/config下的任意文件夹,我使用的ade20k数据集和pspnet50。

semseg # 工程文件夹
└── config
    └── [数据集名称]
        ├── [数据集名称]_psanet101.yaml
        ├── [数据集名称]_psanet50.yaml
        ├── [数据集名称]_pspnet101.yaml
        └── [数据集名称]_pspnet50.yaml

ps. 为避免重复输入,在生成配置文件后,可以将train. py中的配置文件输入中的default替换成要使用的yaml文件路径。

6. 修改配置文件

配置文件具体参数如下:

DATA:
  data_root: dataset/ade20k  # 数据文件夹
  train_list: dataset/ade20k/list/training.txt  # 训练集索引列表文件
  val_list: dataset/ade20k/list/validation.txt  # 验证集索引列表文件
  classes: 150  # 类别数量,3类就写3,NoData也算一类,可以参考[数据集名称]_name.txt的行数

TRAIN:  # 训练数据
  arch: psp  
  layers: 50
  sync_bn: True  # adopt sync_bn or not
  train_h: 473  # 训练图片的高(像素)
  train_w: 473  # 训练图片的宽(像素)
  scale_min: 0.5  # 训练时最小缩放倍数
  scale_max: 2.0  # 训练时最大缩放倍数
  rotate_min: -10  # 训练时最小旋转度数
  rotate_max: 10  # 训练时最大旋转度数
  zoom_factor: 8  # zoom factor for final prediction during training, be in [1, 2, 4, 8]
  ignore_label: 255
  aux_weight: 0.4
  train_gpu: [0, 1, 2, 3, 4, 5, 6, 7]  # 训练时用到的GPU,这里使用了8个GPU
  workers: 16  # data loader workers
  batch_size: 8  # batch size for training
  batch_size_val: 8  # batch size for validation during training, memory and speed tradeoff
  base_lr: 0.01  # 初始学习率
  epochs: 100  # 训练轮数
  start_epoch: 0  # 起始轮数,在继续训练时会用到
  power: 0.9
  momentum: 0.9
  weight_decay: 0.0001
  manual_seed:
  print_freq: 10  # 打印频率,这里表示每10个batch打印一次
  save_freq: 1  # 模型保存频率,这里表示每1轮输出保存一个模型
  save_path: exp/ade20k/pspnet50/model  # 输出模型保存路径,仅保存最后两个模型
  weight:  # path to initial weight (default: none)
  resume:  # path to latest checkpoint (default: none)继续训练参数,将想要集训训练的.pth文件路径谢在这里
  evaluate: False  # evaluate on validation set, extra gpu memory needed and small batch_size_val is recommend

Distributed:  # 应该是分布式参数
  dist_url: tcp://127.0.0.1:6789
  dist_backend: 'nccl'
  multiprocessing_distributed: True
  world_size: 1
  rank: 0

TEST:  # 预测参数
  test_list: dataset/ade20k/list/validation.txt  # 预测使用的列表文件
  split: val  # split in [train, val and test] 输入的列表文件类型,这里使用的是validation进行预测,如果只有一列影像,没有对应的标签文件,请选择test
  base_size: 512  # based size for scaling
  test_h: 473  # 预测时使用的图片高(像素),预测时程序可以自己进行裁切,所以这个数和准备好的数据大小关系其实并不用相等
  test_w: 473  # 预测时使用的图片宽(像素),预测时程序可以自己进行裁切,所以这个数和准备好的数据大小关系其实并不用相等
  scales: [1.0]  # evaluation scales, ms as [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] 预测时缩放倍数,1.0为原始比例,将数值提升到1.5或2.0可以预测到更多细节,但预测速度会呈指数上升。
  has_prediction: False  # has prediction already or not
  index_start: 0  # evaluation start index in list
  index_step: 0  # evaluation step index in list, 0 means to end
  test_gpu: [0]  # 预测使用的GPU
  model_path: exp/ade20k/pspnet50/model/train_epoch_100.pth  # 预测使用的model路径
  save_folder: exp/ade20k/pspnet50/result/epoch_100/val/ss  # 预测结果保存路径
  colors_path: data/ade20k/ade20k_colors.txt  # RGB渲染文件路径
  names_path: data/ade20k/ade20k_names.txt  # 类别名称文件路径

无论训练还是预测,yaml中的DATA一定要改对。

训练需要修改的参数

DATA:
  data_root: dataset/[数据集名称]
  train_list: dataset/数据集名称/list/training.txt
  val_list: dataset/数据集名称/list/validation.txt
  classes: 5

TRAIN:
  train_h: 473
  train_w: 473
  train_gpu: [0]
  workers: 16
  batch_size: 8 
  batch_size_val: 8
  base_lr: 0.01
  epochs: 100
  save_path: exp/[数据集名称]/pspnet50/model

7. 开始训练

在项目根目录下运行:

python exp/[数据集名称]/[预训练模型名称]/train.py

一些报错情况:

1. 在运行后报错提示 No module named 'util' 的问题。
    解:这个问题是由于程序运行位置错误导致找不到util文件夹,可以在train.py或其他报错文件夹中添加如下代码解决:
     $ import sys
     $ sys.path.append("/root/Project/semseg")
     /root/Project/semseg 为项目根目录。

8. 可视化训练

项目中使用了tensorflow中的可视化包——tensorbord,所以想要运行tensorbord,一定要安装tensorflow,不然是运行不起来的。

如果环境中未安装tensorflow,先安装tensorflow.

pip/conda install tensorflow

安装后即可运行tensorbord。

tensorboard --logdir=exp/[数据集名称]
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值