1.模型简介

1.1关键特点
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。