《ActionFormer: Localizing Moments of Actions with Transformers》阅读笔记

论文地址:https://arxiv.org/abs/2202.07925

项目地址:GitHub - happyharrycn/actionformer_release: Code release for ActionFormer (ECCV 2022)

---------------------------------------------------------------------------------------------------------------------------------

动机:

        基于自注意力机制的Transformer模型在图像分类目标检测方面展示了令人印象深刻的成果,并且最近在视频理解方面也取得了成功。

提出:

        ActionFormer——一种简单但功能强大的模型,用于单次识别时间上的动作并识别其类别,而无需使用动作提议或依赖预定义的锚窗口。ActionFormer结合了多尺度特征表示与局部自注意力,并使用轻量级解码器对每一时刻进行分类并估计相应的动作边界。

大致过程:

        ActionFormer是一种单阶段无锚的TAL模型,集成了局部自注意力来从输入视频中提取特征金字塔。输出金字塔中的每个位置代表视频中的一个时刻,并被视为一个动作候选。一个轻量级卷积解码器进一步应用于特征金字塔,以将这些候选分类为前景动作类别,并回归前景候选与其动作起始和结束之间的距离。结果可以轻松解码为带有标签和时间边界的动作。

贡献:

        最早提出基于Transformer的单阶段无锚TAL模型的研究之一

        开发TAL的Transformer模型的关键设计选择,并展示了一个效果出乎意料好的简单模型

        在主要基准上实现了state-of-the-art结果,并提供了一个坚实的TAL基线

结果:

        在THUMOS14、ActivityNet 1.3和EPIC-Kitchens 100数据集取得显著提升。

方法细节:

问题定义:

        输入视频特征:X = \{X_1, X_2, ..., X_T\},其中t=\{1,2,3,...,T\}x_t是从3D卷积提取出的t时刻视频片段特征

目标:

        预测动作标签Y=\{y_1, y_2, ..., y_N\}

其中,y_n为动作实例,N在不同视频中也不同;y_i=(s_i, e_i, a_i)

        s_i:动作开始时间

        e_i:动作结束时间

        a_i:动作标签,a_i\in (1,2, ..., C),C为预定类别

TAL任务:        具有挑战性的结构化输出预测问题。

动作定位的简单表示:

        作者的方法建立在动作定位的无锚表示的基础上

关键思想:

        将每个时刻分类为动作类别背景

        并进一步优化时间步与动作的起始和偏移的距离

        X=(x_1, x_2, ..., x_T) \rightarrow Y=(y_1, y_2, ..., y_N)

        将结构化输出预测问题转化为序列标签问题

        X=(x_1, x_2, ..., x_T) \rightarrow \hat{Y}=(\hat{y}_1, \hat{y}_2, ..., \hat{y}_N)

   其中,\hat{y}_t=(p(a_t), d^s_t, d^e_t), t 时刻预测结果。

1)p(a_t)由C个值组成(C表示动作类别),每个值对应该类别的概率

2)d^s_t> 0, d^e_t> 0表示t时刻,动作开始(结束)的偏移距离,若t时刻标签为背景,d^s_t, d^e_t无意义

Encode Videos with Transformer

        编码器g将输入视频 X = \{X_1, X_2, ..., X_T\}编码为多尺度特征表示Z = \{Z^1, Z^2, ..., Z^L\}

编码器 g :

        (1) 一个使用卷积网络的投影函数,将每个特征x_t嵌入到一个 D 维空间中

        (2) 一个Transformer网络,将嵌入的特征映射到输出特征金字塔 Z

投影:

        投影 E 是一个浅层卷积网络,以ReLU作为激活函数

Z^0 = [E(X_1), E(X_2), ..., E(X_T)]

        其中,E(x_i)\in R^D 是x_i的嵌入特征。

        在Transformer网络之前添加卷积有助于更好地结合时间序列数据的局部上下文,并稳定视觉Transformer的训练,并且不再按照Transformer的形式添加位置编码,这样会降低模型性能。

局部自注意力:

        Transformer的核心是自注意力,将Z^0作为输入,具有T 个时间步骤和 D 维特征。 自注意力计算特征的加权平均,权重与输入特征对之间的相似度得分成正比

Q=Z^0W_Q, K=Z^0W_K, V=Z^0W_V

自注意力的输出为:

S = softmax(\frac{QK^T}{\sqrt{D_q}})V

其中,S \in R^{T\times D}  ,softmax按行执行。多头自注意(MSA)进一步并行地增加了几个自注意操作

        MSA的主要优势是能够整合整个序列的时间上下文,但这种优势是以计算成本为代价的,在内存和时间上的复杂度为O(T^2D\times TD^2),这对长视频来说效率极低。

本文设计:

        通过限制注意力在一个局部窗口内来适应的局部自注意力,因为超过一定范围的时间上下文对动作定位帮助不大。

        局部自注意力与多尺度特征表示Z = \{Z^1, Z^2, ..., Z^L\}结合使用,在每个金字塔层级上使用相同的窗口大小。通过这种设计,在一个下采样的特征图(16x)上使用一个小窗口大小(19)将覆盖一个大的时间范围(304)。

Multiscale Transformer

        Transformer有 L 个Transformer层,每层由交替的局部多头自注意力(MSA)和MLP块组成,在每个MSA或MLP块之前应用LayerNorm(LN),在每个块之后添加残差连接。MLP使用GELU激活函数。为了捕捉不同时间尺度的动作,可以选择性地附加一个下采样操作符↓(·)

\frac{T^{\ell-1}}{T^\ell}是下采样比率。  a^\ell\bar{a}^\ell是每通道可学习的缩放因子

下采样操作符 ↓ 使用一个跨步的深度卷积1D卷积实现,因为它效率很高。作者为模型使用了2倍下采样。

Decoding Actions in Time

        使用编码器 g 的特征金字塔 Z 解码为序列标签 \hat{Y}=(\hat{y}_1, \hat{y}_2, ..., \hat{y}_N)

        解码器 h 是一个轻量级的卷积网络,具有分类头回归头.

Classification Head(预测动作标签)

        给定特征金字塔 Z,我们的分类头会检查金字塔上所有 L 层的每个时刻 t,并预测每个时刻 t 的动作概率 p(a_t)

组成:

        分类网络使用 3 层 1D 卷积实现,卷积核大小为 3,前两层采用层归一化和 ReLU 激活函数。每个输出维度都附加一个 sigmoid 函数来预测 C 个动作类别的概率。该网络附加在每个金字塔层上,并且其参数在所有层之间共享。

Regression Head(预测动作开始和结束位置)

        与分类头类似,回归头会检查金字塔上所有 L 层的每个时刻 t,但仅在当前时间步 t 位于动作中时,预测到动作开始和结束的距离 (d^s_t, d^e_t)。每个金字塔层都预先指定了一个输出回归范围。

组成:

        与分类头相似,同样使用 1D 卷积网络实现,只是最后附加了一个 ReLU 用于距离估计。

ActionFormer: Model Design

ActionFormer 概念上非常简单:

        特征金字塔 Z 上的每个特征都输出一个动作评分 p(a_t) 和相应的时间边界 (d^s_t, d^e_t),这些结果随后被用来解码一个动作候选。

Design of the Feature Pyramid

关键组件是时间特征金字塔 Z = \{Z^1, Z^2, ..., Z^L\} 的设计。

  • 金字塔中的层数;
  • 连续特征图之间的下采样比率;
  • 每个金字塔层的输出回归范围。

通过对特征图使用 2 倍下采样并相应地将输出回归范围大致扩大 2 倍来简化我们的设计选择。

Loss Function

模型在每个时刻 t 输出 (p(a_t), d^s_t, d^e_t),包括动作类别的概率p(a_t)和到动作边界的距离 (d^s_t, d^e_t)。损失函数同样遵循简约设计,仅包含两个项:

  • L_{cls}​:用于 C 类二元分类的 Focal Loss;
  • L_{reg}:用于距离回归的 DIoU Loss。

其中,T_+为阳性样本总数。\mathbb{I}_{c_t}是指示函数,表示时间步长t是否在动作范围内,即正样本。

损失函数应用于输出金字塔的所有层,并在训练期间对所有视频样本进行平均。

\lambda _{reg} 是平衡分类损失和回归损失的系数。默认\lambda _{reg} = 1.

值得注意的是:

  •  L_{cls}使用 Focal Loss 来识别 C 类动作。Focal Loss 自然地处理了样本不平衡问题——负样本远多于正样本。
  •  L_{reg}​ 采用了可微的 IoU Loss,并且只有在当前时间步包含正样本时才启用 L_{reg}

Center Sampling

        在确定正样本时,只有在动作中心周围的区间内的时间步才被认为是正样本,其中区间的持续时间与当前金字塔层 \ell 的特征步幅成正比。

详细设计:

        给定一个以 c 为中心的动作,在金字塔层 \ell 上,任意时间步 t\in [c-\frac{\alpha T}{T^\ell}, c+\frac{\alpha T}{T^\ell}]  被视为正样本,其中 \alpha =1.5。中心采样不会影响模型推理,但鼓励在动作中心周围获得更高的分数。

Implementation Details

Training

  • 使用 Adam 优化器并进行预热训练。预热阶段对模型收敛和良好性能至关重要。
  • 在使用可变长度输入进行训练时,固定最大输入序列长度,按照需要填充或裁剪输入序列,并为模型中的操作添加适当的掩码。改变最大输入序列长度对性能影响很小

Inference

  • 将完整序列输入模型,因为模型中不使用位置嵌入
  • 模型接受输入视频 X,并在所有金字塔层上的每个时间步 t 输出 (p(a_t), d^s_t, d^e_t)。每个时间步 t 进一步解码一个动作实例(e_t = t - d^s_t, s_t = t + d^e_t, p(a_t)) 。e_t和 s_t 分别是动作的开始和结束时间,p(a_t) 是动作的置信度得分。通过 Soft-NMS 处理结果动作候选,以移除高度重叠的实例,生成最终的动作输出。

Network Architecture

        使用了 2 个卷积层进行投影,7 个 Transformer 块作为编码器(全部使用局部注意力,最后 5 个块进行 2 倍下采样),并使用独立的分类和回归头作为解码器。每个金字塔层的回归范围通过特征步幅进行归一化

Experiments

实验部分非常充足,大家可以细看论文!!!
<think> Hmm, the user is asking for a translation of a technical sentence about a web service plugin. The sentence is: "This plugin enables creating client side for Web services of the most common types." First, I need to analyze this technically. The key components are: - "This plugin": referring to a software extension - "enables creating": indicates functionality provision - "client side": the user-facing part of a web service - "Web services of the most common types": likely means SOAP, REST, GraphQL etc. The user seems to be working with web services and needs accurate technical translation. Given they're asking a programming expert, they're probably integrating this plugin into their development workflow. For translation accuracy: - "client side" should be translated as 客户端 in Chinese tech context - "Web services" is 网络服务 but 接口 might be more precise - "most common types" implies industry-standard protocols I recall that in Chinese technical documentation, such descriptions often use specific terminology. The translation should maintain the technical precision while sounding natural. The user didn't specify source/target languages, but since the query is in English and they want translation, Chinese is the likely target. They might be localizing documentation or understanding a Chinese tool's description. Better check if "Web services" should be 网络服务 or 服务接口 - the latter is more contemporary. Also "plugin" can be 插件 or 扩展 depending on context, but 插件 is more common for browser/IDE extensions. </think>该句的技术性翻译如下: **中文翻译**: 该插件支持为最常见类型的网络服务创建客户端。 **术语解析**: 1. **Plugin** → **插件** (软件扩展组件) 2. **Enables creating** → **支持创建** (强调功能实现) 3. **Client side** → **客户端** (服务调用方的技术实现) 4. **Web services of the most common types** → **最常见类型的网络服务** (指 SOAP/REST/GraphQL 等主流协议) **技术场景示例**: ```python # 假设使用该插件生成 REST API 客户端 from plugin import WebServiceClientGenerator # 初始化插件 generator = WebServiceClientGenerator(service_type="REST") # 生成客户端代码 client_code = generator.generate_client( endpoint="https://api.example.com/data", methods=["GET", "POST"] ) # 输出Python客户端代码 print(client_code) ``` ```output # 生成的客户端伪代码示例 class APIClient: def __init__(self, base_url): self.base_url = base_url def get_data(self, resource_id): # 自动生成的GET请求逻辑 response = requests.get(f"{self.base_url}/data/{resource_id}") return response.json() def post_data(self, payload): # 自动生成的POST请求逻辑 response = requests.post(f"{self.base_url}/data", json=payload) return response.status_code ``` **典型应用场景**: - 自动生成 SOAP/WSDL 服务的 Java 客户端 - 为 Swagger 文档描述的 REST API 创建 TypeScript 调用模块 - 根据 GraphQL Schema 生成 Python 查询封装
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值