Skip to content

Latest commit

 

History

History
384 lines (265 loc) · 14.3 KB

File metadata and controls

384 lines (265 loc) · 14.3 KB

1 项目说明

近几年,随着自动驾驶、车路协同等概念的日益火热,地图厂商、传统汽车厂商以及有互联网背景的“造车新势力”纷纷加入了智能升级的探索之路。为了使智能驾驶更安全更可靠,实现高精度、实时感知周围环境的技术至关重要,该技术不仅可以精准快速地识别车道线、行驶区域、行人、车辆等,而且将车辆行驶路线“画”在地面,为驾驶人员提供车距监测、行人预警、车道偏离提醒和红绿灯提醒等一系列安全辅助功能,助力驾驶系统进行高效的决策。

但在真实产业中,要实现高精度的驾驶环境感知不是一件容易的事,在实际的路况中存在着各种各样的问题:

  • 摄像头采集到的图像会受到树木、建筑遮挡以及车辆移动的影响;
  • 天气多种多样,要适应白天、黑夜、雾天和雨天等;
  • 车道线磨损程度不一,且不同区域的车道线新旧对识别也有很大的影响。

针对上述场景,本次飞桨产业实践范例库基于真实场景中的车载影像数据,推出了目标检测和车道线分割多任务处理的智能驾驶感知实践示例,提供从数据准备、技术方案、模型训练优化,到模型部署的全流程可复用方案,有效解决了不同光照、不同天气等室外复杂环境下的目标识别问题,适用于AR地图导航、机器人教育、厂区自动巡检、自动驾驶等多个产业应用。

方案难点

  • 多任务运算: 交通目标检测与车道线分割同时进行,相对于单一任务来说需要更多的算力和后处理方法;
  • 精度与速度的均衡: 原有的解决方案在V100上进行处理,本项目要将方案部署到手机端,需要在尽可能少减低精度的同时保证实时性;
  • 跨平台迁移: 将PaddleDetection和PaddleSeg中的模型转换到PaddleLite中,并部署到Android手机端,涉及到Python向C++与JAVA结合的工程落地;
  • 端侧运行: 成果最终以app的形式在手机中进行展示,并能够调用手机摄像头进行检测与分割,是一个完整的应用软件。

2 安装说明

环境要求

PaddlePaddle == 2.2.1
Python == 3.7
PaddleDetection == 2.1
PaddleSeg == 2.1

首先从gitee或者github上下载PaddleDetection和PaddleSeg

git clone https://gitee.com/PaddlePaddle/PaddleDetection.git -b release/2.1
git clone https://gitee.com/paddlepaddle/PaddleSeg.git -b release/2.1

安装相关依赖

pip install paddledet==2.1.0 -i https://mirror.baidu.com/pypi/simple
pip install paddleseg -i https://mirror.baidu.com/pypi/simple

3 数据准备

本范例使用数据集为2021大数据竞赛全部训练集,是百度地图提供的真实业务场景数据,共有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
     ]
    ]
   }
 ]

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

6 分割模型训练及参数优化

  • 调整模型分辨率:
    1024 (w) * 1024(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]
    

7 服务器端GPU模型推理部署及优化

【基础版】Pipeline部署推理

为了尽可能简单实现全流程,首先使用串行的流程进行处理:

【优化版】Pipeline部署推理

为了让两个任务能够尽可能达到最好的效率,做了如下多进程异步的设计:

【推理结果】结果示例

示例1:

示例2:

8 PaddleLite环境配置及模型转换

# 安装paddle_lite_opt工具
!pip install paddlelite

# 基于前面export model的步骤,对模型再一次进行PaddleLite格式的转化
!cd /home/aistudio/work/model/

# 首先转换检测模型
!paddle_lite_opt --model_file=ppyolov2_r50vd_dcn_optimize/model.pdmodel --param_file=ppyolov2_r50vd_dcn_optimize/model.pdiparams --optimize_out=ppyolov2_r50vd_dcn_optimize

# 然后转换语义分割模型
!paddle_lite_opt --model_file=hardnet/model.pdmodel --param_file=hardnet/model.pdiparams --optimize_out=hardnet

9 安卓手机联调及推理部署

【1】准备一台arm8的安卓手机,这里我使用了一台性能中上等的国产安卓手机

 

【2】电脑上安装ADB工具,用于调试。 ADB安装方式如下:

2.1. MAC电脑安装ADB:

```shell
brew cask install android-platform-tools
```
2.2. Linux安装ADB
```shell
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
744be294    device

9.1 检测模型部署

  1. 准备优化后的模型、预测库文件、测试图像和类别映射文件。
cd /home/aistudio/work/PaddleDetection/
cd deploy/lite/

# 将预测库文件、测试图像和使用的类别字典文件放置在预测库中的demo/cxx/detection文件夹下
inference_lite_path=/home/aistudio/work/PaddleDetection/deploy/lite/inference_lite_lib.android.armv8.clang.c++_static.with_extra/
mkdir -p  $inference_lite_path/demo/cxx/detection/debug/
cp /home/aistudio/work/model/ppyolov2_r50vd_dcn_optimize.nb $inference_lite_path/demo/cxx/detection/debug/
cp  ./yidaiyilu_label_list.txt  $inference_lite_path/demo/cxx/detection/debug/
cp Makefile run_detection.cc  $inference_lite_path/demo/cxx/detection/
cp ./config_ppyolov2_optimize.txt  $inference_lite_path/demo/cxx/detection/debug/
cp ../../demo/000000014439.jpg  $inference_lite_path/demo/cxx/detection/debug/
cp $inference_lite_path/cxx/lib/libpaddle_light_api_shared.so $inference_lite_path/demo/cxx/detection/debug/

执行完成后,detection文件夹下将有如下文件格式:

demo/cxx/detection/
|-- debug/
|   |--ppyolov2_r50vd_dcn_optimize.nb      优化后的检测器模型文件
|   |--000000014439.jpg                待测试图像
|   |--yidaiyilu_label_list.txt           类别映射文件
|   |--libpaddle_light_api_shared.so       C++预测库文件
|   |--config_ppyolov2_optimize.txt        检测模型预测超参数配置
|-- run_detection.cc                   目标检测代码文件
|-- Makefile                         编译文件
  1. 启动调试,上述步骤完成后就可以使用ADB将文件夹 debug/ push到手机上运行,步骤如下:
# 执行编译,得到可执行文件detect_system
# 如果是编译armv7的执行程序,需要使用 Makefile_armv7 替换 Makefile 文件
make

# 将编译得到的可执行文件移动到debug文件夹中
mv detect_system ./debug/

# 将上述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

# detect_system可执行文件的使用方式为:
# ./detect_system 配置文件路径  测试图像路径
./detect_system ./config_ppyolov2_optimize.txt ./000000014439.jpg

9.2 安卓手机app部署及视频流实时检测

【目的】

将基于 Paddle Lite 预测库的 Android APP 部署到手机,实现物体检测

 

【需要的环境】

Android Studio、Android 手机(开启 USB 调试模式)、下载到本地的 Paddle Lite Demo 工程

 

【预先要求】

如果您的 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安装

 

【运行效果】