Basic Information
- Title:Language Prompt for Autonomous Driving
- Author:Dongming Wu, Wencheng Han, Tiancai Wang, Yingfei Liu, Xiangyu Zhang, Jianbing Shen
- Institution:SKL-IOTSC, University of Macau, Inception Institute of Artificial Intelligence (IIAI), Beijing Institute of Technology
- Conference:AAAI 2025
- Homepage:https://github.com/wudongming97/Prompt4Driving
Abstract
计算机视觉界的一个新趋势是,根据人类提供的自然语言指令来捕捉感兴趣的物体。然而,由于成对的提示-实例(prompt-instance)数据稀缺,在驾驶场景中使用语言提示的进展陷入了瓶颈。为了应对这一挑战,我们提出了首个用于驾驶场景的、以物体为中心的语言提示集,该数据集在3D、多视角和多帧空间中进行构建,我们将其命名为 NuPrompt。它通过构建总计 40,147 个语言描述来扩展 nuScenes 数据集,每个描述平均指代 7.4 个物体的轨迹片段(tracklets)。基于该基准测试中的物体-文本对,我们构建了一种新颖的、基于文本提示的驾驶任务,即利用语言提示来预测被描述物体在不同帧间的轨迹。此外,我们展示了一个基于 Transformer 的简单端到端基线模型,名为 PromptTrack。实验表明,我们的 PromptTrack 模型在 NuPrompt 数据集上取得了令人印象深刻的性能。我们希望这项工作能为自动驾驶社区提供新的见解。数据和代码已在 https://github.com/wudongming97/Prompt4Driving 上发布。
Current Issues, Challenges, Author’s Motivation, and Proposed Solution
驾驶场景中的语言提示。在驾驶场景中利用人类指令,可以让系统从人类的视角理解驾驶系统,从而辅助人类控制驾驶过程。Talk2Car (Deruyttere et al. 2019) 是一个开创性的、用于自动驾驶车辆的语言提示基准,它构建于 nuScenes 数据集 (Caesar et al. 2019) 之上。然而,它的标注只包含了标注者关注的关键帧。部署在 Talk2Car 中的提示也倾向于只表示单个物体。为解决此问题,Refer-KITTI (Wu et al. 2023b) 进一步开发了 KITTI 数据集 (Geiger, Lenz, and Urtasun 2012),其中每个提示可以指代一系列被指物的集合。近期,NuScenes-QA (Qian et al. 2023) 开辟了一条新途径,即视觉问答(VQA),用于理解场景级别的驾驶情景。DriveLM (Sima et al. 2024) 将 2D 关键物体用于图谱视觉问答。尽管在驾驶领域还有其他自然语言数据集,如 BDD-X (Kim et al. 2018)、DRAMA (Malla et al. 2023)、TalkBEV (Dewangan et al. 2024) 和 Rank2Tell (Sachdeva et al. 2024),但它们与我们的工作完全不同,因为它们是使用语言作为标题来改进驾驶解释的。现有基于提示的驾驶数据集与我们工作之间的详细比较总结在表 1 中。
图片顶部的提示语:
- The cars in the process of overtaking. -> 正在超车的几辆车。
图 1 (Figure 1) 的图注:
- Figure 1: A representative example from NuPrompt. -> 图 1:NuPrompt 数据集中的一个代表性示例。
- The language prompt “the cars in the process of overtaking” is precisely annotated and corresponded to the objects within the 3D, multi-frame, and multi-view driving scene. -> 语言提示“正在超车的几辆车”被精确地标注并对应到这个三维、多帧、多视角的驾驶场景中的物体上。
- NuPrompt contains 40,147 object-prompt pairs with fine-grained semantic alignment. -> NuPrompt 包含 40,147 个具有细粒度语义对齐的“物体-提示”对。
- Each language prompt refers to multiple object trajectories. -> 每个语言提示都指向多个物体的轨迹。
表 1 (Table 1) 的表注:
- Table 1: Comparison of our NuPrompt with existing prompt-based datasets. -> 表 1:我们的 NuPrompt 数据集与现有基于提示的数据集的比较。
- ‘-’ means unavailable. -> ‘-’ 表示数据不可用。
- NuPrompt provides the nature and complexity of driving scenes, i.e., 3D, multi-view space, and multi-frame domain. -> NuPrompt 提供了驾驶场景的自然性和复杂性,即三维、多视角空间和多帧领域。
- Besides, it focuses on object-centric understanding by pairing a language prompt with multiple targets of interest. -> 此外,它通过将一个语言提示与多个感兴趣的目标配对,专注于以物体为中心的理解。
表格内容:
- 表头:
Dataset
: 数据集Basic Task
: 基本任务3D
: 是否为三维#Views
: 视角数量#Videos
: 视频数量#Frames
: 帧数#Prompts
: 提示数量#Instances per-prompt
: 每个提示的实例数
- 任务类型:
Det&Seg
: 检测与分割Det
: 检测MOT
: 多目标跟踪VQA
: 视觉问答Det&VQA
: 检测与视觉问答
- 表头:
这张图片和表格共同介绍并对比了一个名为 NuPrompt 的新数据集。
图1核心内容:这张图展示了 NuPrompt 数据集的一个核心功能。它描绘了一个自动驾驶场景,通过车身周围的六个摄像头(左前、前、右前、左后、后、右后)捕捉多视角的画面。
示例说明:
- 语言提示 (Prompt):研究人员给出一个自然语言指令,例如“正在超车的几辆车”。
- 多帧跟踪 (Multi-frame):图片展示了两个时间点——“第 1 帧”和“第 N 帧”。模型需要根据语言提示,在连续的视频帧中识别并持续跟踪相关的车辆。
- 多目标 (Multi-object):这个提示指向的是一个“超车”事件,涉及到不止一辆车。在第 N 帧的图像中,我们可以看到一辆蓝色轿车(执行超车)和一辆白色轿车(被超车)都被三维边界框高亮标出。这说明模型需要理解指令并同时跟踪多个目标。
图 1 直观地展示了 NuPrompt 数据集的任务:在复杂的三维、多视角、多帧的驾驶场景中,根据一句自然语言指令,准确地跟踪一个或多个相关的目标物体。
表1核心内容:这张表格将 NuPrompt 数据集与多个现有的、同样基于“提示”的视觉数据集进行了横向对比,以凸显 NuPrompt 的独特性和优越性。
对比维度:表格从任务类型、是否为三维、视角/视频/帧/提示的数量,以及每个提示平均对应的实例数等多个维度进行比较。
NuPrompt 的优势:
- 三维与多视角:表格中用“✔”符号标出,NuPrompt 是一个支持三维(3D)和六个视角(#Views=6)的多目标跟踪(MOT)数据集,这比其他大部分基于二维单视角的数据集更贴近真实的驾驶环境。
- 多实例对应:这是最关键的区别。在“每个提示的实例数” (
#Instances per-prompt
) 这一列,大多数数据集的数值是“1”,意味着一条指令只对应一个物体。而 NuPrompt 的平均值是 7.4,说明它的一条指令常常对应多个物体(就像图 1 中的“几辆车”)。这要求模型不仅要识别物体,还要理解物体之间的复杂关系和群体行为。 - 任务复杂性:它的基本任务是多目标跟踪(MOT),结合了三维、多视角和多实例的特点,比传统的检测(Det)或视觉问答(VQA)任务更具挑战性。
表 1 通过量化数据证明,NuPrompt 在 场景复杂性(3D、多视角)、任务难度(多目标跟踪)和语义理解深度(一个提示对应多个目标) 方面,都超越了以往的数据集,为自动驾驶领域的感知和决策研究提供了更具挑战性、也更接近真实世界需求的基准。
指代表达理解。给定一个语言提示,指代表达理解的目标是使用边界框或掩码来定位被描述的物体,这与我们基于提示的驾驶基准测试有着相似的理念。像 RefCOCO/+/g (Yu et al. 2016) 这类数据集的开创,极大地激发了该领域的研究。这些数据集成功地将简洁而明确的自然语言表达与图像内的视觉区域对应起来。一些后续工作通过支持指代无限目标对象的表达,进一步改进了这个数据集 (Liu, Ding, and Jiang 2023; Chen et al. 2019)。此外,Refer-DAVIS₁₆/₁₇ (Khoreva, Rohrbach, and Schiele 2019) 和 Refer-Youtube-VOS (Seo, Lee, and Han 2020) 是另外两个流行的视频指代表达理解基准,支持物体分割。近期在该领域的一项工作 GroOT (Nguyen et al. 2023) 扩展了大规模多物体跟踪数据集 TAO (Dave et al. 2020) 以支持指代表达理解。
在视觉任务中利用自然语言描述是视觉界近期的趋势之一 (Radford et al. 2021; Kirillov et al. 2023)。它因其在各种下游任务中的潜在应用而获得了极大的关注,例如具身智能 (embodied intelligence) 和人机交互 (Deruyttere et al. 2019; Chen et al. 2023; Gupta and Kembhavi 2023; Hu et al. 2023; Wu et al. 2023a,c; Bai et al. 2024)。其核心思想是通过转换人类指令输入来预测所需的目标,而不是更新模型权重,从而对多变的人类需求展现出高度的适应性。在 2D 场景中取得进展的一个关键因素是大规模图像-文本对的可用性 (Lin et al. 2014; Changpinyo et al. 2021; Schuhmann et al. 2021)。
然而,由于缺乏 3D 实例-文本对,这种成功很难在自动驾驶场景中复制。
像 Talk2Car (Deruyttere et al. 2019)、Cityscapes-Ref (Vasudevan, Dai, and Van Gool 2018) 这样的开创性工作已经开始将自然语言整合到驾驶场景的物体检测任务中。不幸的是,这些数据集只允许每个表述在单个图像内指代单个物体,这限制了它们在涉及多个被指代物体或物体状态变化的场景中的使用。此外,Thermore、Refer-KITTI (Wu et al. 2023b) 通过扩展 KITTI 数据集 (Geiger, Lenz, and Urtasun 2012) 来解决这个问题,以包含跨多个视频帧的指代表达。这项工作主要集中在模块化图像和 2D 检测上,从而为 3D 驾驶场景的改进留下了空间。最近的一项进展,即名为 NuScenes-QA (Qian et al. 2023) 的工作,为 3D 多视角驾驶场景提供了大量的问答对,在使用语言提示方面取得了重大进展。然而,它主要贡献于场景级的理解,并忽略了 3D 实例和自然语言表达之间的直接和细粒度的语义对应。
为了推进驾驶场景中提示学习(prompt learning)的研究,我们提出了一个名为 NuPrompt 的新型大规模基准测试。该基准建立在流行的多视角 3D 物体检测数据集 nuScenes (Caesar et al. 2019) 之上。我们为一系列具有共同基础特征的物体集合分配一个语言提示。本质上,这个基准测试提供了具有三个主要属性的大量 3D 实例-文本对:① 真实的驾驶描述。与那些只表示来自模块化图像的 2D 物体的现有基准不同,我们的提示描述了来自 3D、全景视角和长时序空间的一系列与驾驶相关的物体。图 1 展示了一个典型例子,即一辆汽车从后方超越,并出现在多个视角中。② 实例级的提示标注。每个提示都提供了细粒度和有区分度的、以物体为中心的描述,使其能够覆盖任意数量的驾驶物体。③ 大规模的语言提示。从数量上看,NuPrompt 有 40,147 个语言提示。
除了 NuPrompt,我们还提出了一个全新且具有挑战性的、基于提示的驾驶感知和预测任务。
其主要思想是基于给定的语言提示来跟踪和预测 3D 物体的轨迹。这项任务的挑战在于两个方面:跨帧的时间关联和跨模态的语义理解。为了应对这些挑战,我们提出了一个基于相机-纯3D跟踪器 PF-Track (Pang et al. 2023) 构建的端到端基线模型,名为 PromptTrack。值得注意的是,PF-Track 通过其过去和未来的推理分支,已经展现出色的时空建模能力。我们额外引入了提示嵌入(prompt embedding)和视觉特征之间的交叉注意力机制,然后添加一个提示推理分支,以定位提示所指代的物体。此外,我们还在实验中评估了这些被提示指代的物体的运动预测。除了基于提示的预测任务,我们期望我们的标注能够促进未来在自动驾驶多模态大语言模型方面的研究。
总的来说,我们的贡献有三方面:
- 我们提出了一个名为 NuPrompt 的大规模语言提示集,用于驾驶场景。据我们所知,这是第一个专门研究视频数据中多个感兴趣的 3D 物体的数据集。
- 我们构建了一个新的、基于提示的驾驶感知和预测任务,该任务需要使用语言提示作为语义线索来预测物体轨迹。
- 我们开发了一个简单的基线模型,名为 PromptTrack,它在一个统一的框架中整合了基于提示的物体跟踪和运动预测。
DataSet
数据收集与标注
我们的 NuPrompt 数据集构建在最流行的多视角 3D 物体检测数据集之一 nuScenes (Caesar et al. 2019) 的基础上。虽然原始的 nuScenes 数据集包含视觉图像和点云数据,但在这里我们只专注于 NuPrompt 所使用的视觉图像。如图 2 所示,采集数据的车辆配备了六个不同的摄像头:前视、左前、右前、后视、左后和右后。这些摄像头在某些区域存在重叠。因此,NuPrompt 为每个场景提供了 360° 的 3D 空间。
为了高效地为新数据集生成训练标签,我们设计了一个三步走的半自动标注流程(见图 2)。第一步旨在识别语言元素并使用特定规则将它们与 3D 边界框关联起来。第二步是结合语言元素。第三步,我们基于语言元素的组合,使用一个大型语言模型 (LLM) 来生成多样的语言提示。关于这三个步骤的详细信息如下。
步骤 1:语言元素收集。本文使用“语言元素”一词来指代物体的基本属性。语言元素的例子包括颜色(如红、黄、黑)、动作(如奔跑、停止、过马路)、位置(如左、右、后)和类别(如汽车、行人),这些涵盖了对驾驶场景的各种描述。关键问题是如何用相应的语言元素来标记边界框。为解决此问题,我们设计了一个标注系统,在视频序列中手动收集并匹配语言元素与边界框。如图 2 所示,标注员输入语言元素文本,然后点击相应的边界框。当目标状态改变,不再属于该语言元素时,标注员需要再次点击目标并将其从列表中移除。这个流程可以有效减少所需的人力劳动。为确保表达的多样性,每段视频都分配给五名独立的标注员,他们手动创建表达以形成查询语句。另外两名标注员随后会仔细检查表达与视频目标之间的匹配度。
步骤 2:语言元素组合。如前所述,语言元素是物体的基本属性。通过组合这些属性,我们可以为不同的物体群组创建多样的描述。存在一种逻辑关系,我们可以用来合并这些属性:与(AND)。我们使用这个操作来合并多组边界框及其语言元素,从而产生一个包含合并后属性的新集合。在我们的数据集中,我们手动选择有意义的属性组合,并为物体随机生成多种组合。
步骤 3:提示生成。在步骤 2 之后,我们能够确定语言元素组合与一组边界框之间的对应关系。然而,使用人力来获得有效且自然的语言句子来描述这些物体可能成本高昂,并且无法保证得到期望的多样性。大型语言模型 (LLM) 近期在理解逻辑和生成与人类所写句子相似的文本方面显示出巨大潜力。因此,我们确定使用 GPT-3.5 (OpenAI 2023) 作为我们的语言模型。我们通过一个请求来提示它,例如“根据以下描述生成一个句子来描述这些物体:行人,移动中,红色,不在左侧”,其中斜体词代表元素的组合。LLM 可以回应一个有意义的描述,例如“这些物体是红色的行人,目前正在移动中,不位于左侧”。为了保证准确性,我们还会要求标注员筛选掉不正确的描述。我们也会多次提示 LLM 以生成多个描述。
数据集统计
得益于 nuScenes (Caesar et al. 2019),我们的语言提示为三维、环绕和时序空间中的物体提供了大量全面的描述。此外,它们还涵盖了波士顿和新加坡等城市的步行街、普通道路和高速公路等不同环境。不仅如此,它们还包含了不同的天气条件(例如雨天和晴天)和光照条件(例如白天和黑夜)。为了更深入地了解 NuPrompt,我们接下来将展示更多的量化统计数据。
语言提示。 我们手动标注了 23,368 个语言元素,并通过大型语言模型(LLM)将它们组合成 16,761 条统一的描述。其中,有 12,001 个独立的语言元素和 12,001 种独立的语言组合。NuPrompt 数据集总共包含 40,147 条语言提示。平均而言,数据集中的每个视频包含 47 条语言提示。我们在图 3 中展示了前 100 个高频词的词云。从左边的图中,我们可以观察到 NuPrompt 数据集包含大量描述驾驶场景中物体外观的词语,如‘黑色’、‘白色’和‘红色’;以及描述位置的词语,如‘前方’、‘左侧’和‘右侧’。此外,一些表示动作的词语,如‘行走’、‘移动’和‘穿行’,也是常见的描述。
指代对象。 与以往那些在模块化图像中指代二维对象的基准不同,NuPrompt 的另一个特点是其环绕的 3D 空间。这意味着有大量物体跨越不同视角,从而提供了更接近真实驾驶场景的改进模拟。更重要的是,NuPrompt 旨在涉及任意数量的被预测对象。图 3 的左图表明,大多数提示描述了 1 到 10 个实例,有时甚至会超过 20 个。根据表 1,我们的数据集中每个提示所指代的平均实例数为 7.4。此外,边界框的分布显示在图 3 的右侧。
基准协议
任务定义。 结合 NuPrompt,我们构建了一项直接而富有挑战性的任务,该任务使用语言提示作为有意义的信号来预测物体的轨迹。具体而言,这项任务包括基于提示的多目标跟踪和运动预测。
评估指标。 为了评估预测轨迹片段(tracklet)与真实轨迹片段之间的相似度,我们采用平均多目标跟踪准确率(AMOTA)作为主要指标 (Bernardin and Stiefelhagen 2008)。然而,与原始多目标跟踪任务中对不同类别取 AMOTA 平均值的做法不同,在 NuPrompt 上的评估是类别无关的(class-agnostic)。因此,我们为所有“提示-视频”对计算 AMOTA,然后取所有这些 AMOTA 值的平均值。为了进行更详细的分析,我们还使用了平均多目标跟踪精确率(AMOTP)和身份切换次数(IDS)指标。此外,我们遵循 (Pang et al. 2023; Gu et al. 2023) 的工作,使用平均位移误差(ADE)和最终位移误差(FDE)来评估轨迹预测性能。
数据划分。 NuPrompt 共包含 850 个带有语言提示的视频。我们遵循 nuScenes (Caesar et al. 2019) 的做法,将 NuPrompt 划分为训练集和验证集,分别包含 700 个和 150 个视频。
1. 核心定义:一个用于自动驾驶的“语言-视觉”新基准
NuPrompt 是一个大规模数据集,其核心是将自然语言描述(提示)与自动驾驶场景中的三维、多视角、多帧视频里的物体精确地对应起来。它基于著名的 nuScenes 数据集构建。
2. 关键特点与创新
- 多目标指令是常态:这是 NuPrompt 与其他数据集最显著的区别。一条语言提示通常不是指向单个物体,而是指向一组具有共同特征或行为的多个物体。
- 数据支撑:平均每条提示指代 7.4 个物体实例(轨迹)。从图3中间的分布图可以看出,虽然指代单个物体的提示最多,但指代2到10个物体的提示也占了非常大的比重。
- 任务的复杂性:数据集专注于三维空间中的多目标跟踪与运动预测,比传统的二维单目标检测或识别任务更贴近真实世界的复杂性。
- 描述内容丰富:从图3左侧的词云图可见,提示内容涵盖了驾驶场景的关键元素:
- 物体类别:
car
(汽车),pedestrian
(行人),truck
(卡车) - 外观/颜色:
black
(黑),white
(白),color
(颜色) - 空间位置:
front
(前),left
(左),right
(右),back
(后) - 运动状态:
moving
(移动),walking
(行走),turning
(转弯),parked
(停放的)
- 物体类别:
- 规模庞大:包含 40,147 条语言提示,由 23,368 个基础“语言元素”通过大语言模型(LLM)组合生成,确保了描述的多样性和自然性。
3. 定义的新任务与评估方式
- 任务定义:利用 NuPrompt,研究者定义了一项新颖且富有挑战性的任务——基于语言提示的多目标跟踪与运动预测。即模型需理解一句话,并据此在视频中找到所有相关物体,同时预测它们的未来轨迹。
- 评估方式:采用
AMOTA
(平均多目标跟踪准确率) 作为主要评价指标,但关键在于评估是类别无关 (class-agnostic)的。评估系统不关心物体的类别(是车还是人),只关心模型找到的是否是语言提示所描述的那一个或那一组正确的实例。
NuPrompt 是一个大规模的自动驾驶数据集,其核心创新在于提供了“一句话指令对应多个三维空间中的运动物体”的标注,定义了一个更接近人类交互方式、更具挑战性的多目标跟踪与预测新任务。
Method
给定多帧多视角的图像和一个自然语言提示,我们的目标是跟踪被描述的对象。为实现这一目标,我们提出了 PromptTrack,一个端到端的框架。它修改了基于查询的方法 PF-Track (Pang et al. 2023) 以适应语言提示的输入。图 4 展示了 PromptTrack 的整体流程。值得注意的是,PF-Track 包含一个基于解码后查询的过去推理分支和一个未来推理分支。这些分支分别利用缓存的历史查询和改进跨帧查询传播,以优化定位预测。除了这两个分支,我们还提出了一个新的提示推理分支,用以预测由提示所指代的轨迹。
整体架构
在形式上,我们用 F t F_t Ft 表示在时间步 t t t 提取的视觉特征,用 S S S 表示提取的语言特征。为了用语言信息来丰富视觉特征,我们首先以多模态的方式将视觉特征与语言特征进行融合,形成增强的视觉特征图。具体来说,我们将两种特征展平,并使用交叉模态注意力(cross-modal attention)来促进 F t F_t Ft 和 S S S 之间的特征融合,从而生成提示感知的视觉特征 F t ′ F'_t Ft′:
F t ′ = CrossModalAttn ( Q = F t , K = V = S , PE = Pos ( S ) ) ( 1 ) F'_t = \text{CrossModalAttn}(Q=F_t, K=V=S, \text{PE}=\text{Pos}(S)) \quad (1) Ft′=CrossModalAttn(Q=Ft,K=V=S,PE=Pos(S))(1)
其中 Pos 表示位置编码 (Vaswani et al. 2017)。
为了捕捉不同视图和立体信息,我们遵循 PETR (Liu et al. 2022) 的方法,在 F t ′ F'_t Ft′ 上添加 3D 位置嵌入。为简单起见,经过位置增强的视觉特征也表示为 F t ′ F'_t Ft′。然后,一组 3D 查询 Q t Q_t Qt 与 F t ′ F'_t Ft′ 在一个 Transformer 解码器栈中进行交互,输出更新后的查询 Q t D Q^D_t QtD 和边界框 B t D B^D_t BtD:
Q t D , B t D = Decoder ( Q t , F t ′ ) ( 2 ) Q^D_t, B^D_t = \text{Decoder}(Q_t, F'_t) \quad (2) QtD,BtD=Decoder(Qt,Ft′)(2)
其中,每个输入查询 q t i ∈ Q t q_t^i \in Q_t qti∈Qt 代表一个具有特征向量 f t i f_t^i fti 和 3D 定位 c t i c_t^i cti 的对象,即 q t i = { f t i , c t i } q_t^i = \{f_t^i, c_t^i\} qti={fti,cti}。
为了自动关联不同帧之间的对象,输入查询 Q t Q_t Qt 融合了来自上一帧的跟踪查询 Q t t r a c k Q^{track}_t Qttrack。上一帧的边界框信息为当前帧提供了先验的空间位置,帮助模型更准确地识别同一对象。此外,为了捕捉新出现的目标,一组固定的 3D 查询 Q t f i x e d Q^{fixed}_t Qtfixed(也称为检测查询)会与跟踪查询 Q t t r a c k Q^{track}_t Qttrack 进行拼接,以生成 Q t Q_t Qt。遵循 (Pang et al. 2023) 的工作,固定查询的数量设置为 500。由于第一帧没有前序帧,我们只使用固定查询来检测对象。
过去与未来推理。 经过 Transformer 解码器后,会依次进行过去推理和未来推理,分别用于关注历史嵌入和预测未来轨迹。形式上,过去推理 F p F^p Fp 整合了两个解码输出 Q t D Q^D_t QtD 和 B t D B^D_t BtD 以及来自过去 τ h \tau_h τh 帧的缓存历史查询 Q t − τ h : t − 1 Q_{t-\tau_h:t-1} Qt−τh:t−1,以产生精炼后的查询 Q t R Q^R_t QtR 和精炼后的边界框 B t R B^R_t BtR:
Q t R , B t R = F p ( Q t D , B t D , Q t − τ h : t − 1 ) ( 3 ) Q^R_t, B^R_t = F^p(Q^D_t, B^D_t, Q_{t-\tau_h:t-1}) \quad (3) QtR,BtR=Fp(QtD,BtD,Qt−τh:t−1)(3)
其中 F p F^p Fp 包含一个跨帧注意力模块,用以增强来自过去 τ h \tau_h τh 帧中每个对象的历史信息传播。此外,它还包含一个跨对象注意力模块,以促进每个独立特征的区分性。顺序的跨帧注意力和跨对象注意力模块最终输出 Q t R Q^R_t QtR。一个多层感知机(MLP)被用来预测坐标残差并调整对象边界框,从而得到 B t R B^R_t BtR。
基于过去推理得到的精炼结果,未来推理 F f F^f Ff 使用一个跨帧注意力模块来预测接下来 τ f \tau_f τf 帧的长期轨迹 M t : t + τ f M_{t:t+\tau_f} Mt:t+τf:
Q t + 1 t r a c k , M t : t + τ f = F f ( Q t R , Q t − τ h : t − 1 ) ( 4 ) Q^{track}_{t+1}, M_{t:t+\tau_f} = F^f(Q^R_t, Q_{t-\tau_h:t-1}) \quad (4) Qt+1track,Mt:t+τf=Ff(QtR,Qt−τh:t−1)(4)
其中,精炼查询 Q t R Q^R_t QtR 的位置向量会根据单步运动 M t : t + 1 M_{t:t+1} Mt:t+1进行更新,以生成 Q t + 1 t r a c k Q^{track}_{t+1} Qt+1track。未来推理的主要动机是,随着自车(ego-car)前进,所有……(文字中断)……来自上一帧的对象需要进行调整以对齐到新的自车坐标系。总而言之,使用过去和未来的信息可以提升可见对象跟踪的质量。为了进一步识别提示中提到的对象,我们对新的提示推理阐述如下。
提示推理 (Prompt Reasoning)
基于跟踪所有可见对象的过去推理,提示推理专注于在这些对象中定位由提示所指代的对象。由于来自过去推理分支的精炼查询 Q t R Q^R_t QtR 已经融合了提示嵌入,我们的提示推理 F l F^l Fl(l 代表 ‘language’)可以直接输出提示所指代对象的概率 P t P_t Pt:
P t = F l ( Q t R ) ( 5 ) P_t = F^l(Q^R_t) \quad (5) Pt=Fl(QtR)(5)
其中, F l F^l Fl 是一个带有两个全连接层的 MLP。 P t P_t Pt 是一个二元概率,表示输出的嵌入是否为一个由提示指代的对象。
实例匹配与损失函数
我们的方法遵循基于查询的方法 (Carion et al. 2020),将 3D 检测视为一个集合预测问题 (Wu et al. 2023d),因此它需要在计算损失之前进行一对一的匹配。跟踪查询 Q t t r a c k Q^{track}_t Qttrack 和它们的真值(ground-truth)在传播查询时已经完成了匹配。对于固定查询 Q t f i x e d Q^{fixed}_t Qtfixed,我们遵循 MOTR (Zeng et al. 2022) 的方法,使用二分图匹配(bipartite graph matching)将它们与新出现的目标进行匹配。在匹配过程中,我们只使用来自解码器输出的查询 Q t D Q^D_t QtD,然后在总损失中实现对应关系:
L = λ c l s D L c l s D + λ b o x D L b o x D + λ f L f + λ c l s R L c l s R + λ b o x R L b o x R + λ p L p ( 6 ) \mathcal{L} = \lambda^D_{cls}\mathcal{L}^D_{cls} + \lambda^D_{box}\mathcal{L}^D_{box} + \lambda_f\mathcal{L}_f + \lambda^R_{cls}\mathcal{L}^R_{cls} + \lambda^R_{box}\mathcal{L}^R_{box} + \lambda_p\mathcal{L}_p \quad (6) L=λclsDLclsD+λboxDLboxD+λfLf+λclsRLclsR+λboxRLboxR+λpLp(6)
其中, L c l s \mathcal{L}_{cls} Lcls 是用于分类的 Focal loss (Lin et al. 2017), L b o x \mathcal{L}_{box} Lbox 是用于边界框回归的 L1 loss, L f \mathcal{L}_f Lf 是用于运动预测的 L1 loss。它们的权重 λ \lambda λ 的设置遵循 PF-Track (Pang et al. 2023)。此外,我们的提示推理损失 L p \mathcal{L}_p Lp 也是 Focal loss,并由 λ p \lambda_p λp 加权。
核心目标:让汽车“听懂人话”去跟踪
你对你的自动驾驶汽车说:“帮我盯着那些正在右转的车”。这篇论文研究的 PromptTrack 模型,就是为了实现这个目标:让机器能理解你这句话,并在复杂的视频画面中,准确地找出并持续跟踪那些正在右转的车辆。
PromptTrack 的工作流程:一个高科技侦探社
我们可以把 PromptTrack 想象成一个分工明确的高科技侦探社,它的任务就是根据一条指令(Prompt)去追踪目标。
第一步:情报分析 (输入与融合)
侦探社接到任务后,首先要做的就是分析情报。
任务指令 (文本提示):首先,一个“指令分析员”(Text Encoder)会读取你的指令:“The vehicles that are turning right.”,并将其转换成机器能理解的数学语言(向量)。
现场监控 (多视角图像):同时,分布在车身周围的6个摄像头(Multi-view Images)就像是6个监控探头,实时传回现场的全景画面。一个“图像分析员”(Image Encoder)会处理这些画面,提取出关键的视觉特征。
情报融合 (交叉模态注意力):这是关键的一步。模型不会孤立地看指令和图像。它会将两者融合,让图像分析员“戴上任务的有色眼镜”去看监控。也就是说,模型会特别关注画面中与“车辆”和“转弯”相关的区域。这样就得到了一份带有任务重点的“情报地图”( F t ′ F'_t Ft′)。
第二步:派遣侦探 (查询与解码)
有了情报地图,侦探社需要派遣侦探(Queries)去实地锁定目标。每个“查询”就可以看作一个虚拟侦探,负责锁定一个潜在的目标。
侦探分为两种:
- 老手侦探 (Tracking Queries):他们是上一秒钟就已经在跟踪某些目标的老手。他们带着自己目标的旧档案,任务是更新目标的新位置。
- 新手侦探 (Detection Queries):他们是刚派出的新人,任务是在现场寻找任何新出现的可疑目标。
所有侦探(老手+新手)会进入一个“作战指挥室”(Decoder)。在这个房间里,每个侦探都会对照着那份“情报地图”,更新自己负责目标的最新位置和状态。
第三步:三大专家部门会诊 (三个推理分支)
从“作战指挥室”出来后,初步的追踪结果会交给三个专家部门进行深度分析和精炼。这是 PromptTrack 的核心。
历史档案部 (Past Reasoning)
- 作用:这个部门会调取所有目标过去几秒钟的档案(Cached Queries),然后和最新的追踪结果进行比对。
- 目的:修正和稳定追踪。比如,如果一个侦探报告目标突然瞬移了10米,历史档案部会说:“这不符合它过去的运动规律,应该是你看错了”,然后对位置进行平滑修正。这让追踪轨迹更连贯、更可靠。
未来预测部 (Future Reasoning)
- 作用:基于历史档案部精炼过的、最可靠的当前轨迹,这个部门的专家会预测目标在下一秒可能会去哪里。
- 目的:为下一轮追踪做准备。这个预测会交给“老手侦探”,让他们下一秒能更快、更准地找到自己的目标,防止跟丢。
任务合规部 (Prompt Reasoning) - ✨PromptTrack 的王牌✨
- 作用:这是为“听懂人话”专门设立的新部门。它会拿到历史档案部给出的所有被稳定追踪的目标清单。
- 目的:最终确认。这个部门的唯一工作,就是对清单上的每一个目标进行审查,并打上标签:“它是否符合最初的指令(正在右转)?” -> “是/否”。
最终成果与学习方式
经过这三大部门的通力合作,PromptTrack最终能输出:
- 画面中所有被稳定追踪的物体的精确3D位置。
- 它们各自的未来运动轨迹。
- 一个明确的答案:哪些物体才是用户指令中真正关心的目标。
这个庞大的“侦探社”是作为一个整体进行训练的。在训练时,我们会给它一个“总教官”(损失函数 L \mathcal{L} L)。总教官会对比它的工作成果和标准答案,然后告诉它:“你这里跟丢了、那个位置算错了、这个目标判断错了…”,整个团队(模型所有参数)会根据这些反馈进行统一调整,力求下次做得更好。这就是公式(6)所代表的端到端学习过程。
PromptTrack 的方法就像一个智能流程:它先融合“指令”和“图像”情报,然后派“侦探”(查询)去锁定所有潜在目标,最后通过“历史”、“未来”和“指令合规”三个专家部门的协同工作,不仅能稳定地跟踪所有对象,还能精准地找出哪些才是用户真正想找的,最终实现了“听懂人话去跟踪”的强大功能。
Experiments
Settings
在本章节中,我们在我们提出的基准数据集 NuPrompt 上进行了一系列实验。关于实现细节,我们遵循 PF-Track (Pang et al. 2023) 的设置。
Main Results
由于目前还没有针对这种新的基于提示的预测任务的现有方法,我们修改了当前最先进的开源纯摄像头跟踪模型,以进行比较。首先,之前大多数基于摄像头的跟踪方法遵循一种基于启发式(heuristic-based)的模式 (Liu et al. 2023b; Wang et al. 2023),它包含两个部分:基础检测器和跟踪器。遵循这种模式,我们使用了两种目前最先进的单帧目标检测器,即 DETR3D (Wang et al. 2022) 和 PETR (Liu et al. 2022),以及一个流行的跟踪器 CenterPoint tracker (Yin, Zhou, and Krähenbühl 2021)。这个强大的跟踪器已被用于 nuScenes 跟踪任务排行榜上的许多先进检测方法中 (Liu et al. 2023b; Wang et al. 2023)。为了区分出提示所指代的对象,我们在这些基础检测器中加入了我们提示融合模块的实现。其次,我们整合了两个端到端的基于摄像头的 3D 多目标跟踪模型,DQTrack (Li et al. 2023) 和 ADA-Track (Ding et al. 2024),它们利用了如 DETR3D (Wang et al. 2022)、Stereo (Li et al. 2023)、PETRv2 (Liu et al. 2023a) 和 PETR (Liu et al. 2022) 等多样的解码器。这种方法与之前提到的依赖于两步推理过程的启发式方法有所不同。我们在 DQTrack 中无缝集成了我们的提示推理模块,以实现对提示所指代对象的预测。对于所有其他配置,我们遵循官方的设置和指南。第三,我们通过将 PromptTrack 框架的基础检测器替换为 DETR3D 来进行评估。在 NuPrompt 上,我们测试了所提出的 PromptTrack 和这些竞争者,主要结果展示在表 2 中。可以看到,PromptTrack 在 AMOTA 指标上达到了 0.259,在大多数指标上都优于其他对手。
除了对提示所指对象的跟踪进行评估外,我们还通过预测未来八帧来评估运动预测的性能。由于单帧目标检测器无法有效地测试对象运动,PromptTrack 是我们唯一考察的模型。从表 2 中可以看出,使用 PETR 检测器的 PromptTrack 在 ADE 指标上达到了 2.17,FDE 指标上达到了 2.21,展现了令人印象深刻的性能。在推理速度方面,我们在单张英伟达 A100 GPU 上使用 VOV 主干网络对验证集进行测试,PromptTrack 达到了 7.7 FPS。
Ablation Studies
提示融合方法。 表 3 展示了多种提示-视觉融合策略。第一种是去掉提示融合模块,并使用所有预测出的跟踪实例作为我们的提示预测(即 w/o Prompt Fusion)。其次,我们可以通过引入一种双向融合方法来改进当前仅用语言提示特征来增强视觉特征的方法(单向融合)。具体来说,在增强视觉特征之前,我们先生成视觉增强的语言特征,从而在两种模态之间建立双向的互动。第三,我们评估了另一种双向融合的变体,即只在解码器查询中加入提示(表示为 ‘Prompt as Query’)。这些变体虽然实现了,但并未带来显著的性能提升。总而言之,我们的提示-视觉融合策略被证明对于当前任务是高效的。
过去与未来推理。 在表 4 中,可以明显看到,忽略过去或未来推理任一分支都会导致性能下降,这凸显了整合两个推理分支的重要性。
提示类型与数量。 我们在语言元素和统一描述上测试了我们的 PromptTrack,结果如表 5 所示。值得注意的是,使用统一描述时模型性能相比于使用语言元素有所下降,这表明组合后的提示确实带来了一定的挑战。此外,我们通过从训练集中随机抽样 20%、50% 和 100% 的提示数量来检验其影响,如表 6 所示。一个清晰的趋势是:随着提示数量的增加,模型性能也相应提升,这突出了提示数量和模型效果之间的正相关性。
Qualitative Results
我们在图 5 中可视化了两个典型的定性结果。可以看到,我们的 PromptTrack 能够准确地检测和跟踪提示所指的目标,并能处理各种复杂情况,例如跨越不同视角和应对不同数量的对象。
Conclusion
在这项工作中,我们提出了 NuPrompt,这是首个专为自动驾驶中的 3D 感知设计的、大规模的语言提示数据集。NuPrompt 提供了大量精确且细粒度的 3D 对象-文本对标注。基于此,我们设计了一个新颖且富有挑战性的提示驱动的对象轨迹预测任务,即利用语言提示作为语义线索来跟踪对象并预测其运动。为了解决这个问题,我们进一步提出了一个端到端的基于提示的跟踪模型,名为 PromptTrack,它是对 PF-Track 的一种带有提示推理功能的改进。通过在 NuPrompt 上进行的一系列实验,我们验证了我们算法的有效性。
Limitations
语言理解与推理的深度有限:
PromptTrack
模型的核心创新点Prompt Reasoning
模块,本质上只是一个简单的MLP分类头 。它接收融合了文本信息的物体查询特征,然后进行二元分类。这种方式是一种“黑盒”关联,模型学会了“哪些特征的组合可能对应指令”,但它没有进行显式的、可解释的逻辑推理。- 它可能难以处理需要复杂组合逻辑、否定(“除了白色的车”)、或比较关系(“跟踪比旁边卡车更快的车”)的指令。
缺乏显式的时空与关系推理:
- 模型对物体的判断是孤立的。例如,对于指令“跟踪在行人前面的那辆车”,模型很难显式地建模“车”与“行人”之间的“在…前面”这种空间关系。它可能会通过学习上下文特征间接做到,但不是一个鲁棒的、可泛化的能力。
- 对于需要理解物体间交互行为的指令(如“正在相互超车的两辆车”),模型的推理能力可能不足。
指令的静态性与交互的缺失:
- 整个框架是“一句话任务”模式:给定一条指令,处理整个视频。它不支持动态、持续的交互。例如,用户无法在跟踪过程中下达新的指令,如“好的,现在停止跟踪它,转向它后面的那辆蓝色车”。这限制了其在真实人机协作场景中的应用。
对世界知识和常识的依赖不足:
- 模型完全依赖于在数据集中观察到的模式。它缺乏更高维度的世界知识或驾驶常识。对于需要预判的指令,如“跟踪那辆可能要右转的车”,模型只能根据当前车轮角度等瞬时线索,而无法结合“它在最右侧车道且打了转向灯,根据交规它很可能会右转”这样的常识进行推理。
标注数据的局限性:
- 尽管数据集规模很大,但其指令是通过“语言元素组合 + LLM生成”的半自动方式构建的 。这可能导致指令的句式和描述模式相对固定,缺乏真实人类指令的多样性、模糊性和口语化特征。这可能会让模型在面对真实世界的人类指令时表现下降。
Direction For Improvment
从“隐式关联”到“显式推理” (融合VLM进行推理)
- 方向: 将
PromptTrack
中简单的MLP推理头替换为一个强大的VLM。这个VLM不再是简单地对特征进行分类,而是扮演一个**“视觉推理引擎”**的角色。 - 具体方案:
PromptTrack
的跟踪器部分(Decoder + Past/Future Reasoning)保持不变,继续负责在每一帧中定位和跟踪所有可见的物体,输出每个物体的精炼查询特征Q_t^R
和对应的视觉证据(如3D框裁剪出的图像/特征)。- 将每个物体的
(查询特征, 视觉证据)
对,连同原始的语言指令,一起输入到一个VLM中(如LLaVA, GPT-4V等)。 - VLM的任务是回答一个问题:“根据提供的视觉证据,这个物体是否满足‘[语言指令]’?”。VLM可以输出“是/否”的判断以及解释理由(e.g., “是的,因为图像显示该车的转向灯已亮起,且其轨迹正在向右偏转”)。
- 优势: 极大地增强了模型的推理能力和可解释性,能处理更复杂的语言指令。
- 方向: 将
引入场景图与关系建模 (Graph-based Relational Reasoning)
- 方向: 显式地建模场景中物体之间的时空关系。
- 具体方案:
- 在每一帧,基于跟踪器输出的所有物体,构建一个动态的场景图(Scene Graph)。图中的节点是物体,边则代表它们之间的关系(如“在…旁边”,“在…前面”,相对速度等)。
- 语言指令也被解析成一个查询图。
- 任务就变成了在动态场景图中进行子图匹配,找到与指令图最匹配的物体子集。
- LLM可以被用来理解指令并生成查询图,或者在图上进行推理。
迈向对话式交互跟踪 (Conversational Tracking)
- 方向: 将模型从“一次性任务”升级为“多轮对话系统”。
- 具体方案:
- 引入一个LLM作为对话管理器和记忆中心。
- LLM负责维护对话历史。当用户输入新指令时,LLM首先结合上下文理解其真实意图(例如,“它”指代的是上一轮正在跟踪的物体)。
- 然后,LLM向底层的
PromptTrack
感知模块下达更新后的、明确的跟踪目标。 - 这需要构建新的对话式跟踪数据集,或者在NuPrompt上进行扩展。
注入世界知识进行预判式跟踪 (Anticipatory Tracking)
- 方向: 让模型具备基于常识和规则进行预测的能力。
- 具体方案:
- 当收到一个包含意图或可能性的指令时(如“跟踪可能要并线的车”),首先将场景的文本化描述(如“场景中有一辆蓝色轿车在卡车后方,车速很快”)和指令一起喂给一个LLM。
- LLM利用其内置的世界知识和驾驶常识,生成一个**“假设”**(Hypothesis),例如:“蓝色轿车由于前方有慢车,且与邻道有足够空间,很可能会并线超车”。
- 这个假设将作为一种强先验(Prior),指导底层的视觉感知模块去重点关注和验证这个假设。这就形成了一个**“假设-验证”**的闭环。
Appendix
Appendix1:数据集生成流程
目标是创建一个高质量的数据集,其中每一条自然、流畅的描述性句子(例如:“正在超车的那几辆车”)都能精确地对应到视频画面中的一组特定物体(例如:那两三辆正在进行超车动作的汽车的边界框)。
这个过程被巧妙地分成了三个步骤,从最基础的元素开始,逐步组合,最终生成复杂的描述,实现了效率和质量的平衡。
步骤 1:语言元素收集 (Language Element Collection)
- 这是什么? 这是最基础的数据“原材料”采集阶段。它不是直接写句子,而是将物体拆解成最基本的、不可再分的 “标签”或“属性” ,也就是文中提到的“语言元素”。例如,“一辆正在左转的红色汽车”可以被拆解为三个独立的元素:
红色
(颜色)、汽车
(类别)、左转
(动作)。 - 如何操作?
- 系统界面:如图所示,标注员面对的是一个包含多视角视频画面的标注工具。
- 输入元素并点击:标注员在输入框里输入一个语言元素,比如“白色 (White)”。然后,他在视频画面中用鼠标点击所有符合“白色”这个属性的物体(例如图中的两辆白色汽车)。系统就会自动将“白色”这个标签与这两辆车的边界框关联起来。
- 动态更新:这是针对视频数据的关键一步。如果一辆车刚开始是“正在移动”,后来停下来了,那么“正在移动”这个元素就不再适用于它了。标注员需要在它停下的那一帧,再次点击这辆车,将其从“正在移动”的列表中移除。这确保了标签在时间上的准确性。
- 质量控制:为了保证标注的丰富性和准确性,会有多名(文中提到五名)标注员对同一段视频进行独立标注,之后还有另外两名检查员进行审核。
- 此步的产出:大量的、被语言元素标记过的物体边界框。例如:
物体A
标记为 {汽车
,白色
,静止
};物体B
标记为 {行人
,黑色衣服
,过马路
}。
步骤 2:语言元素组合 (Language Element Combination)
- 这是什么? 这是“搭积木”的阶段。将步骤 1 中收集到的基础“积木块”(语言元素)进行有意义的组合,从而定义出更具体的“物体群体”。
- 如何操作?
- 逻辑运算:核心操作是逻辑“与 (AND)”。这意味着取不同元素所对应物体集合的交集。
- 组合实例:
- 如图所示,我们有“语言元素:白色”对应的物体集合,和“语言元素:汽车”对应的物体集合。
- 将它们进行“与”操作组合,就得到了一个新的集合:“组合:白色,汽车”。这个新集合里只包含既是“白色”又是“汽车”的物体。
- 同样地,“组合:左侧,汽车”只包含那些既在“左侧”又是“汽车”的物体。
- 人工筛选:这个组合不是随机乱组的,而是由标注员手动选择有意义的组合方式,比如“颜色+类别”或“位置+类别”,而“颜色+位置”可能意义就不大。
- 此步的产出:一个“组合标签”与一个“物体边界框集合”的对应关系。例如:组合标签
[白色, 汽车]
对应 {物体A
,物体D
,物体F
} 这三个边界框。
步骤 3:提示生成 (Description Generation)
- 这是什么? 这是最后一步,将“机器语言”(如
[白色, 汽车]
)转化为**“人类语言”**(如“那些白色的汽车”)。 - 如何操作?
- 利用大语言模型 (LLM):手动编写成千上万条自然流畅且多样的句子成本极高。因此,这里引入了像 GPT-3.5 这样的大语言模型来自动化这个过程。
- 设计指令 (Prompt Engineering):研究人员会向 LLM 发送一个精心设计的请求。这个请求告诉 LLM 它需要做什么,并提供步骤 2 中得到的组合标签。例如,请求模板是:“根据以下描述生成一个句子来描述这些物体:
[这里填入组合标签]
”。 - 生成句子:
- 当输入是
[白色, 汽车]
时,LLM 可能会生成:“The cars that are in white.” (那些白色的汽车)。 - 当输入是更复杂的
[行人, 移动中, 红色, 不在左侧]
时,LLM 可能会生成:“这些物体是红色的行人,目前正在移动中,不位于左侧。”
- 当输入是
- 多次生成与人工筛选:为了获得多样化的描述,他们会多次请求 LLM 生成不同的句子。最后,依然需要人工标注员来筛选掉那些不通顺、不准确或有歧义的句子,确保最终成品的质量。
- 此步的产出:最终的数据成品!也就是一个自然语言句子与一个精确的物体边界框集合之间的配对。
假设我们有这样一段视频:画面前方有两辆白色汽车正在行驶,左侧有一辆静止的蓝色卡车,右侧有一个穿着红色T恤的行人正在过马路。
▶ 步骤 1:语言元素收集
- 标注员 A 输入
汽车
,点击两辆白色汽车和蓝色卡车。 - 标注员 B 输入
卡车
,点击蓝色卡车。 - 标注员 C 输入
行人
,点击那个行人。 - 标注员 D 输入
行驶中
,点击两辆白色汽车。当它们停下时,再点击取消。 - 标注员 E 输入
静止
,点击蓝色卡车。 - 标注员 F 输入
白色
,点击两辆白色汽车。 - 标注员 G 输入
蓝色
,点击蓝色卡车。 - 标注员 H 输入
红色
,点击那个行人(特指其衣服)。
▶ 步骤 2:语言元素组合
系统或标注员决定进行以下有意义的组合:
- 组合 1:
白色
AND汽车
AND行驶中
- 结果: 得到一个包含两辆白色汽车的物体集合。
- 组合 2:
蓝色
AND卡车
AND静止
- 结果: 得到一个包含那辆蓝色卡车的物体集合。
- 组合 3:
红色
AND行人
- 结果: 得到一个包含那个行人的物体集合。
▶ 步骤 3:提示生成
现在,将这些组合交给 GPT-3.5:
对于组合 1 (
[白色, 汽车, 行驶中]
):- 请求: “根据以下描述生成一个句子:白色, 汽车, 行驶中”
- LLM 可能的输出:
- “那两辆正在行驶的白色汽车。”
- “画面中白色的车在动。”
- “追踪所有在路上开的白色汽车。”
- 人工筛选: 标注员可能选择 “那两辆正在行驶的白色汽车。” 因为它最准确自然。
对于组合 2 (
[蓝色, 卡车, 静止]
):- 请求: “根据以下描述生成一个句子:蓝色, 卡车, 静止”
- LLM 可能的输出: “那辆停着的蓝色卡车。”
最终,数据集里就多了这样几条宝贵的数据:
- 数据条目1: { 句子: “那两辆正在行驶的白色汽车。”, 对应物体: [白色汽车1的边界框, 白色汽车2的边界框] }
- 数据条目2: { 句子: “那辆停着的蓝色卡车。”, 对应物体: [蓝色卡车的边界框] }
Appendix2:论文方法流程解析
假设我们现在的任务是处理这样一个场景:
- 语言指令 (Language Prompt): “The vehicles that are turning right.” (正在向右转的车辆)
- 视觉输入 (Visual Input): 自动驾驶车采集到的连续多帧、每帧6个摄像头(前、前左、前右、后、后左、后右)的图像数据 。
最终目标: 在连续的视频帧中,模型需要只框出那些正在右转的车辆,忽略直行的、静止的、或左转的车辆,并持续跟踪它们。
模型处理流程 (以第 t
帧为例)
第零步:模型状态初始化 (在第1帧或需要时)
在处理第一帧图像前,模型需要初始化一些状态。
- Detection Queries (检测查询): 这是一组固定的、可学习的嵌入向量,专门用于在场景中发现“新出现”的物体。
- 数据结构: 一个Tensor。
- Shape:
(num_detection_queries, D)
,例如(500, 256)
。 - 含义:
500
个“探测器”,每个探测器由一个256
维的特征向量代表,准备去场景中寻找新目标。
- Tracking Queries (跟踪查询): 在第一帧时,这个是空的。它用于存储从上一帧传递过来的、代表已被跟踪物体的查询。
第一步: 输入编码 (Input Encoding)
模型接收当前 t
帧的数据。
输入:
- 多视角图像 (Multi-view Images): 当前
t
帧的6张摄像头图片。- 数据结构: 一个Tensor。
- Shape:
(B, N, C, H, W)
,例如(1, 6, 3, 256, 704)
。 - 含义: 批次大小为1,
N=6
个视角,C=3
个RGB通道,图像高H
宽W
。
- 语言指令 (Language Prompt): 字符串 “The vehicles that are turning right.”
- 多视角图像 (Multi-view Images): 当前
处理:
- 图像编码: 图像被送入一个图像主干网络(如ResNet, VoVNet)来提取特征。
- 文本编码: 语言指令被送入一个文本编码器(如BERT或CLIP Text Encoder)来提取其语义特征。
输出:
- 视觉特征图 (Visual Features, F _ t F\_t F_t):
- Shape:
(B, N, D, H', W')
,例如(1, 6, 256, 16, 44)
。 - 含义: 6张特征图,维度
D=256
,尺寸H', W'
比原图小。
- Shape:
- 文本特征 (Linguistic Features, S S S):
- Shape:
(B, L, D)
,例如(1, 7, 256)
。 - 含义: 批次大小为1,指令被分词成
L=7
个token(例如 “the”, “vehicles”, “that”, …),每个token是一个256
维的向量。
- Shape:
- 视觉特征图 (Visual Features, F _ t F\_t F_t):
第二步: 跨模态特征融合 (Cross-Modal Fusion)
这是让视觉特征“理解”语言指令的关键一步。
输入:
- 视觉特征 F _ t F\_t F_t
- 文本特征 S S S
处理: 论文中提到使用跨模态注意力 (Cross-Modal Attention) 。
- 将视觉特征 F _ t F\_t F_t 作为Query。
- 将文本特征 S S S 作为Key和Value。
- 通过注意力计算,视觉特征的每个位置都会去“关注”文本特征中与之最相关的部分。例如,图像中车辆区域的特征可能会更多地关注"vehicles"和"turning right"这两个词的特征。
输出:
- 指令感知的视觉特征 (Prompt-aware Visual Features, F _ t ′ F\_t' F_t′):
- Shape: 与输入视觉特征 F _ t F\_t F_t相同,例如
(1, 6, 256, 16, 44)
。 - 含义: 特征图的数值已被更新。现在,那些与“正在右转的车辆”语义上更相关的图像区域(比如车辆的轮廓、车轮的角度等)的特征得到了增强。
- Shape: 与输入视觉特征 F _ t F\_t F_t相同,例如
- 指令感知的视觉特征 (Prompt-aware Visual Features, F _ t ′ F\_t' F_t′):
第三步: 解码器输入准备 (Prepare for Decoder)
输入:
- 指令感知的视觉特征 F _ t ′ F\_t' F_t′
- 上一帧传递来的
Tracking Queries
(假设有k
个) - 固定的
Detection Queries
(500
个)
处理:
- 3D位置编码: 为指令感知的视觉特征 F _ t ′ F\_t' F_t′ 添加3D位置编码 。这使得模型能够理解每个像素在真实3D世界中的大致位置,对于3D检测至关重要。
- 合并查询: 将
Tracking Queries
和Detection Queries
拼接起来。Tracking Queries
来自上一帧,已经包含了物体的3D位置先验和特征,用于持续跟踪;Detection Queries
用于发现新物体。
输出:
- 位置增强的视觉特征: Shape不变,
(1, 6, 256, 16, 44)
。 - 合并后的输入查询 ( Q _ t Q\_t Q_t):
- Shape:
(B, 500+k, D)
,例如(1, 510, 256)
(假设上一帧跟踪了10个物体)。 - 含义:
510
个“物体候选者”准备进入解码器进行最终确认和定位。
- Shape:
- 位置增强的视觉特征: Shape不变,
第四步: Transformer解码与时序推理 (Decoder & Temporal Reasoning)
这是模型的核心计算部分,集成了PF-Track的能力。
输入:
- 合并后的输入查询 Q _ t Q\_t Q_t
- 位置增强的视觉特征
- 历史查询缓存 (用于Past Reasoning)
处理:
- Transformer Decoder: 输入查询 Q _ t Q\_t Q_t 与视觉特征进行多层交互,输出更新后的查询和初步的3D框预测 。
- Past Reasoning (过去推理): 利用过去几帧中该物体的查询特征,来平滑和修正当前帧的预测结果,使其更稳定、更精确 。例如,可以防止因单帧遮挡导致的物体特征突变。
- Future Reasoning (未来推理): 基于当前修正后的结果,预测物体在下一帧的可能位置 。这个预测的位置会用来更新当前物体的查询,作为下一帧的
Tracking Query
输入,能更好地应对车辆运动带来的位置变化。
输出:
- 精炼后的物体查询 ( Q _ t R Q\_t^R Q_tR):
- Shape:
(B, 500+k, D)
,例如(1, 510, 256)
。 - 含义: 代表了场景中所有被检测和跟踪的物体的最精确特征描述。这里面既有右转的车,也有直行的车,还有行人等。
- Shape:
- 精炼后的3D边界框 ( B _ t R B\_t^R B_tR):
- Shape:
(B, 500+k, box_dims)
,例如(1, 510, 8)
(中心点、尺寸、朝向角等)。 - 含义: 对应上述每个物体的3D位置和姿态。
- Shape:
- 下一帧的跟踪查询 ( Q _ t + 1 t r a c k Q\_{t+1}^{track} Q_t+1track):
- Shape:
(B, num_tracked, D)
,例如(1, 12, 256)
(假设当前帧总共跟踪了12个物体)。 - 含义: 准备传递给
t+1
帧的查询。
- Shape:
- 精炼后的物体查询 ( Q _ t R Q\_t^R Q_tR):
第五步: 指令推理 (Prompt Reasoning) - 论文核心创新
这是最后一步,也是实现“按指令筛选”的关键。
输入:
- 精炼后的物体查询 Q _ t R Q\_t^R Q_tR (shape:
(1, 510, 256)
)
- 精炼后的物体查询 Q _ t R Q\_t^R Q_tR (shape:
处理:
- 将这
510
个物体查询的特征向量,逐一送入一个非常简单的全连接网络(MLP),该网络被称为“指令推理头”( m a t h c a l F l \\mathcal{F}^l mathcalFl) 。 - 这个MLP被训练来做一个二元分类任务:判断输入的特征向量所代表的物体,是否符合最初的语言指令。
- 将这
输出:
- 指令匹配概率 ( P _ t P\_t P_t):
- Shape:
(B, 500+k, 1)
,例如(1, 510, 1)
。 - 含义: 对应
510
个被跟踪物体的“指令匹配分”。分数越高,代表该物体越可能是“正在向右转的车辆”。
- Shape:
- 指令匹配概率 ( P _ t P\_t P_t):
第六步: 最终结果生成
输入:
- 精炼后的3D边界框 B _ t R B\_t^R B_tR (shape:
(1, 510, 8)
) - 指令匹配概率 P _ t P\_t P_t (shape:
(1, 510, 1)
)
- 精炼后的3D边界框 B _ t R B\_t^R B_tR (shape:
处理:
- 设定一个置信度阈值,例如0.5。
- 筛选出所有匹配概率 P _ t 0.5 P\_t \> 0.5 P_t0.5 的物体。
- 从 B _ t R B\_t^R B_tR 中取出这些被筛选出的物体对应的3D边界框。
最终输出:
- 一个3D边界框列表,只包含那些被模型判断为“正在向右转的车辆”的物体。例如,可能最后只输出了3个框,其他的(如直行的车、行人等)都被过滤掉了。
至此,模型在第 t
帧完成了从原始输入到按指令输出的完整流程。同时,它已经准备好了下一帧所需的 Tracking Queries
,可以继续这个循环。
以下是描述上述流程的、带注释的PyTorch伪代码。
import torch
import torch.nn as nn
class PromptTrack(nn.Module):
def __init__(self, image_encoder, text_encoder, cross_modal_fusion,
transformer_decoder, past_reasoning, future_reasoning,
num_detection_queries=500, feature_dim=256, box_dims=8):
"""
初始化模型的所有组件
"""
super().__init__()
self.image_encoder = image_encoder # 图像主干网络, e.g., ResNet
self.text_encoder = text_encoder # 文本编码器, e.g., BERT
self.cross_modal_fusion = cross_modal_fusion # 跨模态注意力模块
self.transformer_decoder = transformer_decoder # Transformer解码器
self.past_reasoning = past_reasoning # 过去推理模块
self.future_reasoning = future_reasoning # 未来推理模块
# 论文核心创新点: 指令推理头,就是一个简单的MLP
self.prompt_reasoning_head = nn.Sequential(
nn.Linear(feature_dim, feature_dim),
nn.ReLU(),
nn.Linear(feature_dim, 1) # 输出一个1维的logit,用于二元分类
)
# 可学习的检测查询,用于发现新目标
self.detection_queries = nn.Embedding(num_detection_queries, feature_dim)
# 用于存储跨帧信息的缓存
self.cached_tracking_queries = None # 上一帧的跟踪查询
self.cached_history_features = None # 过去几帧的特征,用于Past Reasoning
def forward(self, multi_view_images, language_prompt_tokens):
"""
模型的前向传播全流程
:param multi_view_images: (B, N, C, H, W), e.g., (1, 6, 3, 256, 704)
:param language_prompt_tokens: (B, L), e.g., (1, 7)
:return: 包含最终预测框、匹配分数和运动预测的字典
"""
# ===================== 步骤 1: 输入编码 =====================
# visual_features: (B, N, D, H', W'), e.g., (1, 6, 256, 16, 44)
visual_features = self.image_encoder(multi_view_images)
# text_features: (B, L, D), e.g., (1, 7, 256)
text_features = self.text_encoder(language_prompt_tokens)
# ===================== 步骤 2: 跨模态特征融合 =====================
# 将文本特征作为Key和Value,视觉特征作为Query,进行注意力计算
# prompt_aware_visual_features: (B, N, D, H', W'), 特征值被更新
prompt_aware_visual_features = self.cross_modal_fusion(
query=visual_features,
key=text_features,
value=text_features
) #
# ===================== 步骤 3: 解码器输入准备 =====================
# 获取固定的检测查询
# det_queries: (B, num_det_queries, D), e.g., (1, 500, 256)
det_queries = self.detection_queries.weight.unsqueeze(0).repeat(multi_view_images.shape[0], 1, 1)
# 如果是第一帧,没有跟踪查询
if self.cached_tracking_queries is None:
input_queries = det_queries
else:
# 合并上一帧的跟踪查询和本帧的检测查询
input_queries = torch.cat([self.cached_tracking_queries, det_queries], dim=1)
# 伪代码省略了3D位置编码的添加过程,但它作用于 prompt_aware_visual_features
# ===================== 步骤 4: Transformer解码与时序推理 =====================
# 经过Transformer解码器,得到初步结果
# decoder_output_queries: (B, num_total_queries, D)
# decoder_output_boxes: (B, num_total_queries, box_dims)
decoder_output_queries, decoder_output_boxes = self.transformer_decoder(
input_queries, prompt_aware_visual_features
)
# 经过Past Reasoning,利用历史信息精炼结果
# refined_queries (Q_t^R): (B, num_total_queries, D)
# refined_boxes (B_t^R): (B, num_total_queries, box_dims)
refined_queries, refined_boxes = self.past_reasoning(
decoder_output_queries,
decoder_output_boxes,
self.cached_history_features
)
# 经过Future Reasoning,预测运动并生成下一帧的跟踪查询
# next_frame_tracking_queries (Q_{t+1}^{track}): (B, num_tracked, D)
# motion_prediction: (B, num_tracked, future_steps, 2) e.g., (x,y) offset
next_frame_tracking_queries, motion_prediction = self.future_reasoning(refined_queries)
# ===================== 步骤 5: 指令推理 (Prompt Reasoning) =====================
# 将所有精炼后的物体查询送入指令推理头
# prompt_matching_logits: (B, num_total_queries, 1)
prompt_matching_logits = self.prompt_reasoning_head(refined_queries)
# 使用sigmoid得到0-1之间的概率
prompt_matching_scores = torch.sigmoid(prompt_matching_logits)
# ===================== 步骤 6: 状态更新与返回 =====================
# 更新缓存,为下一帧做准备
self.cached_tracking_queries = next_frame_tracking_queries
# 此处也应更新 self.cached_history_features,伪代码中省略
return {
"pred_boxes": refined_boxes, # 所有被跟踪物体的3D框
"pred_motions": motion_prediction, # 对这些物体的运动预测
"prompt_scores": prompt_matching_scores # 每个物体与指令的匹配分数
}