以下步骤是在数据集与环境都准备好的情况下执行的。
项目使用的是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/[数据集名称]