1 项目说明
实时环境感知是智能驾驶系统的重要组成部分。基于车载影像的目标检测和分割具有很高的价值,既能够辅助驾驶系统进行高效的决策,同时结合终端渲染与语音技术,也能够为用户带来更为智能精准的导航体验(比如AR导航)。
在GPU运行的基础上,迁移到基于Paddelite的Android手机端进行部署,并可以调用手机摄像头进行实时检测与分割,可以作为一个示例版的AR导航。
希望通过本项目解决方案中的模型选择、性能优化、训练方法等介绍,能够为广大开发者提供由服务器端到手机端的优化和部署思路。本项目提供训练、服务器端预测、PaddleLite预测、Android端部署。
方案难点:
多任务运算: 交通目标检测与车道线分割同时进行,相对于单一任务来说需要更多的算力和后处理方法;
精度与速度的均衡: 原有的解决方案在V100上进行处理,本项目要将方案部署到手机端,需要在尽可能少减低精度的同时保证实时性;
跨平台迁移: 将PaddleDetection和PaddleSeg中的模型转换到PaddleLite中,并部署到Android手机端,涉及到Python向C++与JAVA结合的工程落地;
端侧运行: 成果最终以app的形式在手机中进行展示,并能够调用手机摄像头进行检测与分割,是一个完整的应用软件。
##如需更多技术交流与合作,欢迎扫码加入交流群
3月17日晚20:30,我们将在线分享驾驶环境感知开发全流程的优化策略和避坑指南,30分钟直达产业项目落地!
欢迎大家扫码报名直播课,如有更多技术交流与合作,也欢迎大家扫码进群。
2 安装说明
环境要求
PaddlePaddle == 2.2.1 Python == 3.7 PaddleDetection == 2.1 PaddleSeg == 2.1 PaddleLite == 2.10
首先从gitee上下载PaddleDetection和PaddleSeg
此步骤已经完成,在此基线环境内,不需要再次进行
%cd work/ !git clone https://gitee.com/PaddlePaddle/PaddleDetection.git -b release/2.1 !git clone https://gitee.com/paddlepaddle/PaddleSeg.git -b release/2.1 !git clone https://github.com/PaddlePaddle/Paddle-Lite.git -b release/v2.10
查看一下是否下载成功
!ls /home/aistudio/work
#在AIStudio环境中安装相关依赖
#关于paddledet部分请注意!!! 由于我们源码中对模型结构做了修改,所以不要安装paddledet,直接使用源码即可
%cd /home/aistudio/work/
!unzip -d . PaddleDetection.zip
!unzip -d . PaddleSeg.zip
%cd /home/aistudio/work/PaddleDetection/
!pip install -r requirements.txt
!python setup.py install
#安装好上面的部分,paddleseg的依赖库也就都安装好了
3 数据准备
本案例使用数据集为2021 IKCEST第三届“一带一路”国际大数据竞赛暨第七届百度&西安交大大数据竞赛全部训练集,共有16000张图片,使用json格式进行了标注:其中17类采用矩形检测框标注方法,810类采用分割连通域标注方法.
具体分类标准如下
数据存储说明
每个图像文件均对应一个同名的JSON文件,全部数据集格式为:
train,全部数据文件夹
image,存放全部图片
00001.jpg 00002.jpg ...... 16000.jpg
label,存放全部JSON文件
00001.json 00002.json ...... 16000.json
JSON文件格式说明
JSON文件以字典的形式保存每个检测目标或分割区域的信息,示例如下:
[ { "type": 1, 类别 "x": 766, bbox左上角点x "y": 384, bbox左上角点y "width": 53, bbox宽度 "height": 45, bbox高度 "segmentation": [] 多边形点信息,检测目标为空 }, { "type": 8, "x": -1, "y": -1, "width": -1, "height": -1, "segmentation": [ 多边形点信息,每两个数字组成一个点的位置,顺序为x,y [ 380.311, 623.614, 358.423, 638.089, 390.173, 634.197, 389.122, 633.179 ] ] } ] ```# 首先数据存放在里/home/aistudio/data/data97737/中 # 首先需要进行数据解压缩 %cd /home/aistudio/data/data97737/ !pwd !unzip -d . detection.zip
4.模型选择
本项目不仅仅是提供一个完整的开发过程,也将对模型选择、优化思路进行说明。
模型上选择的几个思考点
场景真:本项目中数据为真实交通场景,所以模型特征提取能力和泛化能力要强
任务多:同时解决检测和分割两个任务,选模型和优化时要权衡精度与速度两方面。
效率高:模型要尽量小、训练与预测速度要尽量快、且能够在平台上稳定运行
检测模型的选择
如上图所示,第一阶段先选择PPYOLOV2-R50vd来作为检测基准模型。
分割模型的选择
如上图所示,第一阶段先选择HarDNet来作为检测基准模型。## 5 检测模型训练、参数优化和消融实验
* 调整模型分辨率:
608 (w) * 608(h) -> 480(w) * 480(h),训练采用多尺度
* 调整训练超参数:
8卡V100 32GB BS12 Lr0.01 -> 1卡V100 32GB BS 6 Lr0.002 COCO 80类,训练365轮 -> BIGDATA 7类,先验性强,训练40轮
* 数据增强调整:
RandomDistort – hue、saturation、contrast、brightness范围缩小到[0.8, 1.2] RandomExpand – ratio从4.0降到1.5 RandomCrop – aspect_ratio调整到[0.8, 1.3],scaling[0.7, 1.0] RandomResize – [384, 384] 到 [544, 544],随机缩放算法 Mixup – 训练第36轮后取消Mixup用于提高检出结果的可靠性
* PAN结构优化:
* 检测头Decoupled Head复现:
Note: 在复现过程中,考虑到性能问题,删除了图中红色框部分的卷积层,可以将模型有效的缩小
* 模型优化消融实验:
模型及方法 | MAP @0.5 | 服务器预测帧率 FPS | 模型占用空间大小 |
---|---|---|---|
PPYOLOV2-R50 | 0.81 | 52 | 240MB |
+ 分辨率480 * 480 | 0.72 (-0.09) | 78 | 239MB |
+ 先验性数据增强 | 0.73 (+0.01) | 78 | 239MB |
+ DCN位置调整 | 0.75 (+0.02) | 75 | 242MB |
+ Reduced PAN | 0.75 (+0.00) | 86 | 188MB |
+ Decoupled Head | 0.77 (+0.02) | 83 | 195MB |
#新的配置文件命名为yidaiyilu.yml,存放路径为:PaddleDetection/configs/datasets/yidaiyilu.yml
!ls /home/aistudio/work/PaddleDetection/configs/datasets
#检测模型使用ppyolov2,在PaddleDetection/configs/yidaiyilu/路径下,已经写好了针对本次工程优化好的的ppyolov2_r50vd_dcn_optimize.yml
!ls /home/aistudio/work/PaddleDetection/configs/yidaiyilu/# 进入到PaddleDetection目录下
! pwd
%cd /home/aistudio/work/PaddleDetection
#下面使用已经写好的配置文件
!python -m paddle.distributed.launch --gpus 0 tools/train.py -c configs/yidaiyilu/ppyolov2_r50vd_dcn_optimize.yml --eval
6 分割模型训练及参数优化
*调整模型分辨率:
608 (w) * 608(h) -> 480(w) * 480(h),训练采用多尺度(保持跟检测模型一样的分辨率)
*调整训练超参数:
1卡V100 32GB BS 4 Lr0.002 BIGDATA 3类,先验性强,训练10轮
*数据增强调整:
RandomBlur – prob 0.4 RandomHrizontalFlip – prob 0.5 RandomCrop – aspect_ratio调整到[0.8, 1.3],scaling[0.7, 1.0] RandomDistort – hue、saturation、contrast、brightness范围缩小到[0.8, 1.2] ```# 首先进入到PaddleSeg环境中 %cd /home/aistudio/work/PaddleSeg/ !ls# # 数据已经为我们提供好了train_list.txt和val_list.txt的文件, # 新的配置文件命名为bigdata2021.yml,存放路径为:PaddleSeg/configs/_base_/bigdata2021.yml !ls /home/aistudio/work/PaddleSeg/configs/_base_/ # 语义分割模型使用hardnet,在PaddleSeg/configs/hardnet/路径下,已经写好了针对本次比赛的ydyl_hardnet.yml !ls /home/aistudio/work/PaddleSeg/configs/hardnet/# 下面使用已经写好的配置文件,开始训练 !python -m paddle.distributed.launch train.py --config configs/hardnet/hardnet_ydyl.yml --do_eval --save_interval 1212
7 模型导出
在模型训练过程中保存的模型文件是包含前向预测和反向传播的过程,在实际部署则不需要反向传播,因此需要将模型进行导成部署需要的模型格式。
执行下面命令,即可导出模型#
检测训练完成后,模型将会被保存在output/ppyolov2_r50vd_dcn_optimize/中,根据eval的效果,会保存出best_model.pdparams,这里使用这个模型进行静态图转换
%cd ~/work/PaddleDetection/
!python tools/export_model.py -c
configs/yidaiyilu/ppyolov2_r50vd_dcn_optimize.yml -o
weights=output/ppyolov2_r50vd_dcn_optimize/best_model.pdparams#
分割训练完成后,模型将会被保存在output/中,根据eval的效果,会保存出best_model.pdparams,这里使用这个模型进行静态图转换
%cd ~/work/PaddleSeg/
!python export.py --config configs/hardnet/hardnet_ydyl.yml --model_path output/best_model/model.pdparams# 转换好之后将两个都保存到一起
!cp -r ~/work/PaddleDetection/output_inference/ppyolov2_r50vd_dcn_optimize/* ~/work/PaddlePrediction/model/detection/
!cp -r ~/work/PaddleSeg/output/model* ~/work/PaddlePrediction/model/segmentation/
!cp -r ~/work/PaddleSeg/output/deploy* ~/work/PaddlePrediction/model/segmentation/
8 服务器端GPU模型推理部署及优化
【基础版】Pipeline部署推理
为了尽可能简单实现全流程,首先使用串行的流程进行处理:
【优化版】Pipeline部署推理
为了让两个任务能够尽可能达到最好的效率,做了如下多进程异步的设计:
【推理结果】结果示例
示例1:
示例2:
#最后准备predict.py脚本进行预测(这里predict.py脚本已经写好,其中默认使用的模型就是model下面的模型
#predict.py脚本是根据paddledetection/deploy/python/infer.py和PaddleSeg/deploy/python/infer.py修改合成而来,仅供参考
#【1】模型保存 PaddlePrediction/model/
#【2】预测数据 PaddlePrediction/demo_data/
#【3】文件列表 PaddlePrediction/data.txt
#【4】预测脚本 PaddlePrediction/predict.py
%cd /home/aistudio/work/PaddlePrediction/
!python predict.py
9 PaddleLite转化及推理部署
#安装paddle_lite_opt工具
!pip install paddlelite -i https://mirror.baidu.com/pypi/simple
#基于前面export model的步骤,对模型再一次进行PaddleLite格式的转化
%cd /home/aistudio/work/PaddlePrediction/model/
#首先转换检测模型
!paddle_lite_opt --model_file=detection/model.pdmodel --param_file=detection/model.pdiparams --optimize_out=detection
#然后转换语义分割模型
!paddle_lite_opt --model_file=segmentation/model.pdmodel --param_file=segmentation/model.pdiparams --optimize_out=segmentation
10 安卓手机及部署工具准备
【1】准备一台安卓手机,这里我使用的是一台性能还不错的国产某品牌的手机
<left></left>
<right></right>
【2】电脑上安装ADB工具,用于调试。 ADB安装方式如下:
2.1. MAC电脑安装ADB: brew cask install android-platform-tools 2.2. Linux安装ADB sudo apt update sudo apt install -y wget adb 2.3. Window安装ADB win上安装需要去谷歌的安卓平台下载ADB软件包进行安装:[链接](https://developer.android.com/studio)
【3】手机连接电脑后,开启手机USB调试
选项,选择文件传输
模式,在电脑终端中输入:
对于我使用的手机来说,进入此模式的操作为:《更多设置》 - 《开发者选项》 - 《开启开发者选项》
adb devices
如果有device输出,则表示安装成功,如下所示是我的手机设备的输出结果:
List of devices attached 84405701 unauthorized
11 在安卓手机中部署可执行的工程
【1】将所需要的文件整合到一个目录下
#将预测库文件、测试图像和使用的类别字典文件放置在预测库中的demo/cxx/detection文件夹下 A. 预测库文件夹:/home/aistudio/work/PaddleDetection/deploy/lite/inference_lite_lib.android.armv8.clang.c++_static.with_extra/ B. 模型文件夹: /home/aistudio/work/PaddlePrediction/model/ C. 编译和demo脚本:Makefile run_detection.cc D. demo图片:/home/aistudio/work/PaddlePrediction/demo_data/ ```%cd /home/aistudio/work/PaddleLiteAndroid/inference_lite_lib.android.armv8.clang.c++_static.with_extra/demo/cxx/traffic_demo/debug/ !cp /home/aistudio/work/PaddlePrediction/model/detection.nb . !cp /home/aistudio/work/PaddlePrediction/model/segmentation.nb . !cp /home/aistudio/work/PaddlePrediction/demo_data/001.png .**【2】 执行完成后,traffic_demo文件夹下将有如下文件格式:**
demo/cxx/traffic_demo/
|-- debug/
| |–detection.nb 优化后的检测器模型文件
| |–segmentation.nb 优化后的分割器模型文件
| |–001.png 待测试图像
| |–ydyl_label_list.txt 类别映射文件
| |–libpaddle_light_api_shared.so C++预测库文件
| |–config_ppyolov2_optimize.txt 检测模型预测超参数配置
|-- run_detection.cc 目标检测代码文件
|-- Makefile 编译文件
注意!此步骤需要在PC上进行,因为aistudio没有root权限,所以交叉编译的环境不能搭建
**我本人使用的是ubuntu18.04的环境来进行的此项工作,首先准备交叉编译环境**
#1. 安装 gcc g++ git make wget python unzip adb curl 等基础软件
apt update
apt-get install -y --no-install-recommends
gcc g++ git make wget python unzip adb curl
#2. 安装 jdk
apt-get install -y default-jdk
#3. 安装 CMake,以下命令以 3.10.3 版本为例,其他版本步骤类似。
wget -c https://mms-res.cdn.bcebos.com/cmake-3.10.3-Linux-x86_64.tar.gz &&
tar xzf cmake-3.10.3-Linux-x86_64.tar.gz &&
mv cmake-3.10.3-Linux-x86_64 /opt/cmake-3.10 &&
ln -s /opt/cmake-3.10/bin/cmake /usr/bin/cmake &&
ln -s /opt/cmake-3.10/bin/ccmake /usr/bin/ccmake
#4. 下载 linux-x86_64 版本的 Android NDK,以下命令以 r21c 版本为例,其他版本步骤类似。
cd /tmp && curl -O https://dl.google.com/android/repository/android-ndk-r21c-linux-x86_64.zip
cd /opt && unzip /tmp/android-ndk-r21c-linux-x86_64.zip
#5. 添加环境变量 NDK_ROOT 指向 Android NDK 的安装路径
echo “export NDK_ROOT=/opt/android-ndk-r21c” >> ~/.bashrc
source ~/.bashrc
**执行交叉编译,并使用ADB将文件夹 `debug/` push到手机上运行,步骤如下:**
[1] 首先将PaddleLiteAndroid整个文件夹保存到PC机中,然后进入到指定目录中
cd PaddleLiteAndroid/inference_lite_lib.android.armv8.clang.c++_static.with_extra/demo/cxx/traffic_demo/
[2] 执行编译,得到可执行文件detect_system
make
[3] 将编译得到的可执行文件移动到debug文件夹中
mv detect_system ./debug/
**debug文件夹中的内容【编译好的debug文件夹已经保存在PaddleLiteAndroid文件夹中,可以直接使用】** ![](https://ai-studio-static-online.cdn.bcebos.com/b810c3d549f243cfbdc9c7eb6571b540dc67735bf46a4201a62fc12265c7cae8)
[4] 将上述debug文件夹push到手机上
adb push debug /data/local/tmp/ adb shell cd /data/local/tmp/debug export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH chmod a+x detect_system
![](https://ai-studio-static-online.cdn.bcebos.com/350873a8b02e4270a9f2c0490e61e9c9ca5fa8d2bb7b4573b5cec75a57fcc2e4)
[5] detect_system可执行文件的使用方式为:
./detect_system ./config_ppyolov2_optimize.txt ./001.png
![](https://ai-studio-static-online.cdn.bcebos.com/996aa4b57f7441669d82fa9e835316f143ff3e44b98d4306ac485e195817fdc4) **在不限定输出阈值的情况下,检测结果如下**
[6] 将预测结果取出:
adb pull /data/local/tmp/debug/_result.jpg C:\Users\zhaoguiping\Desktop\debug
![](https://ai-studio-static-online.cdn.bcebos.com/ab05d327029a48658b845015f95d35d2938f5ad918d84966b83728a04c920003)
12 安卓手机APP部署及demo
【目的】:
将基于 Paddle Lite 预测库的 Android APP 部署到手机,实现物体检测
【需要的环境】:
Android Studio、Android 手机(开启 USB 调试模式)、下载到本地的预测工程
【预先要求】:
如果您的 Android Studio 尚未配置 NDK ,请根据 Android Studio 用户指南中的安装及配置 NDK 和 CMake 内容,预先配置好 NDK 。您可以选择最新的 NDK 版本,或者与 Linux x86 环境下编译适用于 Android 的库、macOS 环境下编译适用于 Android 的库 两个章节中的 NDK 版本保持一致。
【部署代码结构介绍】:
【Android Studio使用说明及编译方法】
Android Studio使用说明及编译方法参见官方提供的样例
【APK安装】
APK已经编译完成,可以下载工程中的lanedetection.apk进行安装。安装方法有: 1. 使用Android Studio安装 2. 使用adb install安装
【运行效果】
<left></left>
<right></right>