用TensorFlow Lite和MoViNet对边缘设备进行视频分类

680 阅读6分钟

发布者:Dan Kondratyuk、Google Research的Liangzhe Yuan和TensorFlow开发者关系部的Khanh LeViet

我们很高兴地宣布MoViNets(发音为 "电影网"),这是一个用于视频分类的新的移动优化的模型架构系列。这些模型在Kinetics-600数据集上进行了训练,能够识别600种不同的人类动作(如吹小号、机器人跳舞、打保龄球等),并能对现代智能手机上捕获的视频流进行实时分类。你可以从TensorFlow Hub下载预训练的TensorFlow Lite模型,或者使用我们的AndroidRaspberry Pi演示应用程序进行尝试,还可以使用Colab演示TensorFlow模型园的代码来微调你自己的MoViNets。

来自TensorFlow Lite视频分类参考应用程序的演示

视频分类是一项机器学习任务,它将视频帧作为输入,并从较大的类别集合中预测出一个单一的类别。视频动作识别是视频分类的一种类型,预测的类集由帧中发生的人类动作组成。视频动作识别与图像识别类似,两者都是以输入图像为基础,输出图像属于每个预定类别的概率。然而,视频动作识别模型必须同时查看每一帧的内容和相邻帧之间的空间关系,以了解视频中的动作。例如,如果你看这些静态图像,很难说出这个人在做什么。

但如果你看完整的视频,就会发现这个人正在进行跳远运动。

MoViNet模型结构

MoViNets是一个卷积神经网络系列,它能有效地处理视频流,以3D ResNets等卷积视频分类器或ViT等基于变换器的分类器的一小部分延迟输出准确的预测结果。

基于帧的分类器在每个二维帧上独立输出预测,由于缺乏时间推理,导致了次优的性能。另一方面,三维视频分类器通过同时处理视频片段中的所有帧来提供高精度的预测,但随着输入帧数的增加,其代价是大量的内存和延时的惩罚。MoViNets提供了基于2D帧的分类器和3D视频分类器的关键优势,同时减轻了它们的缺点。

下图显示了使用3D网络进行多片段评估的典型方法,其中多个重叠的子片段的预测被平均到一起。较短的子片段会导致较低的延迟,但会降低整体准确性。

图示三维视频网络的多片段评估

MoViNets采取了一种混合方法,它建议使用因果卷积来代替三维卷积,允许中间的激活通过一个流缓冲器跨帧缓存。流缓冲器复制所有三维操作的输入激活,由模型输出,然后在下一个片段输入时再输入到模型中。

图示MoViNets的流评估

结果是,MoViNets可以一次接收一帧输入,减少了峰值内存的使用,同时导致准确性的损失,预测结果相当于像3D视频分类器那样一次输入所有帧。MoViNets还利用神经结构搜索(NAS),在视频数据集(特别是Kinetics 600)上搜索跨网络宽度、深度和分辨率的模型的有效配置。

其结果是一套动作分类器,可以输出时间上稳定的预测,根据帧内容平滑过渡。下面是MoViNet-A2对滑板视频片段的每一帧进行预测的例子图。请注意,最初的场景有少量的运动,预测结果相对稳定,而下一个场景的运动量大得多,导致预测的类别发生了巨大的变化。

在一个8秒(25帧)的滑板视频片段中,MoViNet-A2的前5个预测值随时间变化的视频。用这个Colab笔记本创建你自己的图。

MoViNet需要做一些修改才能在边缘设备上有效运行。我们从MoViNet-A0-Stream、MoViNet-A1-StreamMoViNet-A2-Stream开始,它们代表了能够可行地实时运行(20帧或更高)的小型模型。为了有效地量化MoViNet,我们对模型的结构进行了一些修改--用ReLU6取代了硬唰唰的激活,并删除了原始结构中的挤压层和激发层,这导致Kinetics-600的精度下降3-4个百分点。然后,我们将模型转换为TensorFlow Lite,并使用基于整数的训练后量化(以及float16量化)来减少模型大小,使其在移动CPU上运行更快。基于整数的训练后量化过程进一步引入了2-3 p.p.的精度损失。与原始的MoViNets相比,量化的MoViNets在完整的10秒Kinetics 600片段上的准确性落后(总共减少了5-7 p.p.的准确性),但在实践中,它们能够对人类的日常行为提供非常准确的预测,例如俯卧撑、跳舞和弹钢琴。在未来,我们计划用量化感知训练来弥补这一准确性差距。

我们在实际硬件上对量化的A0、A1和A2进行了基准测试,模型推理时间在Pixel 4 CPU上分别达到了200、120和60帧。在实践中,由于输入管道的开销,我们看到在安卓系统上以相机作为输入运行时,延迟增加到接近20-60 fps。

模型

量化

前1名准确率(%)

延迟
(ms, Pixel 4 CPU)

模型大小(MB)

推荐输入

A0-流

int8

65.0

4.80

3.1

172 x 172, 5 fps

A1-流

int8

70.1

8.35

4.5

172 x 172, 5 fps

A2-流

int8

72.2

15.76

5.1

224 x 224, 5 fps

A0-流

float16

71.5

17.47

7.6

172 x 172, 5 fps

A1-流

float16

76.0

34.82

13

172 x 172, 5 fps

A2-流

float16

77.5

76.31

15

224 x 224, 5 fps

训练一个自定义模型

你可以使用TensorFlow模型园的MoViNet代码库来训练你自己的视频分类器模型。提供的Colab笔记本提供了关于如何在另一个数据集上微调预训练的视频分类器的具体步骤。

未来的步骤

我们很高兴看到由MoViNets驱动的设备上在线视频动作识别,它展示了高效的性能。在未来,我们计划支持MoViNets的量化感知训练,以减轻量化精度的损失。我们还有兴趣将MoViNets扩展为更多设备上视频任务的骨干,例如视频物体检测、视频物体分割、视觉跟踪、姿势估计等等。

鸣谢

我们要感谢李叶青在TensorFlow模型园中对MoViNets的支持,感谢龚柏青、王慧生和刘婷的项目指导,感谢王璐的代码评审,感谢TensorFlow Hub团队对我们模型的托管。