什么是图像语义分割?html
图像语意分割顾名思义是将图像像素按照表达的语义含义的不一样进行分组/分割,图像语义是指对图像内容的理解,例如,可以描绘出什么物体在哪里作了什么事情等,分割是指对图片中的每一个像素点进行标注,标注属于哪一类别。近年来用在无人车驾驶技术中分割街景来避让行人和车辆、医疗影像分析中辅助诊断等。python
今天,咱们介绍在图像语义分割任务中,如何基于图像级联网络(Image Cascade Network,ICNet)进行语义分割,相比其余分割算法,ICNet兼顾了准确率和速度。git
PaddlePaddle已经将ICNet应用于工业领域,将零件质检工人从高强度、低效率的密集劳动中解放出来,有效提高企业经营效率。github
图像语义分割模型ICNet的实现方法算法
下面向你们介绍ICNet的实现(转自PaddlePaddle Github):网络
运行程序示例须要使用PaddlePaddle develop最新版本。若是您的PaddlePaddle安装版本低于此要求,请按照PaddlePaddle官方文档更新安装版本。ide
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