动作识别终极指南
让我们从尝试构建问题开始。但是,我会马上说,在一般情况下,这是不可能的。什么是动作(action)?如果我们看一下研究任务动作识别(action recognition),这里也没有达成共识。第一个最受欢迎的学术数据集包含 2-20 秒涉及人员的情况片段:
第二个最受欢迎的数据集包含来自连接到衣服的相机的记录:
但这只是其中的一小部分。有任务“动作分类”、“视频分类”和“自监督动作识别”(这些是一些部分重叠的任务)。有带有骨架的数据集;有关于烹饪过程的数据集:
在某些数据集中,它是短视频,而另一些则很长。
什么是动作?动作(action)是一个事件(event),可以在视频上标记,先验地知道它可能在那里发生。一个人、一台机器、一只动物或其他东西可以产生一个事件。为什么我对这个定义更满意?通常,在实践中(99% 的时间),动作识别用于某些确定性过程。确定发生了一些需要计数/说明/控制的事件。
对于实际的计算机视觉任务来说,这个定义通常是正确的,但对于需要“通用定义”的学术研究来说就不是那么好了。它也不适用于所有视频流和内容分析系统。
它有什么不同?什么是“真实世界的任务”?实际任务通常具有有限的数据、摄像机位置和情况。例如,我从未见过必须从任何角度找到 400 个不同动作的任务。相反,现实世界的问题可能是这样的:
- 控制生产中操作的执行
- 监督顾客/店员
- 监督厨房的正确程序
- 将摄像头挂在头部/身体上的行为控制(运动员、警察等)
- 事故探测器
- 畜牧业过程识别
- 等等。
这只是其中的一小部分。但仍然:
- 相机很可能是固定的/至少是拧在人身上的。
- 你需要检测 1-10 个操作。非常非常罕见,10-100
我将要描述的方案通常适用于许多任务。我将从比学术方法简单得多的方法开始。并以更具实验性和学术性的结束。
为了清楚起见,在大多数示例中,我将使用人物作为参考,从侧面的某个地方查看。
1、分区
好的,让我们从一个基本的想法开始。假设您想识别一个人何时按门铃。你会怎么做?
在这种情况下,你能做的最后一件事就是从 Papers With Code 的首选方案开始运行训练。毕竟,从以下方面检测某些内容要容易得多:
- 靠近门铃的男人的手
- 一个男人在门口站了一会儿
你不需要火箭科学。一个训练有素的探测器和良好的定位相机就可以工作了。工作的结果将得到保证和解释。例如,如果手没有被发现,你可以看到原因—并尝试重新训练它(手套/奇怪的光等)。
因此,物体检测->检查工作区->检查相关条件非常有效。
这个基本的思路是你不需要识别动作,你需要了解正在发生什么事情。
2、对象
这种方法大致相同,其中操作描述是对象。当然,“在一般情况下”,你手中的煎锅并不意味着什么。但是,知道安装摄像头的上下文,它可能是在厨房里“做饭”,在商店里“销售”,或者在 PUBG 中“打架”。
通过组合“位置”和“对象”之间的逻辑,你可以组装长时间动作或动作序列。
对象可以是任何东西。框架中的衣服/产品/汽车等。
3、时序动作
让我们继续讨论适用于视频片段的方法。在这里,我会立即将“一段视频”的概念分为2.5种方式:
- 使用对象的骨骼模型
- 直接处理视频(处理整个视频、处理选定对象(人物、汽车等))
- 组合方法(使用感兴趣区域、与物体检测器组合、使用一些预处理(光流...等等,我什至不会写那个))
有什么区别?当你需要处理视频时,神经网络非常不方便。如果你拥有更高的性能、更复杂的数据集和更苛刻的训练,那将是最好的。摆脱视频处理的一种方法是预先检测骨架并对其进行处理。这可能是—
人体骨骼:
动物骨骼:
手部骨骼:
人脸关键点模型:
物体(汽车、沙发等)的骨骼模型。当然,更有趣的是那些可以动态的,例如挖掘机/机器人/等。
骨骼动画会丢失可能至关重要的纹理信息:服装、与之交互的物体和面部表情.....
也可以将这两个领域的一些东西结合起来。例如,将骨架用于可以从骨架中识别的动作部分。对于不能使用纹理信息的方法部分。
3、分类,经典方法
下面是实现经典分类的一个很好的方法集合:
MMAction 是在 MMCV 和 PyTorch 之上的一个正在开发但粗糙的框架。它变得越来越好。但还远非优秀。
PyTorchVideo 是 Facebook 尝试进行模拟的尝试,但它仍然很弱。但是原生的 PyTorch.
这里有一个很好的文章集合—动作分类,来自Papers with Code的动作识别。
全局来说,任务已经设定并且仍然如此。“输入一堆帧”(或骨架),输出动作。这一切都始于 2D 卷积:
然后发展对应于经典的“骨干,衰减”:
将所有内容移至 TimesFormer:
现在他们甚至把RL放在了上面:
而现在(2023 年),最受欢迎的是超大型预训练网络(我们稍后会谈到它们)。
注意此外,所有基准测试通常都位于不同的数据集上,因此无法进行比较。
可以注意到,所有方法都存在相同的问题:
- 数据集。它很难构建,也很难贴上标签。常规数据集是数以千计的示例。你需要各种各样的人、姿势和角度(如果这是目标的话)。没有人喜欢组装这样的数据集。
- 收敛。许多模型很难收敛。有时,你可以构建一个小数据集,但它不会收敛。但很难事先估计这一点。例如,我们遇到过在三个数据集上工作的动作识别模型在第四个数据集上不起作用的情况。很难理解它不起作用的原因。
- 框架不同部分的相同动作是一回事吗?并以不同的姿势?对于类似的活动,边界在哪里通过?复杂操作呢?问题的模糊性在对动作进行分类的任务中得到了很好的证明。
关于“使用整个视频”与“使用裁剪视频”的工作。在选择算法并正确选择它时,必须不要忘记它。你可以一次识别整个视频,也可以识别人员的区域(预先检测和跟踪)。在第一种情况下,框架中的许多人存在问题。但是,当框架包含大量信息来帮助识别动作时,它效果很好。
另外,关于骨骼动画的分类,几句话:那里没有魔法。文章很少。最好的作品是 PoseC3D,它在提到的 MMAction 中。这项工作之间的主要区别在于精确地使用了卷积网络,而不是在点数组上工作的经典方法:
但是,正如你所看到的,这个模型对于2021年来说已经足够简单了。而且用到的地方很多,很多人都参考它:
许多网络都在处理点数组。但是,由于速度的原因,我更频繁地使用它们。
4、无监督/聚类/嵌入
Papers with Code的zero shot 以及 自监督。
我能摆脱一些问题吗?是的。你可以摆脱数据集收集和训练。当然,有利于准确性。
目前最热门的方法使用类似 CLIP 的神经网络 + 一些技巧。例如,屏蔽视频编码器(或其他一些技巧):
通常,大多数方法都基于创建一些表征动作的“嵌入”向量。
但是,当然,主要问题是一样的。训练数据集与你将使用的数据集相距多远?
另一种流行的方法是自监督。这是我们在数据集 A 上训练,用这个网络标记数据集 B,然后在这个“自动标记”的数据上训练的时候。有时可以使用这种方法(当有大型数据集时,但不容易标记)。
这在近年来准确性如何进步的图像中也很明显(来自 Papers with Code):
错误相差三倍,但我们稍后会讨论。
随着在大型数据集上发布最新的预训练模型,事情将变得非常简单。
5、骨骼和3D动画
这里有几个例子。在这里,许多动作都被骨骼成功识别(我与这家公司合作了很多):
对于某些操作,1-2 个示例足以进行训练。但是你必须非常小心你选择在哪里实现。
以下是一些关于该主题的学术论文和分类,以帮助构建逻辑:(1, 2, 3)。这是论文及代码。
当然,每个人都通过嵌入来做到这一点,但神奇的是如何创建它。
几年前,在 ODS Data Fest 上,Yandex 的家伙们对人脸模型(68 分)说了类似的话(骨骼嵌入),形成嵌入并使用它们来设置数据集/分类操作:
有几个项目是为手部生成嵌入的。其中之一是这样的:
在我看来,有人应该在产品中使用它来识别/记住手势。我们使用类似的方法进行时间手部过滤和咀嚼速度计算。
所以,总而言之—文章很少,但我经常在产品中看到它们。
计算简单,易于训练(你不必在另一个数据集上训练),逻辑简单。如果将其与传统方法进行比较:
错误也差了好几倍!
6、预训练模型
近年来的一个趋势是出现了强大的预训练网络。近年来最有趣的网络是InterVideo。但到目前为止,开源代码中只出现了一些声明的功能。它看起来很神奇:
并非一切都令人兴奋。这样的网络只训练一次,因为要只教授网络的一部分,你需要 128 个 A100 两周。
在Inter Video的情况下,它是两个编码器的训练:
- 掩码视频编码器
- 类 CLIP 神经网络
在此之后,对下游任务进行transformer训练。
未来几年,这一领域可能会取得重大进展。当前的实现将变得更快、更便宜地使用调优。
7、无监督与有监督
然而,我描述了监督和无监督方法。哪一个更容易/更快/更方便?哪一个在哪里使用?
同样,这个问题没有明确的答案:
- 如果只有几个动作,并且可以生成数据集,则最好使用监督式。它更准确、更稳定、更可预测。
- 无监督通常用于数据挖掘。有时进行一些初步分析。
- 在纯视频上,无监督要困难得多,而在骨骼上则更容易。这又是一个限制。
- 因此,你可以同时使用它们。“无监督”首先运行,然后缓慢地进入“监督”。
- 奇怪的是,在某些类别的动作/示例中,Unsupervised 表现不佳。通常,这些是具有高度可变性的动作。例如,你不能为动作执行稳定嵌入。跳舞就是一个很好的例子。有数百个。并且没有稳定的嵌入。但是定期训练做得很好。
正如我之前提到的,在OneShot视频数据集上,误差相差三倍。在骨骼 OneShot 和骨骼之间的骨骼数据集上,它是三倍,等等。
但在这里,你必须明白,误差是不均匀的。OneShot几乎可以完美地识别某些动作。这些主要是与纹理没有交互的短动作。最好是没有变化的活动。例如,你可以以一百种方式“跌倒”。但是“从地板上捡起盒子”可能是一种正确的方式,也可能是 2-3 种错误的方式。对于某些算法,角度至关重要。
如果你正确设置了问题,可以显著偷工减料。
8、结束语
我会从开始的地方结束。在我看来,对于动作识别的非学术任务,开头描述的更直接的方法通常就足够了。只有百分之几的任务需要良好的动作识别。
解决问题时,你必须回答几个问题:
- 我是需要准确的动作识别,还是会使用可理解的逻辑?
- 我需要骨骼,还是直接使用视频?
- 我是否需要 One-Shot 方法提供的灵活性,或者我是否需要处理复杂操作的准确性和能力?
- 预训练网络可以处理我的数据吗?这种神经网络的速度足够吗?
这些问题的答案将大大简化和加快你的任务。
原文链接:Action Recognition in the wild
BimAnt翻译整理,转载请标明出处