专栏算法工具链【地平线工具链参考算法|J6|HEAL】FCOS3D_v3.0

【地平线工具链参考算法|J6|HEAL】FCOS3D_v3.0

芯链情报局2026-08-25
16
0

该示例为参考算法,仅作为在 J6 上模型部署的设计参考,非量产算法

性能精度指标

fcos3d模型配置:

数据集

Input shape

Backbone

Neck

Head

NuScenes

1x3x512x896

efficientnetb0

BiFPN

FCOS3DHead

性能精度表现:

浮点/量化精度

J6M Latency

J6M FPS

mAP

NDS

0.2130/0.2097

0.3059/0.3023

1.89

652.39

注:Nuscenes 数据集官方介绍:nuScenes

模型介绍

Fcos3d是在fcos基础上进行改进的一种anchor-free的单目3D目标检测算法,将通常定义的7-DoF 3D目标转换到图像域,并将它们解耦为2D和3D属性。考虑到目标的二维比例,将目标分布到不同的特征级别,并仅根据三维中心进行进一步分配。此外,利用基于3D中心的2D高斯分布来重新定义中心度,以拟合3D目标公式。所有这些都使该框架简单而有效,消除了任何2D检测或2D-3D对应先验。在NeurIPS 2020的nuScenes 3D检测挑战中,fcos3d算法在所有纯视觉方法中排名第一。

模型优化点

相对于官方实现,地平线对fcos3d做了如下优化:

  • 将模型的backbone替换为与地平线硬件更为友好的efficientnetb0,提升了模型的性能;

  • neck网络优化为bifpn,这种重复双向跨尺度连接+ 带权重的特征融合机制,实现了更高层次的特征融合;

  • 检测头中的卷积运算使用深度可分离卷积,大幅优化了模型的性能;

源码说明

Config文件

configs/fcos3d_efficientnetb0_nuscenes/ 为该模型的配置文件,定义了模型结构、数据集加载,和整套训练流程等。配置文件主要内容包括:

注: 如果需要复现精度,config中的训练策略最好不要修改,否则可能会有意外的训练情况出现。

image encoder

Image encoder是对图像进行特征提取和融合。fcos3d参考算法通过backbone(efficientnetb0)和neck(BiFPN)提取图像的多尺度特征。网络结构如下图所示:

backbone

fcos3d参考算法采用与硬件比较友好的efficientnetb0作为backbone来提取图像多尺度特征,实现了性能的提升。

代码路径:heal/models/backbones/efficientnet.py
neck

fcos3d用于多级分支构造的neck采用的是bifpn,是用于检测不同尺度目标的主要组件,其特性可以总结为重复双向跨尺度连接+ 加权特征融合机制。bifpn将每个双向路径(自顶向下和自底而上)作为一个特征网络层,并重复同一层多次,以实现更高层次的特征融合;另外,不同的输入 featuremap 具有不同的分辨率,它们对融合输入 featuremap 的贡献也是不同的,因此简单的对他们进行相加或叠加处理并不是最佳的操作,所以bifpn实现了简单而高效的加权特征融合的机制。

代码路径:heal/models/base_modules/bifpn.py

FCOS3DHead

fcos3d不同级别的图像特征使用共享的检测头,首先通过efficientnetb0+bifpn网络提取多尺度特征,将目标分配到不同的特征级别和不同的点;然后多尺度特征通过4个共享深度可分离卷积block和small heads回归到不同的目标(如下图所示),这种为具有不同测量值的回归目标建立额外的解耦头的做法更加有效。

FCOS3DHead回归目标包括以下部分:

cls_score

分类分数



bbox_pred

$$\Delta x,\Delta y ,log(d$$

2.5D中心到特定前景点的偏移∆x,∆y、 以及其相应的深度d

$$W,H,L,\thet$$

回归框尺寸和旋转角度

$$v_x,v_$$

回归速度

dir_cls_pred

$$C_{\theta$$

即2-bin direction classification,考虑相反方向的目标具有相同的 $$sin(\theta$$值

attr_pred

属性预测

centerness

$$$$

即3D Center-ness,它作为一个softmax二分类器来确定哪些点更靠近中心,并有助于抑制那些远离目标中心的低质量预测

代码路径:heal/models/task_modules/fcos3d/head.py

FCOS3DTarget

FCOS3DTarget的作用是在训练阶段生成分类/回归目标用于loss计算,包括labels_3d, bbox_targets_3d, centerness_targets 和 attr_targets。

points获取

与基于锚的检测器通过将预定义的锚框作为参考来回归目标不同,fcos3d作为anchor-free的目标检测范式,通过特征图上的每个点来预测目标,该点对应于原始输入图像上均匀分布的点。fcos3d是通过特征图的尺寸和stride的计算获得points,对于特征图$$F_$$上的每个位置(x,y),假设直到第i层的总stride是s,那么原始图像上的相应points位置应该是:

$$(sx+\left \lfloor \frac{s}{2} \right \rfloor,sy+\left \lfloor \frac{s}{2} \right \rfloor$$

对应代码:

代码路径:heal/models/task_modules/fcos/target.py
centerness计算

由于fcos3d的回归目标改为基于3D中心的范式,通过以投影的3D中心为原点的2D高斯分布来定义centerness。二维高斯分布简化为:

$$c=e^{-\alpha((\Delta x)^2+(\Delta y)^2)$$

这里,$$\alph$$用于调整从中心到外围的强度衰减,并设置为2.5。fcos3d将c作为centerness的groundtruth,并从回归分支对其进行预测,以便稍后过滤低质量的预测。

对应代码:

代码路径:heal/models/task_modules/fcos3d/target.py

FCOS3DTarget的forward代码为:

Loss

获取到labels_3d, bbox_targets_3d,centerness_targets, attr_targets等分类回归groundtruth后,需要在训练阶段进行loss的计算。fcos3d参考算法的损失定义与公版一致,对于分类和不同的回归目标,分别定义它们的损失,损失函数的设置在config文件中:

loss计算代码路径:heal/models/task_modules/fcos3d/loss.py

PostProcess

fcos3d的3D边界框的回归采用了比较简单的方法,即把通常定义的7-DoF(3D bbox中心、尺寸和偏转角)回归目标转换为2.5D中心和3D尺寸。通过相机固有矩阵,可以将2.5D中心转换回3D空间,因此,对2.5D中心进行回归可以进一步简化为对从中心到特定前景点的偏移量∆x、∆y及其相应深度d进行回归。所以,在获取到回归目标后,在后处理阶段进行了坐标转换和非极大值抑制(Non-Maximum Suppression,NMS)等操作,将class score和centerness相乘作为每个预测的置信度,并在鸟瞰图中作为大多数3D检测器进行旋转的NMS,以获得最终结果。

坐标转换

fcos3d的后处理阶段是根据分类分数cls_score和centerness的乘积来筛选3d bbox的,对乘积的结果进行降序排列后,选择前100个作为我们需要的bbox,流程如下图所示:

相关代码如下所示:

代码路径:heal/models/task_modules/fcos3d/post_process.py
非极大值抑制

fcos3d通过计算投影的3D边界框的外部矩形来生成2D边界框,然后,在鸟瞰图中作为大多数3D检测器进行旋转的非最大值抑制,以获得最终结果。相关代码如下所示:

代码路径:heal/core/nms/box3d_nms.py

forward代码为:

代码路径:heal/models/task_modules/fcos3d/post_process.py

总结与建议

训练建议

  • 浮点训练使用 AdamW 优化器,float_lr=2e-4、weight_decay=0.01、float_epochs=48。

  • 量化采用 Calibration + QAT 流程:calibration_step=100;QAT 阶段 lr 降至 qat_lr=1e-6、qat_epochs=10。

  • 量化配置采用 QconfigSetter + q_templates,其中 MatmulDtypeTemplate 配置为 [qint8, qint16] 的混合精度;calibration 阶段 reference observer 为 MSEObserver,QAT 阶段为 MinMaxObserver(fix_scale),二者均开启 EqualizeInOutScaleTemplate 优化以保证 calib 与 qat 构图一致。

部署建议

  • backbone 建议选用与 J6 硬件较为友好的 efficientnetb0,neck 采用 BiFPN 的重复双向跨尺度连接 + 加权特征融合机制,可提升多尺度特征融合效果。

  • 检测头中的卷积运算使用深度可分离卷积,可大幅优化模型性能。

  • 后处理将 7-DoF 3D 目标解耦为 2.5D 中心 + 3D 尺寸,通过相机内参矩阵完成坐标转换,并在 BEV 视角下进行旋转 NMS,部署时注意内参与 NMS 阈值的配置。

附录

  1. modellabs官网:https://(待发布)

  2. 参考文档使用指南:https://.../github/heal/readme.md(待发布)

算法工具链
官方教程征程6
评论0
0/600