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

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

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

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

简介

多目标跟踪是在视频序列的每一帧中定位所有的目标并确定它们的移动轨迹的任务。因为每帧中的目标都可能因为环境的变化而被遮挡,而且跟踪器要想进行长期跟踪或者低帧率的跟踪是比较困难的,所以多目标跟踪是极具挑战性的任务。MOTR(Multiple-Object Tracking with Transformer)能够学习建模目标的长时间变化,隐式地进行时间关联。基于Transformer和DETR,MOTR引入了track query这个概念,一个track query负责建模一个目标的整个轨迹,它可以在视频帧间传递和更新,从而无缝地完成目标检测和跟踪任务。本文将介绍 MOTR 在地平线 J6 平台上的优化部署。

性能精度指标

MOTR模型配置:

数据集

Input shape

backbone

head

post-process

跟踪目标最大数量

检测类别

mot17

1x3x800x1422

efficientnetb3

MotrHead

MotrPostProcess

256

行人

性能精度表现:

J6M-latency/ms

性能J6M-FPS

MOTA

浮点

量化

8.03

128.68

0.5842

0.5767

注:MOT17数据集官方介绍:MOT17

模型介绍

MOTR的输入为图像序列,输出为跟踪目标的位置信息和类别信息。MOTR的总体架构和过程如下图所示,主要由以下部分组成:

  1. Enc:由backbone(efficientnetb3)和Deformable DETR encoder组成,用来提取每帧图像的特征;
  2. Dec:由Deformable DETR decoder组成,用来生成bounding box 预测的隐藏状态。对于第一帧,不存在跟踪查询$$q_{tr$$,因此只将固定长度的检测查询$$q_$$和手工生成的fake跟踪查询输入到Dec中;对于连续帧,模型会将来自前一帧的跟踪查询和可学习的检测查询输入到Dec中。更新检测查询和跟踪查询的过程如下所示:

Track Query是动态更新的,而且长度是可变的。首先将Track Query初始化为空,然后使用Detect Query检测新生目标,将所有检测到的目标的隐藏状态连接起来,从而生成下一帧的Track Query,终止目标的Track Query则将从Track Query集中删除。

  1. Query Interaction Module(QIM):QIM将Dec生成的box的隐藏状态作为输入,并为下一帧生成跟踪查询。QIM包括目标进出机制和时间聚合网络(Temporal Aggregation Network,TAN)。目标进出机制用来解决新生目标和终止目标的问题;TAN增强了时间关系建模,并为跟踪目标提供上下文先验。

改动点说明

相对于公版实现,地平线对MOTR的模型结构和训练策略做了如下优化:

模型结构优化

  1. 将backbone从ResNet50更换到efficientnetb3,兼顾模型精度和推理性能;

  2. 优化query维度,模型中将query全部由二维优化为4维进行计算,便于性能提升;

  3. 模型中的linear全部替换为conv2d,便于性能提升;

  4. deformable attention优化:

    1. 输入采用四维的数据,避免了flatten+reshape的重复计算;

    2. 将每个注意力头的采样点数量由4个减少到1个,并且用sigmoid替换softmax,便于性能提升(精度基本上不变);

  5. Track query个数由300降低到256,便于性能提升;

  6. 引入padding query和mask query,解决动态shape问题。

训练策略优化

  1. 引入了DAB-DETR的anchor-box,直接将box的坐标作为queries输出到DeformableTransformer的解码器中,加速模型收敛和提升精度;
  2. 引入了DINO的look forward twice,利用后一层的改进的box信息校正前一层的box预测,优化梯度传播,提升预测精度。

Backbone

MOTR参考算法采用与硬件比较友好的efficientnetb3作为backbone来提取图像多尺度特征,提升了模型的精度。efficientnetb3的网络结构如下所示:

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

MotrHead

MOTR通过efficientnetb3和Deformable Transformer Encoder提取图像序列特征。对于第一帧图像,由于不存在跟踪查询,所以将固定长度的可学习检测查询和padding后的fake跟踪查询输入到Deformable Transformer Decoder。对于连续帧,将来自前一帧的跟踪查询和可学习的检测查询输入到解码器中,这些查询与解码器中的图像特征交互,生成用于边界框预测的类别classes、坐标coords和hs,然后输入到查询交互模块(QIM)中,来生成下一帧的跟踪查询。

代码路径:heal/models/task_modules/motr/motr_deformable_transformer.py

Track instance 初始化

对于首帧图像,我们生成了值全为0的track instance用于目标padding,初始化过程如下所示:

相关代码如下所示:

代码路径:heal/models/structures/motr.py

Deformable Transformer Encoder

Deformable Transformer Encoder的作用是提取一帧图像的特征。它的输入是backbone 提取的图像特征、参考点reference points和位置编码position embedding。

Deformable Transformer Encoder的基本组成结构为DeformableTransformerEncoderLayer,它主要由self attention层、LayerNorm层和ffn(feedforward neural network)层组成,这里需要注意的是:为了性能优化,Deformable Attention采样点数量都由公版的4个减少到1个,并且用sigmoid替换softmax。

如下为结构示意图:

相关代码:

代码路径:heal/models/task_modules/motr/motr_deformable_transformer.py

Deformable Transformer Decoder

对于每帧图像特征,检测查询和跟踪查询被连接起来,然后被输入到Deformable Transformer Decoder 中来更新它们的表示。检测查询将仅检测新生目标,因为Transformer解码器中通过自注意力进行的查询交互将抑制检测跟踪目标的检测查询。这种机制类似于DETR中的重复删除,即以低分数抑制重复框。Deformable Transformer Decoder 基本组成结构为DeformableTransformerDecoderLayer:

相关代码如下所示:

代码路径:heal/models/task_modules/motr/motr_deformable_transformer.py

Post Process

MotrHead输出了目标的类别信息classes、bbox信息和decoder的中间结果hs,将这些结果进行处理后,然后再输入到QIM模块,相关过程如下所示:

相关代码如下所示:

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

查询交互模块(query interaction module,QIM)包括目标进出机制和时间聚合网络(TAN)。QIM的结构如下图所示:

目标进出机制

视频帧序列中的一些目标可能在中间帧出现或消失。MOTR中处理新生目标和终止目标的方式是对于任何帧,跟踪查询都与检测查询连接,并输入到Transformer解码器,从而产生隐藏状态(如上图的左侧)。在训练过程中,如果匹配的目标在Ground Truth中消失,或者预测的边界框和目标之间的IoU低于0.5的阈值,则去除终止目标的隐藏状态。为了进行推理,我们使用预测的分类分数score来确定新生目标的出现和被跟踪目标的消失。对于目标查询,保留分类分数高于阈值的预测,同时删除其他隐藏状态。

对应代码:

对于跟踪查询,删除连续5帧的分类分数低于阈值的预测,同时保留其他隐藏状态,对应代码如下所示:

代码路径:

heal/models/task_modules/motr/post_process.py

heal/models/task_modules/motr/motr_utils.py

时间聚合网络

MOTR在QIM中引入了时间聚合网络(TAN),以增强时间关系建模,并为被跟踪目标提供上下文先验。如上图所示,TAN的输入是被跟踪目标(目标“1”)的filter隐藏状态,还收集了来自最后一帧的跟踪查询,用于时间聚合。TAN是一个改进的Transformer解码器层。最后一帧的跟踪查询和filter后的隐藏状态相加,成为多头自注意力的key和query。

相关代码如下所示:

代码路径:heal/models/task_modules/motr/qim.py

地平线部署说明

MOTR 模型在地平线 J6 上部署的优化主要集中在 backbone 替换、query 维度调整、conv 替换 linear、deformable attention 采样点与 softmax 优化等方面,具体改动见「改动点说明」章节。下面将精度优化对应的改动点以及量化配置依次说明。

精度优化

浮点精度

改动点1: 将backbone从ResNet50更换到efficientnetb3,兼顾模型精度和推理性能。
改动点2: 优化query维度,模型中将query全部由二维优化为4维进行计算,便于性能提升。
改动点3: 模型中的linear全部替换为conv2d,便于性能提升。
改动点4: deformable attention优化——输入采用四维数据,避免flatten+reshape重复计算;将每个注意力头采样点数量由4个减少到1个,并用sigmoid替换softmax,精度基本不变。
改动点5: Track query个数由300降低到256,便于性能提升。
改动点6: 引入padding query和mask query,解决动态shape问题。

训练策略上引入了 DAB-DETR 的 anchor-box(直接将box坐标作为queries输出到解码器,加速收敛、提升精度)与 DINO 的 look forward twice(利用后一层改进的box信息校正前一层box预测,优化梯度传播)。

量化精度

为量化精度保证,MOTR 采用全 int8 + 大量敏感算子配置为 int16 的量化策略。int16 范围覆盖 head 顶部(query_tracked_ref_pts / ref / cat / query_embed / sigmoid 等)、encoder 与 decoder 各 6 层(norm / linear / add / self_attn / cross_attn 的 matmul / attention_weights / sampling_offsets 等)、decoder 顶部(new_reference_points_sigmoid / reference_points_add)、sinepos 以及 QIM(track_embed)。最新接口下量化配置集中在 qconfig.py 的单个 qconfig_setter 中:校准使用 HistogramObserver,qat / deploy 使用 MinMaxObserver 并开启 fix_scale=True 冻结激活 scale。
其中 qint16_templates 由各模块的 int16 算子列表(_head_qint16 / _dec_layer_qint16 / _qim_qint16 等)按层展开生成,对 6 层 encoder 与 6 层 decoder 逐层配置 int16 输出(Conv2d 同时配置 weight: qint8);decoder 的 bbox_embed / reference_points_add / new_reference_points_sigmoids 用 freeze=True 锁定,防止 enable_optimize 的 FuseConvAddTemplate 将 int16 输出降级(否则 hbir 输出 coords 范围塌缩导致多帧序列跟踪漂移);mask 相关 QuantStub 通过 threshold=128.0 固定 scale=1.0(FixedScaleObserver)。
注:早期版本中这些 int16 配置写在各模块的 set_qconfig 方法内,最新接口已统一迁移到 qconfig.py 的 ModuleNameTemplate,量化配置不再依赖模型内部的 set_qconfig。QAT 阶段的激活 scale 冻结由 fix_scale=True 完成(需 horizon-plugin-pytorch >= 3.4.1)。
模型基于int8的量化配置下做calibration,若出现精度掉点问题可参考用户手册中的量化感知训练--开发指南--精度调优工具使用指南章节做badcase的debug分析,基于debug信息对部分算子配置更高的精度或者尝试手动处理。

总结与建议

训练建议:

  • 引入 DAB-DETR 的 anchor-box 与 DINO 的 look forward twice,可加速收敛、提升精度并优化梯度传播。

  • 对于跟踪任务,建议在量化训练适当增加 epoch,并采用 StepDecayLrUpdater 策略对量化训练精度更友好。

  • 校准建议使用 HistogramObserver,并在 QAT/deploy 阶段通过 fix_scale=True 冻结激活 scale,避免多帧序列跟踪漂移。

部署建议:

  • backbone 推荐使用 efficientnetb3,兼顾精度与推理性能;模型中的 linear 全部替换为 conv2d,便于性能提升。

  • deformable attention 建议采用四维输入(避免 flatten+reshape)、减少采样点数量并用 sigmoid 替换 softmax,在精度基本不变的前提下提升性能。

  • 引入 padding query 和 mask query 解决动态 shape 问题;Track query 个数可按需降低(如 300→256)以提升性能。

  • 量化时对 decoder reference_points 路径用 freeze=True 锁定 int16,防止 FuseConvAddTemplate 降级导致 hbir 输出 coords 范围塌缩与跟踪漂移。

本文通过对MOTR在地平线征程6上量化部署的优化,使得模型在J6M上得到latency为8.03ms、FPS为128.68的部署性能,MOTA 浮点/量化分别为0.5842/0.5767,同时,通过MOTR的部署经验,可以推广到其他 transformer-based 多目标跟踪模型的部署中。

附录

  1. 参考算法(modellabs)官网:https://oe.horizon.auto/labs
  2. 论文:MOTR
  3. MOT17数据集官方介绍:MOT17
算法工具链
技术深度解析官方教程征程6
评论0
0/600