专栏算法工具链YoloP精度调优部署示例

YoloP精度调优部署示例

王大象2025-01-08
174
0

1.模型简介

YOLOP(You Only Look Once for Panoptic driving perception)是一种专门为自动驾驶场景设计的多任务感知模型。它基于YOLO架构,旨在在单个网络中同时完成三个关键任务: 目标检测车道线检测分割任务。这种多任务感知能力让YOLOP在实际应用中显得更加高效和实用,特别是在需要实时处理的自动驾驶场景中。

1.1关键特点

多任务学习:YOLOP可以同时完成三个任务:目标检测、道路分割和车道线检测。相比于单独训练不同的模型,YOLOP在时间和计算资源方面显得更具效率。
基于 YOLO 架构:YOLOP继承了YOLO系列的优点,如速度快、检测精度高、能够在单次前向传播中完成目标检测任务。它通过进一步优化架构,使其能够处理更多类型的感知任务。
轻量化设计:YOLOP专注于轻量化设计,适合在移动端或嵌入式设备上运行,如自动驾驶车辆中的边缘计算设备,这对于自动驾驶场景非常关键。
高效训练:YOLOP通过共享特征提取器的方式,使得模型能够在不显著增加训练复杂度的情况下处理多个任务。该设计能够有效利用训练数据,减少对计算资源的需求。

1.2模型结构

YOLOP的模型架构是基于YOLO的,具体包括:

  • 主干网络(Backbone):用于提取图像的基本特征,类似于传统的YOLO模型,但进行了调整以适应多任务需求。
  • 检测头(Detection Head):用于执行目标检测任务,类似于YOLO中的检测机制。
  • 分割头( Segmentation Head):用于道路场景的分割任务。
  • 车道线检测头( Lane Detection Head):用于检测道路中的车道线。

1.3应用场景

YOLOP主要应用于自动驾驶领域,特别是需要实时做出决策的场景。它可以帮助车辆快速感知前方道路的情况,包括识别车辆、行人等目标,同时还能识别车道线和分割路面区域,该模型具有以下优点:

  • 实时性强:YOLOP模型的设计使其能够在边缘设备上以较低的延迟完成感知任务,满足自动驾驶场景的实时性要求。
  • 多任务融合:通过将多个任务集成到一个模型中,YOLOP不仅提高了推理速度,还减少了部署的复杂性。

YOLOP模型的设计体现了在自动驾驶场景下的需求,即希望通过一个轻量化、高效的模型来完成多种感知任务,从而增强驾驶安全性和效率。

2.ONNX模型精度验证流程迁移

2.1导出onnx

参考repo https://github.com/hustvl/YOLOP.git 中的步骤配置环境。

2.2搭建onnx评测流程

1. 准备data_loader

  • 参考lib/dataset/AutoDriveDataset.py中AutoDriveDataset和lib/dataset/bdd.py中BddDataset的实现,构建能够实现同样功能的数据集BDDValidLoader。

2. 推理过程逐步对齐结果

构建推理class BDDDetection完成模型的推理流程,整体推理流程参考torch的验证流程lib/core/function.py中validate函数。

  • 加载数据集图片并进行预处理,验证BDDValidLoader加载的图片数据跟torch val_loader加载的图片数据相同。

  • torch推理得到的输出结果与ONNX推理引擎得到的输出结果进行对比,保证结果相同。

  • 将torch输出后处理代码迁移到onnx评测流程中,保证后处理输出能够对齐。

3. 计算评价指标

  • 检测任务评价指标:将lib/core/general.py中的ap_per_class迁移到onnx流程中,计算检测任务结果。

  • 分割任务评价指标:将lib/core/evaluate.py中SegmentationMetric的实现迁移到onnx评测流程中,计算可行驶区域分割以及车道线分割指标结果。

最终得到指标与torch的计算指标基本一致,保证ONNX模型的精度跟torch评测精度对齐,至此ONNX的评测流程搭建完成。

3.校准模型精度调优

首先采用HMCT default量化,测试结果分别为det精度为0.61507(80.46%),da_seg精度为0.88863(99.84%),ll_seg精度为0.65357(100.19%),校准算法选择了percentile。

从精度结果看出,只有det分支的精度未达到99%,推断da_seg分支和ll_seg分支以及公共的backbone部分存在敏感节点的可能性较小,后续调优需重点关注det分支上的敏感节点。

3.1 INT16精度调试

3.1.1 全INT16精度

设置模型all_node_type为INT16,校准模型精度分别为det 0.75890(99.27%),da_seg 0.88950(99.93%),ll_seg 0.64821(99.37%),校准算法选择了percentile。全INT16精度能够满足要求,可以使用INT8+INT16混合精度完成调优。

3.1.2 INT8+INT16混合精度调试

通过分析模型结构设置高精度节点

根据上述量化模型精度分析可得,HMCT default量化模型只有det任务精度不满足99%,而全INT16精度测试说明使用INT16精度可以满足精度要求,因此将det分支head部分算子精度设为INT16,测试模型精度。该量化配置以Conv_559、Conv_707、Conv_855算子作为子图输入,Concat_1003作为子图输出,将子图中包含的节点配置为INT16。

由测试结果可得,det分支精度恢复为 0.76275(99.77%)、其余两个分支精度保持不变,分别为 0.88863(99.84%)0.65357(100.19%)。

4. 部署到J6过程

4.1编译及perf

算法工具链
官方教程
评论0
0/1000