用PaddlePaddle实现图像语义分割模型ICNet

我怕爱的太早我们不能终老 提交于 2020-03-27 18:17:07

3 月,跳不动了?>>>

什么是图像语义分割?

图像语意分割顾名思义是将图像像素按照表达的语义含义的不同进行分组/分割,图像语义是指对图像内容的理解,例如,能够描绘出什么物体在哪里做了什么事情等,分割是指对图片中的每个像素点进行标注,标注属于哪一类别。近年来用在无人车驾驶技术中分割街景来避让行人和车辆、医疗影像分析中辅助诊断等。

今天,我们介绍在图像语义分割任务中,如何基于图像级联网络(Image Cascade Network,ICNet)进行语义分割,相比其他分割算法,ICNet兼顾了准确率和速度。

PaddlePaddle已经将ICNet应用于工业领域,将零件质检工人从高强度、低效率的密集劳动中解放出来,有效提升企业经营效率。

 

 

图像语义分割模型ICNet的实现方法

下面向大家介绍ICNet的实现(转自PaddlePaddle Github):

运行程序示例需要使用PaddlePaddle develop最新版本。如果您的PaddlePaddle安装版本低于此要求,请按照PaddlePaddle官方文档更新安装版本。

PaddlePaddle官方文档:

http://paddlepaddle.org/documentation/docs/zh/1.2/beginners_guide/index.html 

 

代码结构

├── network.py # 网络结构定义脚本
├── train.py   # 训练任务脚本
├── eval.py    # 评估脚本
├── infer.py   # 预测脚本
├── cityscape.py    # 数据预处理脚本
└── utils.py    # 定义通用的函数

简介

Image Cascade Network(ICNet)主要用于图像实时语义分割。相较于其它压缩计算的方法,ICNet即考虑了速度,也考虑了准确性。 ICNet的主要思想是将输入图像变换为不同的分辨率,然后用不同计算复杂度的子网络计算不同分辨率的输入,然后将结果合并。ICNet由三个子网络组成,计算复杂度高的网络处理低分辨率输入,计算复杂度低的网络处理分辨率高的网络,通过这种方式在高分辨率图像的准确性和低复杂度网络的效率之间获得平衡。

整个网络结构如下: 

数据准备

本文采用Cityscape数据集,请前往Cityscape官网注册下载:

https://www.cityscapes-dataset.com/

下载数据之后,按照这里的说明和工具处理数据:

https://github.com/mcordts/cityscapesScripts/blob/master/cityscapesscripts/preparation/createTrainIdLabelImgs.py#L3

处理之后的数据

data/cityscape/
|-- gtFine
|   |-- test
|   |-- train
|   `-- val
|-- leftImg8bit
|   |-- test
|   |-- train
|   `-- val
|-- train.list
`-- val.list

其中,train.list和val.list分别是用于训练和测试的列表文件,第一列为输入图像数据,第二列为标注数据,两列用空格分开。示例如下:

leftImg8bit/train/stuttgart/stuttgart_000021_000019_leftImg8bit.png gtFine/train/stuttgart/stuttgart_000021_000019_gtFine_labelTrainIds.png
leftImg8bit/train/stuttgart/stuttgart_000072_000019_leftImg8bit.png gtFine/train/stuttgart/stuttgart_000072_000019_gtFine_labelTrainIds.png

完成数据下载和准备后,需要修改cityscape.py脚本中对应的数据地址。

模型训练与预测

训练

执行以下命令进行训练,同时指定checkpoint保存路径:

python train.py --batch_size=16 --use_gpu=True --checkpoint_path="./chkpnt/"

使用以下命令获得更多使用说明:

python train.py --help

训练过程中会根据用户的设置,输出训练集上每个网络分支的loss, 示例如下:

Iter[0]; train loss: 2.338; sub4_loss: 3.367; sub24_loss: 4.120; sub124_loss: 0.151

测试

执行以下命令在Cityscape测试数据集上进行测试:

python eval.py --model_path="./model/" --use_gpu=True

需要通过选项--model_path指定模型文件。 测试脚本的输出的评估指标为mean IoU。

预测

执行以下命令对指定的数据进行预测:

python infer.py \
--model_path="./model" \
--images_path="./data/cityscape/" \
--images_list="./data/cityscape/infer.list"

通过选项--images_list指定列表文件,列表文件中每一行为一个要预测的图片的路径。 预测结果默认保存到当前路径下的output文件夹下。

实验结果

图2为在CityScape训练集上的训练的Loss曲线: 

在训练集上训练,在validation数据集上验证的结果为:mean_IoU=67.0%(论文67.7%)

图3是使用infer.py脚本预测产生的结果示例,其中,第一行为输入的原始图片,第二行为人工的标注,第三行为我们模型计算的结果。 

参考

  • ICNet for Real-Time Semantic Segmentation on High-Resolution Images:

    https://arxiv.org/abs/1704.08545

 

访问Github了解更多:

https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleCV/icnet

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!