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

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

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

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

0 性能精度指标

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(Multiple-Object Tracking with Transformer)能够学习建模目标的长时间变化,隐式地进行时间关联。基于Transformer和DETR,MOTR引入了track query这个概念,一个track query负责建模一个目标的整个轨迹,它可以在视频帧间传递和更新,从而无缝地完成目标检测和跟踪任务。

模型优化点

相对于公版实现,地平线对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预测,优化梯度传播,提升预测精度;

模型结构

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

  1. Enc:由backbone(efficientnetb3)和Deformable DETR encoder组成,用来提取每帧图像的特征;
  2. Dec:由Deformable DETR decoder组成,用来生成bounding box 预测的隐藏状态。对于第一帧,不存在跟踪查询$$q_{tr}$$,因此只将固定长度的检测查询$$q_d $$和手工生成的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增强了时间关系建模,并为跟踪目标提供上下文先验。

源码说明

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)中,来生成下一帧的跟踪查询。

image.png
代码路径:heal/models/task_modules/motr/motr_deformable_transformer.py
Track instance 初始化

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

image.png

相关代码如下所示:

代码路径:/usr/local/lib/python3.8/dist-packages/hat/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。

如下为结构示意图:

image.png

相关代码:

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

相关代码如下所示:

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

Post Process

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

image.png

相关代码如下所示:

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

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

目标进出机制

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

对应代码:

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

代码路径:heal/mode/task_modules/motr/post_process.py
   heal/mode/task_modules/motr/motr_utils.py
时间聚合网络

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

相关代码如下所示:

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

算法工具链
技术深度解析官方教程征程6
评论0
0/600