MindSpore(Ascend)训练DeepLabV3+
说明:本文记录了使用MindSpore框架在Atlas 300T训练卡上训练DeepLabV3+的过程,参考:https://gitee.com/mindspore/models/tree/master/official/cv/deeplabv3plus
1. 描述
DeepLab是一系列图像语义分割模型,DeepLabv3+通过encoder-decoder进行多尺度信息的融合,同时保留了原来的空洞卷积和ASSP层, 其骨干网络使用了Resnet模型,提高了语义分割的健壮性和运行速率。
2. 前提条件
- 开发环境:Ascend910 + MindSpore1.3.0(安装教程:https://www.mindspore.cn/install)
- Python依赖: opencv-python、numpy、pillow
3. 数据集
- Pascal VOC 2012(https://www.kaggle.com/huanghanchina/pascal-voc-2012)
- Semantic Boundaries Dataset(http://home.bharathh.info/pubs/codes/SBD/download.html)
4. 模型训练
4.1 获取源代码
克隆MindSpore Gitee仓库开源代码:https://gitee.com/mindspore/models/tree/master/official/cv/deeplabv3plus
4.2 数据集预处理
数据集目录:
└─Dataset
├─VOC2012
│ ├──Annotations
│ ├──...
│
└─benchmark_RELEASE
├──dataset
├──...
根据readme提示处理数据集:
进入tools目录:
cd /deeplabv3plus/src/tools获取训练数据清单:
python3 get_dataset_list.py --data_dir=Dataset #执行完成后会在Dadaset目录下生成voc_train_lst.txt、voc_val_lst.txt、vocaug_train_lst.txt三个文件将数据集转换为MindRecord:
#三个数据清单都需要执行一次 python3 get_dataset_mindrecord.py --data_root=/home/wesley/dataset/VOC2012/ \ --data_lst=/home/wesley/dataset/voc_train_lst.txt \ --dst_path=../../mindrecord/voc_train.mindrecord \ --num_shards=1 \ --shuffle=True
4.3 开始训练
4.3.1 准备预训练Backbone:
resnet101_ascend_v120_imagenet2012_official_cv_bs32_acc78.ckpt
4.3.2 单卡训练:
执行train.py脚本即可,命令如下,参数(在train.py中查看描述)可根据实际情况修改:
python3 train.py --data_file=./mindrecord/vocaug_train.mindrecord \
--train_dir=./ckpt/ \
--train_epochs=200 \
--batch_size=32 \
--crop_size=513 \
--base_lr=0.015 \
--lr_type=cos \
--min_scale=0.5 \
--max_scale=2.0 \
--ignore_label=255 \
--num_classes=21 \
--model=DeepLabV3plus_s16 \
--ckpt_pre_trained=./resnet101_bs32_acc78.ckpt \
--save_steps=1500 \
--keep_checkpoint_max=200 >log 2>&1 &
训练日志信息:
4.3.3 多卡训练:
通过script目录下的脚本启动8卡训练(由于多卡没有环境,未做测试)
1、使用vocaug_train数据集训练s16,微调ResNet-101预训练模型,修改run_distribute_train_s16_r1.sh脚本参数部分如下,然后执行:bash run_distribute_train_s16_r1.sh
train_path=../deeplabv3plus/train/ #训练结果输出路径
train_code_path=../deeplabv3plus/ #代码路径
python3 ${train_code_path}/train.py --train_dir=${train_path}/ckpt \
--data_file=./mindrecord/vocaug_train.mindrecord \
--train_epochs=300 \
--batch_size=32 \
--crop_size=513 \
--base_lr=0.08 \
--lr_type=cos \
--min_scale=0.5 \
--max_scale=2.0 \
--ignore_label=255 \
--num_classes=21 \
--model=DeepLabV3plus_s16 \
--ckpt_pre_trained=./resnet101_bs32_acc78.ckpt \
--is_distributed \
--save_steps=410 \
--keep_checkpoint_max=200 >8p_log_1 2>&1 &
2、 使用vocaug_train数据集训练s8,微调上一步的模型,修改run_distribute_train_s8_r1.sh脚本参数部分如下,然后执行:bash run_distribute_train_s8_r1.sh
train_path=../deeplabv3plus/train2/
train_code_path=../deeplabv3plus/
python3 ${train_code_path}/train.py --train_dir=${train_path}/ckpt \
--data_file=./mindrecord/vocaug_train.mindrecord \
--train_epochs=800 \
--batch_size=16 \
--crop_size=513 \
--base_lr=0.02 \
--lr_type=cos \
--min_scale=0.5 \
--max_scale=2.0 \
--ignore_label=255 \
--num_classes=21 \
--model=DeepLabV3plus_s8 \
--loss_scale=2048 \
--ckpt_pre_trained=./train/ckpt/DeepLabV3plus_s16-34_45.ckpt
--is_distributed \
--save_steps=820 \
--keep_checkpoint_max=200 >8p_log_2 2>&1 &
3、使用voc_train数据集训练s8,微调上一步的模型,修改run_distribute_train_s8_r2.sh脚本参数部分如下,然后执行:bash run_distribute_train_s8_r2.sh
train_path=../deeplabv3plus/train2/
train_code_path=../deeplabv3plus/
python3 ${train_code_path}/train.py --train_dir=${train_path}/ckpt \
--data_file=./mindrecord/voc_train.mindrecord \
--train_epochs=300 \
--batch_size=16 \
--crop_size=513 \
--base_lr=0.008 \
--lr_type=cos \
--min_scale=0.5 \
--max_scale=2.0 \
--ignore_label=255 \
--num_classes=21 \
--model=DeepLabV3plus_s8 \
--loss_scale=2048 \
--ckpt_pre_trained=./train/ckpt/DeepLabV3plus_s8-34_45.ckpt \
--is_distributed \
--save_steps=110 \
--keep_checkpoint_max=200 >8p_log_3 2>&1 &
5. 模型评估
通过eval.py脚本和训练保存的ckpt文件进行模型评估:
python3 eval.py --data_root=/home/wesley/dataset \
--data_lst=/home/wesley/dataset/voc_val_lst.txt \
--batch_size=32 \
--crop_size=513 \
--ignore_label=255 \
--num_classes=21 \
--model=DeepLabV3plus_s16 \
--scales=1.0 \
--freeze_bn \
--ckpt_path=./train/ckpt/DeepLabV3plus_s16-34_45.ckpt >./eval_log 2>&1 &
评估结果(单卡训练200 epochs):