该示例为参考算法,仅作为在 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做了如下优化:
将模型的backbone替换为与地平线硬件更为友好的efficientnetb0,提升了模型的性能;
neck网络优化为bifpn,这种重复双向跨尺度连接+ 带权重的特征融合机制,实现了更高层次的特征融合;
检测头中的卷积运算使用深度可分离卷积,大幅优化了模型的性能;
源码说明
Config文件
注: 如果需要复现精度,config中的训练策略最好不要修改,否则可能会有意外的训练情况出现。
image encoder
Image encoder是对图像进行特征提取和融合。fcos3d参考算法通过backbone(efficientnetb0)和neck(BiFPN)提取图像的多尺度特征。网络结构如下图所示:

backbone
fcos3d参考算法采用与硬件比较友好的efficientnetb0作为backbone来提取图像多尺度特征,实现了性能的提升。
neck
fcos3d用于多级分支构造的neck采用的是bifpn,是用于检测不同尺度目标的主要组件,其特性可以总结为重复双向跨尺度连接+ 加权特征融合机制。bifpn将每个双向路径(自顶向下和自底而上)作为一个特征网络层,并重复同一层多次,以实现更高层次的特征融合;另外,不同的输入 featuremap 具有不同的分辨率,它们对融合输入 featuremap 的贡献也是不同的,因此简单的对他们进行相加或叠加处理并不是最佳的操作,所以bifpn实现了简单而高效的加权特征融合的机制。
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二分类器来确定哪些点更靠近中心,并有助于抑制那些远离目标中心的低质量预测 |
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$$
对应代码:
centerness计算
由于fcos3d的回归目标改为基于3D中心的范式,通过以投影的3D中心为原点的2D高斯分布来定义centerness。二维高斯分布简化为:
$$c=e^{-\alpha((\Delta x)^2+(\Delta y)^2)$$
这里,$$\alph$$用于调整从中心到外围的强度衰减,并设置为2.5。fcos3d将c作为centerness的groundtruth,并从回归分支对其进行预测,以便稍后过滤低质量的预测。
对应代码:
FCOS3DTarget的forward代码为:
Loss
获取到labels_3d, bbox_targets_3d,centerness_targets, attr_targets等分类回归groundtruth后,需要在训练阶段进行loss的计算。fcos3d参考算法的损失定义与公版一致,对于分类和不同的回归目标,分别定义它们的损失,损失函数的设置在config文件中:
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,流程如下图所示:
相关代码如下所示:
非极大值抑制
fcos3d通过计算投影的3D边界框的外部矩形来生成2D边界框,然后,在鸟瞰图中作为大多数3D检测器进行旋转的非最大值抑制,以获得最终结果。相关代码如下所示:
forward代码为:
总结与建议
训练建议
浮点训练使用 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 阈值的配置。
附录
modellabs官网:https://(待发布)
参考文档使用指南:https://.../github/heal/readme.md(待发布)
