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

HybridNets精度调优部署示例

王大象2025-01-08
168
0

1. 模型简介

HybridNets 是一种针对自动驾驶场景开发的多任务深度学习模型。它能够同时处理多个任务,包括目标检测、图像分割和车道线检测。该模型是基于高效的EfficientNet主干网络构建的,目的是在提高精度的同时保持较低的计算成本和资源消耗。HybridNets 尤其适用于资源有限的嵌入式设备或实时应用场景。

1.1 关键特点

多任务学习
  • 目标检测:检测场景中的车辆、行人、交通标志等目标。
  • 实例分割:对目标进行像素级分割。
  • 车道线检测:检测道路中的车道线,特别适用于自动驾驶车辆的路径规划。
EfficientNet 主干网络:HybridNets 使用了 EfficientNet 作为主干网络。EfficientNet 是一个高度优化的卷积神经网络,能够以较少的参数和较低的计算开销实现较高的性能。EfficientNet 使用了一种复合缩放方法,通过同时缩放网络的深度、宽度和分辨率,来最大化模型的效率和性能。
轻量化和高效性:HybridNets 设计时考虑到了计算资源的限制,特别是为了在边缘设备上运行。它的计算开销较低,能够在嵌入式硬件上实现实时推理,适合自动驾驶系统中使用。

1.2模型结构

主干网络 (Backbone):HybridNets采用的是基于EfficientNet的主干网络。EfficientNet系列是一种通过复合缩放方法(Compound Scaling)来平衡模型的深度、宽度和分辨率的卷积神经网络架构。
特征金字塔网络 (BiFPN):在主干网络之后,HybridNets引入了BiFPN(Bi-directional Feature Pyramid Network)作为特征融合模块。BiFPN是一种增强版的特征金字塔网络,具有双向的信息流动能力,可以在不同的特征层之间高效地融合信息。这有助于模型同时关注不同尺度的特征,从而更好地进行多任务的学习,如目标检测和实例分割。
多任务头部 (Task-Specific Heads):HybridNets在网络的顶部使用了多任务头部,这些头部模块专门针对不同的任务进行优化。主要包括:
  • 目标检测头 (Object Detection Head):用于检测不同的物体类别,并预测物体的边界框。
  • 语义分割 头 (Semantic Segmentation Head):用于分割不同类别的区域,例如道路、行人和车辆等。
  • 驾驶辅助任务头 (Auxiliary Driving Head):针对与自动驾驶相关的特定任务,如车道线检测等。

1.3 应用场景

HybridNets 在自动驾驶中有很大的应用潜力,能够通过多任务学习同时进行目标检测、语义分割和车道线检测,有助于提高自动驾驶系统的感知能力。该模型具有以下优势:

  • 高效性:使用 EfficientNet 提供了较好的性能与效率平衡,适合在资源有限的设备上运行。
  • 多任务能力:通过同时处理检测、分割和车道线检测,减少了模型冗余,节省了硬件资源。
  • 易于部署:由于其轻量级和高效性,HybridNets 可以较为轻松地部署在边缘设备和实时应用中。

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

参考repo https://github.com/datvuthanh/HybridNets 中的步骤配置环境。

2.2搭建onnx评测流程

1. 准备data_loader

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

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

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

  • 加载数据集图片及预处理后对齐,torch加载的图片数据跟自己构建的数据集加载的图片数据确保相同。

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

  • 将torch输出后处理代码迁移到onnx评测流程中,保证送入计算评测指标前的输出能够对齐。

3. metric评测

  • 将utils/smp_metrics.py中的计算评价指标的函数迁移到onnx评测流程中,计算目标检测、可行驶区域分割以及车道线分割的指标结果,保证指标计算过程与torch的计算指标结果基本对齐,最终保证ONNX模型的精度跟torch评测精度对齐,至此ONNX的评测流程搭建完成。

3. 校准模型精度调优

首先采用HMCT default量化,测试结果分别为det精度为0.75562(97.85%),da_seg精度为0.89675(99.12%),ll_seg精度为0.81813(95.83%),校准算法选择了percentile。

3.1 INT16精度调试

3.1.1 全INT16精度

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

3.1.2 INT8+INT16混合精度调试

根据debug工具敏感度排序设置高精度节点

全INT16校准模型精度能够达标,校准算法选择了percentile,尝试基于采用percentile校准算法的INT8 calibrated model开始调优,计算节点敏感度,按敏感度排序将敏感节点依次设置为高精度来提升模型精度。

 

将敏感度阈值小于等于0.99994的敏感节点设为INT16节点,det输出精度为0.76811(99.47%)、da_seg输出精度为0.90344(99.86%)、ll_seg输出精度为0.84528(99.01%)

 

4. 部署到J6过程

4.1 编译及perf

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