注意
本项目代码包含多个文件, 需要使用GPU环境来运行后, 才能看到项目完整代码并正确运行:
并请检查相关参数设置, 例如use_gpu, fluid.CUDAPlace(0)等处是否设置正确.
下载安装命令
## CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle
## GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
简介
DeepLabv3+ 是DeepLab语义分割系列网络的最新作,其前作有 DeepLabv1,DeepLabv2, DeepLabv3, 在最新作中,DeepLab的作者通过encoder-decoder进行多尺度信息的融合,同时保留了原来的空洞卷积和ASSP层, 其骨干网络使用了Xception模型,提高了语义分割的健壮性和运行速率,在 PASCAL VOC 2012 dataset取得新的state-of-art performance,89.0mIOU。
论文原文:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
数据格式
解压数据集,并通过work/DataPartition随机生成训练集和验证集,数据集构成如下:
-
data/ 数据目录
-
- iccv09Data/ 存放数据的目录
-
-
- images/ 用于存放图像
-
-
-
-
- a.jpg 图像样本a
-
-
-
-
- labels/ 用于存放标签
-
-
-
-
- a..regions.txt 图像a对应的标签
-
-
-
- train_list.txt 随机生成的训练数据列表,每一行代表一个样本,包含该行样本的原始图像路径以及标签路径,中间以空格隔开
-
- eval_list.txt 随机生成的验证数据列表,格式同train_list.txt
文件结构
|--freeze.py # 固化模型
|--infer.py # 模型推断
|--eval.py # 模型验证
|--config.py # 模型参数
|--train.py # 模型训练脚本
|--work # 通用代码目录
|--|--DataPartition.py # 数据预处理脚本
|--|--reader.py # 数据读取脚本
|--|--utils.py # 通用工具
|--|--loss.py # 定义损失
|--|--model.py # 模型定义
paddle model zoo
我们为了节约更多的显存,在这里我们使用Group Norm作为我们的归一化手段。如果需要使用BN 可以在config中进行修改 如果需要从头开始训练模型,用户需要下载paddle model zoo中的初始化模型
wget https://paddle-deeplab.bj.bcebos.com/deeplabv3plus_gn_init.tgz
mkdir pretrained/ model
tar -xf deeplabv3plus_gn_init.tgz -C pretrained/ model/ && rm deeplabv3plus_gn_init.tgz
如果需要最终训练模型进行fine tune或者直接用于预测,请下载paddle model zoo中的最终模型,该模型是使用CityScape数据集进行训练得到的
wget https://paddle-deeplab.bj.bcebos.com/deeplabv3plus_gn.tgz
mkdir pretrained/ model
tar -xf deeplabv3plus_gn.tgz -C pretrained/ model/ && rm deeplabv3plus_gn.tgz
# 查看当前挂载的数据集目录,并解压数据集,完成生成操作
!ls /home/aistudio/data/
!tar -xf /home/aistudio/data/data9270/iccv09Data.tar -C /home/aistudio/data/
!python /home/aistudio/work/DataPartition.py
data9270
# 下载paddle model zoo中预训练的模型
!wget https://paddle-deeplab.bj.bcebos.com/deeplabv3plus_gn.tgz
!mkdir pretrained/ model
!tar -xf deeplabv3plus_gn.tgz -C pretrained/ model/ && rm deeplabv3plus_gn.tgz
--2019-08-27 10:48:21-- https://paddle-deeplab.bj.bcebos.com/deeplabv3plus_gn.tgz Resolving paddle-deeplab.bj.bcebos.com (paddle-deeplab.bj.bcebos.com)... 182.61.200.229, 182.61.200.195 Connecting to paddle-deeplab.bj.bcebos.com (paddle-deeplab.bj.bcebos.com)|182.61.200.229|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 152650268 (146M) [application/x-gzip] Saving to: ‘deeplabv3plus_gn.tgz.1’ deeplabv3plus_gn.tg 100%[===================>] 145.58M 30.6MB/s in 4.2s 2019-08-27 10:48:26 (34.7 MB/s) - ‘deeplabv3plus_gn.tgz.1’ saved [152650268/152650268]
开始训练过程,训练中的具体参数可以在config.py文件中修改,默认使用Gpu进行训练,目前训练中暂时保存的模型保存在train model路径下,训练时的log存在logs路径下,当paddle_flag参数都设置为1时,忽略continue_train参数,既使用paddle model zoo中预训练好的模型进行fine tuning;当continue_train参数为1且paddle_flag参数为0时,使用train_model目录(该目录可在config中进行修改)下暂存的模型继续训练;当continue_train和paddle_flag都为0时,随机初始化模型参数并开始训练
!python train.py --use_gpu 1 --continue_train 1 --paddle_flag 0 --num_epochs 1
W0827 17:47:26.304126 593 device_context.cc:259] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0 W0827 17:47:26.307126 593 device_context.cc:267] device: 0, cuDNN Version: 7.3. 2019-08-27 17:47:26,340 - train.py[line:109] - INFO: train params:{'data_augmentation_config': {'use_augmentation': False, 'min_resize': 0.5, 'max_resize': 4, 'crop_size': 240}, 'eval_file_path': 'data/eval_list.txt', 'depthwise_use_cudnn': False, 'base_lr': 0.001, 'default_norm_type': 'gn', 'infer_model_dir': 'infer model', 'use_gpu': True, 'dropout_keep_prop': 0.9, 'encode_channel': 256, 'pretrained_model_dir': 'pretrained model/deeplabv3plus_gn', 'image_shape': [240, 320], 'is_train': True, 'batch_size': 10, 'total_step': 20000, 'data_dir': 'data/iccv09Data/', 'train_model_dir': 'train model', 'decode_channel': 48, 'bn_momentum': 0.9997, 'continue_train': True, 'default_epsilon': 0.001, 'weight_decay': 4e-05, 'num_classes': 8, 'default_group_number': 32, 'enable_ce': False, 'num_epochs': 500, 'paddle_flag': False} 2019-08-27 17:47:26,895 - train.py[line:44] - INFO: ***************已读入预先训练的模型,并准备继续训练*************** 2019-08-27 17:47:26,896 - train.py[line:114] - INFO: ***************训练开始*************** 2019-08-27 17:47:37,228 - train.py[line:132] - INFO: epoch: 0 step: 100 loss:1.4176461696624756 period:0.33 sec 2019-08-27 17:47:46,596 - train.py[line:132] - INFO: epoch: 0 step: 200 loss:1.558440923690796 period:0.33 sec 2019-08-27 17:47:56,461 - train.py[line:132] - INFO: epoch: 0 step: 300 loss:1.2766289710998535 period:0.33 sec 2019-08-27 17:48:05,262 - train.py[line:132] - INFO: epoch: 0 step: 400 loss:1.353928565979004 period:0.33 sec 2019-08-27 17:48:07,291 - train.py[line:137] - INFO: 0's epoch_total_time: 16.00 sec && mean_loss: 1.4204771774155753 2019-08-27 17:48:07,292 - train.py[line:140] - INFO: 暂时存储第0个epoch的训练结果 2019-08-27 17:48:10,819 - train.py[line:142] - INFO: ***************训练完成***************
将训练好的模型参数固化,并保存在infer model路径下
!python freeze.py
在验证集上测试训练好的模型的mIoU指数,并输出
# 由于本示例中仅仅微调了一个epoch,所以模型的性能不是很好
!python eval.py
memory_optimize is deprecated. Use CompiledProgram and Executor W0827 17:48:46.752137 729 device_context.cc:259] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0 W0827 17:48:46.755635 729 device_context.cc:267] device: 0, cuDNN Version: 7.3. eval done! total number of image is 112, mean iou: 0.25738463049528865
使用固化的模型进行分割,并将分割结果保存为result.jpg
# 使用test数据集的一副图像进行模型推断,并将分割的结果保存在根目录下
!python infer.py
%matplotlib inline
import matplotlib.pyplot as plt
img1 = plt.imread('origin.jpg')
img2 = plt.imread('result.jpg')
fig = plt.figure()
ax = fig.add_subplot(121)
ax.imshow(img1)
ax.set_title('origin')
ax.axis('off')
ax = fig.add_subplot(122)
ax.imshow(img2)
ax.set_title('result')
ax.axis('off')
plt.show()
运行结束,origin为预测图片,result为分割后的图片
使用AI Studio一键上手实践项目吧:https://aistudio.baidu.com/aistudio/projectdetail/124366
下载安装命令
## CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle
## GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
>> 访问 PaddlePaddle 官网,了解更多相关内容。
{{m.name}}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/92498.html