注意

本项目代码包含多个文件, 需要使用GPU环境来运行后, 才能看到项目完整代码并正确运行:

基于PaddlePaddle的语义分割DeepLabV3+实现-LMLPHP
 

并请检查相关参数设置, 例如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。 基于PaddlePaddle的语义分割DeepLabV3+实现-LMLPHP
论文原文: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
In[2]
# 查看当前挂载的数据集目录,并解压数据集,完成生成操作
!ls /home/aistudio/data/
!tar -xf /home/aistudio/data/data9270/iccv09Data.tar -C /home/aistudio/data/
!python /home/aistudio/work/DataPartition.py
data9270
In[17]
# 下载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时,随机初始化模型参数并开始训练

In[8]
!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路径下

In[9]
!python freeze.py
 

在验证集上测试训练好的模型的mIoU指数,并输出

In[10]
# 由于本示例中仅仅微调了一个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

In[12]
# 使用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为分割后的图片
基于PaddlePaddle的语义分割DeepLabV3+实现-LMLPHP

使用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 官网,了解更多相关内容

09-05 00:06