Python社区  »  机器学习算法

CVPR 2020 | 用机器学习打造计数君,谷歌RepNet可自动计数视频重复片段

OpenCV学堂 • 1 周前 • 15 次点击  

点击上方↑↑↑OpenCV学堂”关注我

来源:公众号 机器之心 授权



你是否曾在看视频时呼唤过计数君?近日,谷歌和 DeepMind 公布的一篇 CVPR 2020 论文利用机器学习方法打造了一种机器计数君,可以非常便利地统计视频中重复过程的出现次数;尤其值得注意的是,谷歌不仅公布了论文,还发布了演示视频、代码、模型以及一个新构建的相关数据集 Countix。本文为谷歌 AI 博客对这项研究的解读介绍。


  • 项目:https://sites.google.com/view/repnet

  • 论文:http://openaccess.thecvf.com/content_CVPR_2020/papers/Dwibedi_Counting_Out_Time_Class_Agnostic_Video_Repetition_Counting_in_the_CVPR_2020_paper.pdf

  • Countix 数据集:https://storage.googleapis.com/deepmind-media/Datasets/countix.tar.gz

  • Colab Notebook:https://colab.research.google.com/github/google-research/google-research/blob/master/repnet/repnet_colab.ipynb


我们的日常生活中存在各种各样的重复过程,有的是自然周期,比如月相变化或心跳和呼吸节律;也有的重复过程是人为的,比如生产线或交通中的重复模式。

重复过程不仅普遍存在,而且其中还蕴含着可通过巧妙的方式提取出来的见解:在重复多次发生的事件背后,也许还隐藏着什么底层原因;在重复的场景中也许隐藏着某种渐进的变化趋势,这也许能帮助我们理解这个场景。

有时候,重复过程能为我们提供清晰明确的「动作单元(action units)」,即构成一个动作的且具有语义含义的分段。举个例子,如果一个人正在切洋葱,其动作单元就是切下洋葱片的重复操作动作。这些单元可能成为更复杂动作的指示并可能允许我们无需人工标注这些单元,就能在更细粒的时间尺度上自动分析更多这样的动作。

基于上述原因,如果能集成可理解一般重复模式的系统,则以长期观察和理解世界为目标的感知系统将会大获助益。

谷歌的 CVPR 2020 论文《Counting Out Time: Class Agnostic Video Repetition Counting in the Wild》在这一研究方向上迈出了重要一步。这篇论文提出了一种可理解多种重复过程的单一模型 RepNet——其中涵盖人类锻炼或使用工具、动物奔跑、鸟类扇动翅膀、钟摆摆动等多种不同的重复过程。之前的重复过程研究大都使用了周期一致性约束来分析有同一动作的不同视频,以便能细粒度地理解它们。谷歌这篇论文则采用了一种不同方案:一种能识别单个视频中的重复模式的系统。

RepNet

RepNet 模型的输入是包含重复动作的视频,而且这些重复动作可以属于多种不同类别(包括在训练期间未曾见过的类别);而其返回的结果是在视频中找到的重复时间段。

过去,执行重复计数的常见思路是直接比较帧的像素密度,但现实世界的视频可能存在相机移动、视野中物体遮挡、比例尺发生巨大变化、形状变化等情况,因此学习不受这些噪声影响的特征是非常必要的。为了做到这一点,当然要用机器学习。

具体来说,谷歌以端到端的方式训练了一个机器学习模型,可以直接估计重复的时间段。该模型由三部分组成:一个帧编码器、一个中间表征(称为时间自相似度矩阵)、一个时间段预测器。

首先来看帧编码器,其使用了 ResNet 架构作为每帧模型,以为视频的每一帧生成嵌入。选择 ResNet 架构的原因是其已经在许多图像和视频任务上得到了成功应用。将视频的每一帧传递给基于 ResNet 的编码器会得到一个嵌入序列。

接下来就该计算时间自相似度矩阵(TSM)了,即比较视频中每一帧的嵌入与其它每一帧的嵌入,返回的矩阵可帮助后续模块轻松分析,进而对重复过程计数。这个过程能让视频帧流中的自相似性显现出来,从而可帮助实现时间段估计,如下所示:

TSM 处理地球日夜循环图像的方式演示。

然后,对每一帧,再根据 TSM 中的相似度序列使用 Transformer 来直接预测重复的时间段和周期性(即该帧是否属于该周期过程)。一旦有了时间段,就可以用周期段的帧数除以周期时间段长度来获得每帧计数。归总起来,就可以预测出视频中的重复数量。

RepNet 模型概况

时间自相似度矩阵

上面展示的日夜循环的时间自相似度矩阵(TSM)示例是一个固定时间段长度重复的理想场景。而对于真实世界视频,TSM 往往能揭示出视频中让人着迷的结构。下面展示了三个示例:跳跃运动差不多算是一个固定周期长度的理想周期动作了;对比之下,由于动能损失,弹跳小球的弹跳高度会在重复过程中逐渐下降。而某人挖铲混凝土的视频前后都有一段无运动的片段。这三个行为对应的学习到的 TSM 也有明显差别,这需要模型关注场景中的细微变化。

跳跃运动(恒定周期长度;视频来自 Kinetics),弹跳小球(下降式周期,Kinetics),挖铲混凝土(视频中存在非周期性片段,PERTUBE 数据集)

在 RepNet 中使用 TSM 作为中间层的一大优势是 Transformer 的后续处理是在自相似度空间中完成的,而不是在特征空间中完成。这会鼓励向未曾见过的类别泛化。举个例子,只要动作的重复速度是相似的,跳跃和游泳等非常不同的动作所得到的 TSM 也是相似的。这使得该模型可以在某些类别的动作上训练之后再泛化用于未曾见过的类别。

数据

训练上述模型的方法之一是收集一个大规模的包含重复活动的视频数据集且其中带有良好标注的重复次数。但这种方法存在两方面的困难。第一,需要有人检查大量视频以识别出其中带有重复动作的视频。之后,每个视频都必须标注上一个动作重复的次数。尽管对于特定的任务而言,标注者可以跳过某些帧(举个例子,在分类跳跃运动这样的视频时),但他们仍然需要看完整个视频才能统计出跳跃运动的执行次数。

针对这一难题,谷歌采取的做法是引入一个合成数据生成过程,可以使用可能不包含重复动作的视频生成带有重复的视频。具体做法是随机选取一个视频片段并将其重复任意次数,然后再在两段加上原视频的前后部分。

这种合成数据生成流程可以基于任何视频生成带有重复的视频

尽管这一流程可以生成带有重复过程且看起来自然的视频,但对于深度学习方法来说还是过于简单,因为深度学习可以通过查找伪影而非学习识别重复而学会欺骗。针对这个问题,谷歌的策略是执行极端的数据增强,他们称之为「相机运动增强(camera motion augmentation)」。这种方法会对视频进行修改,从而在视频进行过程中使用 2D 仿射运动模拟平滑移动的相机。

左图:一个由随机视频生成合成带重复视频的示例。右图:一个使用相机运动增强合成的视频示例,这对于模型来说难度更大,但能更好地泛化用于真实的重复视频上。(视频均来自 Kinetics)

评估

现在可以在合成的重复视频上训练模型了,但是所得到的模型必须要能泛化用于带有重复过程的真实视频才行。为了在真实视频上评估训练所得到的模型的性能,谷歌从 Kinetics 数据集收集了大约 9000 段视频,并构建了一个新的数据集。这些视频根基于 YouTube 上的数据多样性,涵盖许多动作类别,并且具有丰富多样的场景。然后,谷歌为这些视频标注了视频中动作的重复次数。为了鼓励对这一领域的进一步研究,谷歌已经公开发布了这一起名为 Countix 的数据集。

应用


不依赖类别的计数模型具有许多有用的应用场景。以单个模型使用的 RepNet 可以统计许多不同领域的视频中的重复次数:

RepNet 可以计数多种领域活动的重复次数,比如切洋葱、地球昼夜周期甚至运动中的猎豹。

RepNet 可用于评估来自超声心动图的心跳节律,即便其在训练期间并未见过这样的视频:

预测得到的心跳速率:45bpm(左边)和 75bpm(右边)真实的心跳速率分别为 46-50 bpm 和 78-79 bpm。RepNet 对来自不同设备的数据的心跳速率预测非常接近该设备实际测得的心跳速率。

RepNet 还可用于监控重复活动中的速度变化。下面展示了这样的速度变化也可用于其它设置中,以便进行质量控制或过程控制。


在视频中可以看到 RepNet 计数了在激光显微镜下观察到的加速细胞振荡,即便其在训练期间并未见过这样的视频。

左图:一个人进行「登山者」锻炼。右图:使用主成分分析得到的 RepNet 嵌入的 1D 投影,这里是该人在锻炼过程中改变速度的时刻。

原文链接:https://ai.googleblog.com/2020/06/repnet-counting-repetitions-in-videos.html

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70761
 
15 次点击  
分享到微博