路面病害检测-从数据清洗到模型部署的全流程方案
转自AI Studio,原文链接:
路面病害检测-从数据清洗到模型部署的全流程方案 - 飞桨AI Studio
1. 项目说明
无论是水泥还是沥青路面,在通车使用一段时间之后,都会陆续出现各种损坏、变形及其它缺陷,这些我们统称为路面病害。如下图1所示。
图1路面病害示例
根据美国科氏公司的研究表明:一条质量合格的道路,在使用寿命75%的时间内性能下降40%,这一阶段称之为预防性养护阶段;如不能及时养护,在随后12%的使用寿命时间内,性能再次下降40%,从而造成养护成本大幅度的增加。本项目基于RDD2020路面病害数据集和一个辅助数据集完成路面病害检测的全流程任务。
方案难点:
- 数据集质量不佳: 数据集质量不佳,存在未标注、标注不规范、标注不统一等情况,需要进行数据清洗;
- 较高的模型泛化能力: 由于使用车载手机拍摄,受光照光线等影响,对模型泛化能力的要求较高;
- 实时性: 路面病害检测场景下,需要在移动端部署,对实时性能要求较高。
2. 安装说明
环境要求
- PaddlePaddle >= 2.2
- Python >= 3.7
- PaddleDetection >=2.4
- PaddleSlim >=1.0
- PaddleLite >=2.1
安装的相关问题参考PaddleDetection安装文档, PaddleSlim仓库,PaddleLite仓库
2.1 安装PaddleDetection
In [42]
## clone repository
!git clone https://gitee.com/PaddlePaddle/PaddleDetection.git
In [2]
## install dependencies
%cd PaddleDetection
!pip install -r requirements.txt
!python setup.py install
In [4]
## 测试是否安装成功
!python ppdet/modeling/tests/test_architectures.py
In [ ]
%cd
/home/aistudio
2.2 安装PaddleSlim
In [39]
!pip install paddleslim -i https://pypi.tuna.tsinghua.edu.cn/simple
In [38]
## 或者克隆后安装
!git clone https://github.com/PaddlePaddle/PaddleSlim.git
%cd PaddleSlim
!python setup.py install
2.3 安装PaddleLite
In [11]
!pip install paddlelite
3. 数据准备
本项目使用的主要数据集为 RDD2020 比赛数据集,是 RDD2020的路面病害检测比赛数据集。包括26336张手机拍摄的路面图片。保含多个类别的路面病害,但是本项目只关注其中的4种病害,分别是:Longitudinal Cracks(D00), Transverse Cracks(D10), Alligator Cracks(D20), 和 Potholes(D40)。本项目中,仅仅使用该数据集的训练集,共21041张图片。经过数据清洗,去除未标注的图片、不含有以上四个类别的图片后的有效图片共14568张。对该数据集进行1:9的划分后,训练集共12949张,验证集共1619张。数据集示例图片如下图2所示:
图2 RDD2020比赛数据集图片示例
图片来源:RDD2020 比赛数据集
为了增加模型的泛化能力,本项目另外使用了一个稍小一点的路面病害数据集,称为路面病害产品数据集,来自【全球开放数据创新应用大赛】的道路路面病害智能分析赛道。该数据集共包括6000张图片,共8个类别Crack, Manhole, Net, Pothole, Patch-Crack, Patch-Net, Patch-Pothole, other。经过数据清洗,去除不含有关注的四个类别的图片后,该数据集共有2854张图片,全部加入到RDD2020的路面病害检测训练集中。该数据集示例图片如下图3所示:
图3 路面病害产品数据集图片示例
经过数据预处理,最后训练集共有15803张图片,验证集共有1619张图片。
3.1 预处理RDD2020比赛数据集
In [ ]
%cd
/home/aistudio
In [ ]
## 解压缩训练集
!tar xzf data/data138375/train.tar.gz -C work/
In [ ]
## 数据清洗
!python code/clean_data.py
finished creating 14568 xmls!
In [ ]
# 数据预处理,包括训练集和验证集的划分等
!python code/preprocess.py
Finished preprocessing the data including train val split, creating 12949 train images and 1619 eval images!
In [ ]
%cd PaddleDetection/
/home/aistudio/PaddleDetection
In [ ]
##将训练数据集转为coco格式
!python tools/x2coco.py \--dataset_type voc \--voc_anno_dir /home/aistudio/voc_annos/ \--voc_anno_list /home/aistudio/train.txt \--voc_label_list /home/aistudio/label_list.txt \--voc_out_name /home/aistudio/train.json
Start converting ! 100%|██████████████████████████████████| 12949/12949 [00:00<00:00, 16718.23it/s]
In [ ]
##将验证数据集转为coco格式
!python tools/x2coco.py \--dataset_type voc \--voc_anno_dir /home/aistudio/voc_annos/ \--voc_anno_list /home/aistudio/val.txt \--voc_label_list /home/aistudio/label_list.txt \--voc_out_name /home/aistudio/val.json
Start converting ! 100%|█████████████████████████████████████| 1619/1619 [00:00<00:00, 5399.41it/s]
3.2 预处理路面病害产品数据集
In [ ]
%cd
/home/aistudio
In [36]
## 解压缩
!unzip data/data140177/train.zip -d new_dataset/
由于该数据集与RDD2020的路面病害检测数据集的类别不统一,经过仔细观察,去除该数据集中的Manhole、Net、Patch-Net和Other。Pothole保持不变,Patch-Crack改为Alligator Cracks,Patch-Pothole改为Pothole,Crack根据形状分为Longitudinal Cracks和Transverse Cracks。
为了避免数据的id重复,将该产品数据集加入到RDD2020的路面病害检测数据集时给已有数据的id加30000。
In [ ]
## 预处理产品数据集
!python code/process_new_data.py
before adding 12949 after adding 15803 finished adding 2854 images and processing new dataset!
4.模型选择
当前主流的目标检测算法主要分为两类:服务端算法和端侧算法:
- 服务端算法,其优势在于模型精度较高,但实时性较差。最具代表性的就是RCNN类算法。如图4所示:
图4 服务端检测算法模型
- 端侧算法,其优势在于实时性较好,同时要求模型大小尽可能的小,但精度通常没有服务端算法高。PicoDet算法就是一种典型的端侧算法。如图5所示:
图5 边缘端检测算法模型
为了能够解决端侧部署的实用要求,在经过初步的模型训练筛选后,本项目采用PP-PicoDet算法。
5. 模型训练
对picodet系列的不同模型进行训练比较,这里以picodet_s_416模型为例,模型的配置文件为:picodet_s_416_coco_lcnet.yml
。
In [ ]
%cd PaddleDetection
/home/aistudio/PaddleDetection
5.1 训练
训练时将PaddleDetection中提供的配置文件的学习率改为原来的1/4,可以适当减小原来的epoch数量。
In [29]
# GPU单卡训练
!python tools/train.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml --eval
5.2 验证
用通过训练时评估保存的最好模型进行模型验证。由于训练模型需要较长时间,本项目提供了训练好的模型供验证、测试和部署。以下提供两种不同使用方法:自己训练的模型和本项目提供的训练好的模型。
In [28]
## 使用自己训练的模型
!python tools/eval.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml -o weights=output/picodet_s_416_coco_lcnet/best_model.pdparams
In [28]
## 使用本项目训练好的模型
!python tools/eval.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml -o weights=/home/aistudio/models/picodet_s_416/best_model.pdparams
5.3 模型预测
对一张图片进行预测。
In [25]
## 修改标签使推理图片更加可读
!python /home/aistudio/code/make_labels_readable.py
In [27]
## 使用自己训练的模型
!python tools/infer.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml \--infer_img=/home/aistudio/Czech_001496.jpg \--output_dir=/home/aistudio/infer_output_s_416/ \--draw_threshold=0.5 \-o weights=output/picodet_s_416_coco_lcnet/best_model \--use_vdl=True
In [23]
## 使用本项目训练好的模型
!python tools/infer.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml \--infer_img=/home/aistudio/Czech_001496.jpg \--output_dir=/home/aistudio/infer_output_s_416/ \--draw_threshold=0.5 \-o weights=/home/aistudio/models/picodet_s_416/best_model \--use_vdl=True
预测结果如下图6所示:
图6 picodet_s_416模型预测结果
6. 模型部署
由于本项目要在手机端进行模型部署,这里选择PaddleLite进行模型部署。PaddleLite支持各个边缘平台,详细信息可以参考PaddleLite文档
6.1 模型导出
首先需要将训练好的模型导出成静态推理模型。
In [31]
## 使用自己训练的模型
!python tools/export_model.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml -o weights=output/picodet_s_416_coco_lcnet/best_model.pdparams \
--output_dir inference_models
In [9]
## 使用本项目训练好的模型
!python tools/export_model.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml -o weights=/home/aistudio/models/picodet_s_416/best_model.pdparams \
--output_dir inference_models
6.2 将inference模型转化为PaddleLite优化模型
然后使用PaddleLite工具将静态推理模型转化为可以部署的PaddleLite模型,转化时可以选择将要部署的平台架构。
In [23]
## 创建需要的文件夹
import os
if not os.path.exists("optimized_inference_models/picodet_s_416_coco_lcnet"):os.makedirs("optimized_inference_models/picodet_s_416_coco_lcnet")
In [33]
!paddle_lite_opt --valid_targets=arm --model_file=inference_models/picodet_s_416_coco_lcnet/model.pdmodel --param_file=inference_models/picodet_s_416_coco_lcnet/model.pdiparams --optimize_out=optimized_inference_models/picodet_s_416_coco_lcnet/model
In [17]
## 转化为fp16精度的模型
!paddle_lite_opt --valid_targets=arm --model_file=inference_models/picodet_s_416_coco_lcnet/model.pdmodel --param_file=inference_models/picodet_s_416_coco_lcnet/model.pdiparams --optimize_out=optimized_inference_models/picodet_s_416_coco_lcnet/model_fp16 --enable_fp16=true
6.3 真机部署
这里参考PaddleLite的官方部署demo将模型部署在Iphone手机上. 需要注意的是在修改部署代码时要修改label文件、添加训练好的模型,修改ViewController.mm
文件中的资源配置信息,并且要根据模型的输入要求修改输入的尺寸参数。本项目训练好的picodet_s_416可部署模型在models
文件夹内。 运行效果如下图7所示。
图7 picodet_s_416模型iphone真机部署效果图
7. 模型优化
以上模型的真机预测性能如下图8所示。
图8 picodet_s_416模型真机部署性能
可以看出,实时性比较好,基本为25fps。下面尝试在不改变模型的情况下对模型进行量化并比较性能。
7.1 模型量化
这里使用PaddleSlim对模型进行量化压缩,量化分为在线量化和离线量化两种。为了保持模型性能,这里采用在线量化的方法。
In [35]
## 在线量化训练
!python tools/train.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml --slim_config /home/aistudio/code/picodet_s_416_quant_config.yml --eval
In [ ]
## 量化后验证(使用自己训练的模型)
!python tools/eval.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml --slim_config /home/aistudio/code/picodet_s_416_quant_config.yml -o weights=output/picodet_s_416_quant_config/best_model.pdparams
In [ ]
## 量化后验证(使用本项目训练好的模型)
!python tools/eval.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml --slim_config /home/aistudio/code/picodet_s_416_quant_config.yml -o weights=/home/aistudio/models/picodet_s_416/best_model_quant.pdparams
In [ ]
## 量化后预测(使用自己训练的模型)
!python tools/infer.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml --slim_config /home/aistudio/code/picodet_s_416_quant_config.yml -o weights=output/picodet_s_416_quant_config/best_model.pdparams \--infer_img=/home/aistudio/Czech_001496.jpg \--output_dir=/home/aistudio/infer_output_afterquant_s416/ \--draw_threshold=0.5 \
In [21]
## 量化后预测(使用本项目训练好的模型)
!python tools/infer.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml --slim_config /home/aistudio/code/picodet_s_416_quant_config.yml -o weights=/home/aistudio/models/picodet_s_416/best_model_quant.pdparams \--infer_img=/home/aistudio/Czech_001496.jpg \--output_dir=/home/aistudio/infer_output_afterquant_s416/ \--draw_threshold=0.5 \
在观察到模型性能基本没有问题的情况下,重复之前的模型部署过程。
In [ ]
## 导出静态推理模型(使用自己训练的模型)
!python tools/export_model.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml --slim_config /home/aistudio/code/picodet_s_416_quant_config.yml -o weights=output/picodet_s_416_quant_config/best_model.pdparams \
--output_dir inference_models/picodet_s_416_quant_config
In [ ]
## 导出静态推理模型(使用本项目训练好的模型)
!python tools/export_model.py -c /home/aistudio/code/picodet_s_416_coco_lcnet.yml --slim_config /home/aistudio/code/picodet_s_416_quant_config.yml -o weights=/home/aistudio/models/picodet_s_416/best_model_quant.pdparams \
--output_dir inference_models/picodet_s_416_quant_config
In [ ]
## 导出真机部署模型
!paddle_lite_opt --valid_targets=arm --model_file=inference_models/picodet_s_416_quant_config/picodet_s_416_quant_config/model.pdmodel --param_file=inference_models/picodet_s_416_quant_config/picodet_s_416_quant_config/model.pdiparams --optimize_out=optimized_inference_models/picodet_s_416_quant_config/model
In [ ]
## 导出fp16精度的真机部署模型
!paddle_lite_opt --valid_targets=arm --model_file=inference_models/picodet_s_416_quant_config/picodet_s_416_quant_config/model.pdmodel --param_file=inference_models/picodet_s_416_quant_config/picodet_s_416_quant_config/model.pdiparams --optimize_out=optimized_inference_models/picodet_s_416_quant_config_fp16/model --enable_fp16=true
7.2 模型量化后效果
通过量化压缩,模型大小由原来的5.2M变为了2M。真机部署时发现,模型预测速度比量化前变快了一些,如下图9和图10所示。
图9 picodet_s_416模型量化前真机部署性能
图10 picodet_s_416模型量化后真机部署性能
但是量化后在常规的阈值0.5的情况下不能检测出目标,将阈值降低为0.4时目标就可以检测出来了。
7.3 使用fp16精度推理的效果比较
通过使用fp16精度模型,模型预测速度有较大提高,如下图11和图12所示。
图11 picodet_s_416模型fp32真机部署性能
图12 picodet_s_416模型fp16真机部署性能
8. 总结
本案例中,对各种模型进行了尝试。实验结果如下:
模型 | MAP | 推理速度-iphone11 | 推理速度-iphone11(fp16) | 模型大小 |
---|---|---|---|---|
picodet_l_640 | 0.551 | 316ms(3.16fps) | 170ms(5.88fps) | 23.6M |
picodet_l_640量化后 | 0.523 | 277ms(3.61fps) | 273ms(3.66fps) | 6.9M |
picodet_l_320 | 0.446 | 82ms(12.19fps) | 43ms(23.26fps) | 23.6M |
picodet_l_320量化后 | 0.421 | 71ms(14.08fps) | 71ms(14.08fps) | 6.9M |
picodet_s_416 | 0.476 | 37ms(27.03fps) | 21ms(47.62fps) | 5.2M |
picodet_s_416量化后 | 0.436 | 32ms(31.25fps) | 35ms(28.57fps) | 2M |
picodet_s_320 | 0.417 | 22ms(45.45fps) | 13ms(76.92fps) | 5.2M |
picodet_xs_416 | 0.409 | 26ms(38.46fps) | 18ms(55.55fps) | 3.3M |
可以看到,对于不同的模型,模型大小和输入图片大小直接影响模型精度和速度,对于小模型来说量化压缩的性价比不高。模型部署的性能要多次实验后才能选择确定。 使用fp16精度推理后,非压缩模型的速度明显变快,在iphone11上基本可以达到原来的1倍半到2倍之间,性能可观。
模型进一步优化思路:
- 数据集的质量和数量会直接影响模型的精度,后续可以对数据集进行逐张梳理来提高数据集质量,同时可以引入更多的外部数据集来提高模型的泛化能力。
- Batch size大小以及学习率的选择也会对模型的训练性能有影响,后续可以通过调参来提高模型性能。
- 不同的边缘平台对推理的性能和速度都有影响,后续可以根据需要在不同的边缘平台上进行实验选择。
更多资源
更多深度学习知识、产业案例、面试宝典等,请参考:awesome-DeepLearning
更多PaddleDetection使用教程,请参考:PaddleDetection
飞桨框架相关资料,请参考:飞桨深度学习平台
路面病害检测-从数据清洗到模型部署的全流程方案相关推荐
- python自动化部署程序,聊聊Python自动化脚本部署服务器全流程(详细)
原标题:聊聊Python自动化脚本部署服务器全流程(详细) 来源:AirPython 作者:星安果 1. 前言 大家好,我是安果! 日常编写的 Python 自动化程序,如果在本地运行稳定后,就可以考 ...
- pythonmysql部署_详解centos7+django+python3+mysql+阿里云部署项目全流程
(PS:本文假设你已经在本地联调好django和客户端,只是需要将django部署到外网) 购买阿里云服务器 到[阿里云官网],选择轻量应用服务器, 步骤如图所示: 地域随便选择哪一个,镜像的话,对比 ...
- 面向生产环境!深度学习模型部署资源全辑
点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器学习实验室 Author:louwill Machine Learning Lab AI博士笔记系列推 ...
- 使用PaddleX实现车辆检测模型训练到服务化部署落地全流程
★★★ 本文源自AlStudio社区精品项目,[点击此处]查看更多精品内容 >>> 1. 项目背景 随着AI技术的快速发展,深度学习技术在各个领域的应用越来越广泛.作为一种革命性的机 ...
- docker-机器学习/深度学习模型部署的容器化方案
目前,使用docker部署机器学习或深度学习模型正在成为企业大规模部署的一种常规操作.基于目前工作的情况,刚好可以使用现成的模型尝试使用docker进行部署.主要有以下 1. 什么是docker 2. ...
- 工业质检如何以“智”取胜?15分钟上手工业零部件检测全流程方案
工信部联合国家发展改革委.教育部.科技部等部门发布了十四五智能制造发展规划.规划中提出:到2025年70%规模以上的制造业企业基本要实现数字化网络化,建成500个以上引领行业发展的智能制造示范工厂. ...
- 在Docker 上完成对Springboot+Mysql+Redis的前后端分离项目的部署(全流程,全截图)
本文章全部阅读大约2小时,包含一个完整的springboot + vue +mysql+redis前后端分离项目的部署在docker上的全流程,比较复杂,请做好心理准备,遇到问题可留言或则私信 目录 ...
- 活体检测在移动端模型部署
背景 随着智能设备的越来越普及,越来越多的视觉算法需要应用于移动端,比如iPhone的刷脸解锁,支付宝的刷脸支付,人脸识别系统逐渐开始商用,并向着自动化.无人监督化的趋势发展.然而目前人脸识别技术能识 ...
- object怎么转list_PaddleOCR识别模型转Pytorch全流程记录
这篇文章主要负责记录自己在转PaddleOCR 模型过程中遇到的问题,以供大家参考. 重要的话说在最前面,以免大家不往下看: 本篇文章是把 "整个" ppocr 模型 转成了 py ...
最新文章
- java web 哪些方法不能被从写_JAVA_WEB面试题
- 程序员需要有多懒 ?- cocos2d-x 数学函数、常用宏粗整理 - by Glede
- ORACLE SQL机能优化系列(六)
- 教你如何创建类似QQ的android弹出菜单
- Java Collections unmodifiableCollection()方法与示例
- 【BZOJ2164】采矿 树链剖分+线段树维护DP
- ARCGIS 二次开发可以参考的资源(长期更新)
- 整理2005年至2019年东盟10国GDP数据
- TypesScript + Nodejs + Express + Mongoose 实现 RESTful API 实战视频教程(33 个视频)
- [游戏安全] Unity3D游戏无意中的发现
- 同厂玩伴---鸭子兄传
- Linux下手动查杀木马
- windows install clean up
- Python爬虫-安某某客新房和二手房
- 中文检索式问答机器人模型
- 小康qq小助手 免费
- 记录一下Android开发中遇到的问题和解决方案
- 解决Could not find executable valgrind问题
- Solidworks工程图如何使用,替换图纸格式模板文件
- Spring整合其他技术
热门文章
- Linux Hook系统调用(适用基于x86_64的4.17.0以上的内核版本)
- 计算机硬件专业考公务员,这几个适合考取公务员的专业不要错过,速看!
- B3402 [Usaco2009 Open]Hide and Seek 捉迷藏 最短路
- 一个技术员工的离职成本,到底有多高?
- python中的real函数_RealPython 基础教程:Python 字符串用法详解
- 杰杰带你解读【机智云】环形缓冲区源码
- 【软件测试】日志第五天
- 卧槽!我居然把编译器整成了小霸王游戏机
- 信息系统项目时间管理案例之关键路径案例
- 关于TCP的确认、重传机制