【论文阅读】Single-Stage Visual Query Localization in Egocentric Videos

paper:[2306.09324] Single-Stage Visual Query Localization in Egocentric Videos (arxiv.org)

code:hwjiang1510/VQLoC: (NeurIPS 2023) Open-set visual object query search & localization in long-form videos (github.com)

简介

动机:在长时第一人称视频中进行视觉查询定位(Visual Query Localization, VQL)需要对指定物体进行时空搜索和定位。之前的工作开发了复杂的多级pipeline,利用目标检测和跟踪方法实现 VQL。然而,每个阶段都是独立训练的,pipeline的复杂性导致推理速度慢。

VQLoC是一种新颖的单阶段 VQL 框架,可端到端训练。关键思想是:首先建立查询与视频之间的整体关系理解,然后以单次操作的方式执行时空定位。通过联合考虑查询与每个视频帧之间的查询到帧对应关系,以及相邻视频帧之间的帧到帧对应关系,来建立查询与视频之间的关系。准确率提高了 20%,推理速度提高了 10 倍。

egocentric videos)是指从第一人称视角拍摄的视频,即摄像机佩戴在拍摄者身上,通常是头部或胸部,使得视频呈现出拍摄者的视角。这样的视频展示了拍摄者在日常活动中的所见所闻,能够很好地捕捉拍摄者的动态和与环境的交互。

图 1:视觉查询定位 (VQL):(左)目标是长视频中定位视觉查询对象,如黄色边界框标记的响应轨迹所示。该任务的复杂性在于需要处理视频中出现的具有不同尺度、视角和状态的开放集对象查询;(右) VQLoC 首先通过联合 推理查询到帧(空间)和 帧到帧(时间)对应关系,建立查询与视频之间的整体理解,然后以单阶段、端到端可训练的方式进行响应定位。

VQL是情景记忆基准中的一项关键任务,旨在回答“我最后一次看到物体X是在哪里?”的提问。具体来说,给定一个代表人类摄像头佩戴者过去经历的长时第一人称视频,目标是在时空中搜索并定位指定为视觉图像裁剪的视觉查询对象(图1左)。

之前的工作通过一个三阶段的自底向上的框架来解决 VQL:

  1. 在每个视频帧中检测所有对象,并与视觉查询进行成对比较,以获得与查询最相似的提议;
  2. 识别整个视频中的相似度分数峰值;
  3. 在最近的峰值执行双向跟踪以恢复时空响应。

限制:严重依赖于第一阶段通过独立查看每个帧来检测对象。帧级目标检测中的错误可能会导致整个系统失败,因为框架不是端到端可微分的,早期阶段的错误可能无法在后期纠正。此外,由于与冗余目标建议进行两两比较的复杂性较高,推理速度较慢。

VQLoC结构:联合建模了查询与每个视频帧之间的查询-帧关系,以及相邻视频帧之间的帧-帧关系(图1右),然后以单阶段、端到端可训练的方式进行时空定位。具体来说,

  1. 用DINO预训练的ViT主干提取视觉查询和每个视频帧的图像特征,并使用交叉注意transformer查询与视频帧中图像区域之间的对应关系。
  2. 然后,利用视频的时间连续性产生的帧-帧关系,用自注意transformer将这些对应关系在时间上进行传播,捕捉整体的查询-视频的关系。
  3. 最后,用卷积预测头,通过利用查询-视频关系进行帧级预测,来进行时空定位。

模型在单阶段操作,没有中间定位输出和专门的后处理步骤,并且是端到端可训练的,因为它只使用可微分模块来获得最终预测。与分阶段方法相比,VQLoC的优点:

  1. 与之前在视频帧中显式生成对象提议并与视觉查询比较的工作不同,VQLoC通过在视觉查询特征和视频帧特征之间执行注意力推理,隐式建立查询-帧关系。有效利用了背景和非查询对象的图像区域,作为推理的上下文信息。
  2. 隐式查询到帧关系的计算速度快于显式生成提议并两两比较。
  3. 最后,VQLoC是端到端可训练的,性能更好。

方法

图2:从对应关系中进行视觉查询定位(VQLoC)。首先建立查询-视频的整体关系,然后推断对查询的响应来解决VQL问题。VQLoC独立提取查询和视频帧的图像特征。用transformer模块(Spatial TX)在查询特征q和每个视频帧特征vi之间建立查询-帧的对应关系,并得到对应特征f,用于识别帧中潜在的查询相关区域。然后,VQLoC用另一个transformer模块(SpatioTemporal TX)在时间上传播这些帧级别的对应关系,该模块利用相邻视频帧之间的帧与帧对应关系,并获得查询与视频的对应特征v*。最后,VQLoC利用查询-视频对应关系,预测每帧的边界框和查询对象在帧中出现的概率。

公式

VQL任务视为开放集定位,比如查询“我最后一次看到钱包是在哪里?”给定一个T帧的第一人称视频V = {v1,···,vT},和查询对象Q,目标是在时空上定位查询对象在视频中最近一次出现的位置。定位结果是响应轨迹R = {rs, rs+1,…, re},s和e分别是开始帧和结束帧索引,ri是包含第i帧上的查询对象的边界框。

架构

VQLoC使用共享的图像编码器来提取视频帧和查询的视觉特征。用DINO预训练的ViT捕捉语义对应关系 。步骤:

  1. 首先,VQLoC用spatial transformer来查找每个视频帧和查询之间的查询-帧的对应关系。
  2. 然后,VQLoC用一个spatial-temporal transformer,利用时间连续的帧-帧对应关系,随时间传播查询-帧的对应关系,并建立查询-视频的对应关系。
  3. 最后,利用对查询-视频关系的整体理解来预测响应轨迹。

组件:

  • 视觉编码器。由一个固定的DINO预训练的ViT和几个可学习的卷积层组成。分别对T个视频帧和视觉查询提取视觉特征,得到视频特征v∈R T ×H×W×C和查询特征q∈R H×W×C。H, W表示特征的空间分辨率,C表示通道大小。
  • spatial transformer。利用视觉特征之间的交叉注意力,在视觉裁剪和每个视频帧之间建立查询-帧的对应关系。设vi∈R HW×C为视频帧i的平面化视频特征vi,设q∈R HW×C为平面化查询特征q。得到查询-帧对应特征fi:FFN是一个前馈神经网络,通过合并相应的查询特征q来更新帧特征vi。交叉注意力计算它们的特征相似度作为融合权重。transformer的输出 fi 重塑为R H×W×C。更新后的特征可以保留空间排列并保持空间线索以进行精确定位。对所有视频帧重复此过程,以获得最终的查询到帧对应特征f∈R T×H×W×C。
  • Spatio-Temporal Transformer。在相邻视频帧之间建立帧-帧的对应关系,传播和优化Eqn. 1得到的查询-帧的对应特征 f 。利用视频的时间连续性。如图3,首先使用共享卷积层降低特征映射f的空间分辨率,输出为¯fd∈R T ×h×w×c。h, w和c是下采样后的特征图的空间分辨率和通道大小。将3D的spatio-temporal positional embedding p∈R T ×h×w×c加入¯fd,并将其展开为一维的token:。 其中,p 是可学习的,初始值为零。然后用Spatio-Temporal Transformer来建立查询-视频的关系。它由多层局部窗口的时间自注意力组成,将特征传播限制在一个局部时间窗口内。比如,属于时间 t 的特征元素仅关注时间步长范围 [t−w,t+w] 内的特征元素。t−w 和 t+w 是时间长度 2w+1 的局部窗口的起始和结束。这样做是因为查询对象在相邻帧中的位置高度相关,可为特征细化提供强先验。通过掩码注意力权重实现局部窗口的注意力。特征优化后,将一维的tokens重塑成原始的三维形状,以获得查询-视频的对应特征 v∗∈RT×h×w×c。(时空位置编码从3D→1D→3D)
  • 预测头。不直接预测图像的单个边界框,而是首先在特征图上定义锚框B∈R h×w×n×4。这样可以让多尺度锚框提供对查询对象大小和位置的强先验。对于每一帧,为特征图的每个空间元素定义n个锚框(共h x w个元素)。在特征图空间上定义的每个锚框可以映射回其在像素空间中的对应位置,用于推断预测结果。对于每一帧vi,通过将查询-视频的对应特征 vi∗ 传递到两个预测头来获得预测:预测头由几个卷积块组成。Pi为锚级别的查询对象出现概率,∆bi是回归边界框细化。将∆bi重塑为R h×w×n×4,记为∆Bi。第 i 帧的最终细化锚框为 ^Bi = B + ΔBi 。对所有帧执行相同的操作。

图3:Spatio-Temporal Transformer的架构(左):将下采样的查询到帧对应特征¯fd与三维的spatio-temporal positional embedding相加,并展开为一维token(fd)。利用相邻视频帧之间的帧-帧对应关系,用几个Transformer层在局部时间窗口内,随时间传播帧级对应关系,并获得整体的查询-视频对应特征v∗

预测头的架构(右):在建立查询-视频关系后,用它来预测每个视频帧i的锚点级别结果。在训练时进行标签关联,并在测试时选择概率最高的优化锚点作为该帧的预测结果。

训练

在所有的片段帧上,用

训练VQLoC,用于监督边界框回归和查询对象发生概率预测。对于每一个锚框,计算该锚框与真实查询目标框之间的交并比(IoU)。大于阈值θ,则标记为正样本框,表示该锚框区域能很好地捕捉到查询目标。

边界框损失函数, 其中 b 是查询目标的真实边界框,B^ 是正样本框的集合。Lreg​ 是 L1 损失和 GIoU 损失的组合。

bc​、bh和 bw​ 分别是边界框的中心坐标、高度和宽度,λgiou​ 是平衡损失的权重。为了计算查询目标的概率损失,将概率标签赋给正样本和负样本锚框,分别为 1 和 0。将赋予的概率标签记为 P。查询目标出现的概率损失定义为 Lprob=Lbce(P^,P),其中 Lbce是二元交叉熵(BCE)损失。

由于目标视频较长,误报预测(即模型错误地将其他物体识别为查询目标)是限制模型时间精度的瓶颈之一。为了防止这种情况发生,执行难负样本挖掘(HNM)。给定一个包含 N 个视频的 mini-batch,对于每个 batch 元素 n,将来自其他视频 n′≠n 的帧视为负样本,来增加负样本的多样性。扩展负样本池后,用公式计算所有负样本锚框的查询目标出现的概率,并选择具有最大 BCE 损失的前 K 个锚框作为困难负样本(即模型认为是正样本的负样本)。然后用同一 batch 元素中的正样本和从所有 batch 元素中采样的困难负样本,利用 BCE 损失来训练模型。训练过程中将正样本与负样本的比例保持为 1:3。

推理。选择查询目标概率最高的锚框来获得每一帧的预测。对于低置信度的预测,对预测的查询目标概率应用阈值 ϕ 来剔除。

实验

实现细节。视频分辨率为448×448,沿长边调整大小,并对每帧的短边零填充。损失系数 λp=1 和 λgiou=0.3。正样本锚框的阈值为 θ=0.2。

采用 DINOv2 的 ViT-B14 作为骨干网络,并在帧率为 5 fps 的 30 帧剪辑上进行训练。剪辑是随机选择的,确保覆盖至少部分响应轨迹。在空间分辨率 16 × 16 的特征图上定义锚框,每个元素有 12 个锚框,分别对应 4 个基础尺寸(162x162 , 322x322 , 642x642 , 1282x1282)和 3 个纵横比(0.5, 1, 2)。对剪辑应用了随机数据增强,例如颜色抖动、水平翻转和随机调整大小的裁剪。

数据集。Ego4D 是一个大规模的第一人称视频数据集,专为理解第一人称视频设计,包含在各种场所执行的日常活动的开放世界录制。指标:时间平均精度(tAP25)和时空平均精度(stAP25),它们通过使用 0.25 的交并比(IoU)阈值评估预测的响应轨迹的时间和时空范围与真实值的准确性。 恢复率(rec%):量化了预测框与真实框的 IoU 达到至少 0.5 的预测帧的百分比。成功率(Success):用于衡量预测与真实值之间的 IoU 是否超过 0.05。

 

结论

VQLoC,一种用于长时视频中视觉查询定位(VQL)问题的单阶段、端到端可训练方法。首先构建查询与视频之间的整体关系理解,并利用这种理解在一次操作中定位查询目标。关键见解在于如何建立查询与视频特征之间的时空对应关系。具体来说,为每个视频帧构建查询到帧的对应关系,然后通过利用视频的时间平滑性将这些对应关系传播到相邻的帧。与之前的阶段性方法相比,VQLoC不仅在时空定位准确性上表现更好,还通过避免显式的区域提议与查询之间的比较显著提高了推理速度。

局限性。与先前的工作类似,VQLoC是在监督学习的方式下进行训练的,需要大量的标注数据。此外,超参数(如局部窗口长度)可能需要针对具有不同帧率(FPS)的其他数据集进行调整,以便训练或推理。

复现

处理数据

直接下载,报错无权限:ego4d --output_directory="/data/VQLoC_main/data" --datasets full_scale

Datasets to download: {'full_scale'}
Download Path: /data/VQLoC_main/data/v2
Downloading Ego4D metadata json..
Traceback (most recent call last):
  File "/opt/conda/envs/vqloc/bin/ego4d", line 8, in <module>
    sys.exit(main())
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/ego4d/cli/cli.py", line 251, in main
    main_cfg(config)
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/ego4d/cli/cli.py", line 74, in main_cfg
    metadata_path = download_metadata(
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/ego4d/cli/manifest.py", line 199, in download_metadata
    _metadata_object(version, s3).download_file(str(download_path))
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/boto3/s3/inject.py", line 361, in object_download_file
    return self.meta.client.download_file(
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/boto3/s3/inject.py", line 192, in download_file
    return transfer.download_file(
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/boto3/s3/transfer.py", line 406, in download_file
    future.result()
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/s3transfer/futures.py", line 103, in result
    return self._coordinator.result()
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/s3transfer/futures.py", line 266, in result
    raise self._exception
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/s3transfer/tasks.py", line 269, in _main
    self._submit(transfer_future=transfer_future, **kwargs)
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/s3transfer/download.py", line 354, in _submit
    response = client.head_object(
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/botocore/client.py", line 569, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/opt/conda/envs/vqloc/lib/python3.8/site-packages/botocore/client.py", line 1023, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden

需要申请AWS账户,但我没有信用卡(...)无法申请

发送申请Ego4D数据集:

后续:被拒,要求地址必须填英文字母,重新申请凭证,等待一天

也可以参考:

【国内下载Ego4D数据集】-CSDN博客

如何在 Linux 下安装 AWS CLI ?_liunx安装awscli-CSDN博客

下载地址:Start Here | Ego4D (ego4d-data.org)

数据集大小:

测试

Use ./inference_predict.sh to inference on the target video clips. 

问题1:ModuleNotFoundError: No module named 'model.corr_clip_anchor'

Traceback (most recent call last):
  File "inference_predict.py", line 21, in <module>
    from evaluation import eval_utils
  File "/data/VQLoC_main/evaluation/eval_utils.py", line 3, in <module>
    from utils.loss_utils import GiouLoss
  File "/data/VQLoC_main/utils/loss_utils.py", line 7, in <module>
    from model.corr_clip_anchor import default_aspect_ratios
ModuleNotFoundError: No module named 'model.corr_clip_anchor'

 翻issue得知:

解决方法:在loss_utils.py中注释掉 from model.corr_clip_anchor import default_aspect_ratios,添加一行:default_aspect_ratios = torch.tensor([0.25, 0.5, 1.0, 2.0, 4.0]),解决

问题2:ImportError: libGL.so.1: cannot open shared object file: No such file or directory

解决方法:pip install opencv-python-headless、

问题3:FileNotFoundError:

Traceback (most recent call last):
  File "inference_predict.py", line 125, in <module>
    with open(annotation_path) as fp:
FileNotFoundError: [Errno 2] No such file or directory: '/vision/hwjiang/episodic-memory/VQ2D/data/vq_test_unannotated.json'

解决方案:没处理数据,回到上一步,需要自行下载并处理数据集(非直接开源)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值