视频理解是近几年非常流行的研究方向,因为视频是最接近于人眼的真实输入,分析时间序列上的图像变化有助于我们开发更强的计算机视觉。而在视频理解领域,最具代表性的研究方向就是动作识别。区别于以往的大部分图像任务,动作识别的主体是动作,而不是物体,比如唱,跳,rap,篮球。
所以动作识别功能可以为我们做些什么呢?现在大部分手机相册都会自动标注照片,把图片分为家庭,自拍,庆祝等等类别,方便查找。可是拍的短视频怎么办?试试视频动作识别,不论是家居遛狗,还是家里遛娃,还是出门滑雪,这些全都属于动作识别的范畴。AI 模型给每个视频打上标签,然后生成一个年终精彩视频集锦,帮你留住今年的每一份美好。
动作识别还有很多实际的应用,比如视频监控和人体行为分析。而且,视频理解不仅仅是一个方向,它更是一种概念。所有的图像处理问题,加上时间这个维度后,就会变成新的问题,比如物体检测在时间轴上就变成了物体跟踪。正因为视频理解如此重要,近几年在学术和工业界都赚足了眼球。
然而有很多阻碍限制了视频从业者的步伐,比如庞大的数据集,缺乏易用可复现的代码库,找不到教程,没法部署到终端上等等。就以数据集为例,视频领域里一个比较流行的数据集 Kinetics400 的视频总帧数是 ImageNet 图片总数的 100 倍。有时候为了更好的理解时序信息,很多模型还需要提取光流。很早就有知乎小伙伴反映过,几百万的训练样本,光抽帧就抽的头疼,更别提抽光流了,头发都要被抽没了。
即使准备好了数据,训练一个 SOTA 的模型也要数天之久,更别提复现、调参或者进行新的研究探索了。所以在这次 GluonCV release 0.6 中,我们一一解决以上提到的痛点。经过最近几个月的复现和优化,GluonCV 现在全面支持视频理解中的大量模型和常见数据集。我们还提供了易上手的教程,分布式的支持,快速的视频加载,好玩的应用实例和可复现的超参和结果,帮助大家分分钟上手视频理解,免去了重复造轮子的困扰。小伙伴们还不快快上车,赶上这波全民视频的热潮!
最近 Facebook 也刚刚开源了他们的视频理解库,PySlowFast。相比而言,我们提供更多更全的模型和数据库的支持。下面的表格列出了我们在 Kinetics400 数据集上提供的预训练模型,
模型的各种 backbone,各种变体,应有尽有。只需一行net = get_model(model_name)
, 即可享用训练好的模型。同时,我们还支持 UCF101, HMDB51 和 Something-Something-V2 数据集,对 ActivityNet,HACS,Moments in Time 和 AVA 的支持正在赶来的路上。所有的训练脚本,超参数,训练日志和测试方式全都提供,轻松复现基线模型。
视频数据的预处理非常繁琐,而且费时费力。以 Kinetics400 数据集为例,存储它所有的视频数据需要 450GB 的硬盘空间。如果我们全部抽成视频帧来训练,就要占 6.8T 的硬盘空间。如果再抽取光流,大部分机器表示吃不消。即使我们有足够的硬盘空间来储存这些数据,大量的数据会造成训练时候的 IO 瓶颈,GPU 利用率大部分时候是 0,导致训练极其缓慢还浪费资源。
所以我们需要一个全新的视频加载器 decord,可以直接读取视频,再也不用繁琐的预处理了, 想读哪帧读哪帧。
如下图所示,相比已有的视频加载器,OpenCV 和 PyAV, 我们的 decord 至少快两倍以上,尤其在随机取帧的时候,更是快八倍以上,导师再也不用担心我的实验被卡 IO 了。
我们提供了两个自定义的功能,自定义 dataloader 和自定义模型,帮助用户写最少的代码,实现最多的功能。
首先是自定义的 dataloader,我们提供了一个 VideoClsCustom 的类,基本适用于大部分视频分类的任务。不论用户的数据是怎么存放,怎么命名, 什么格式的,只需要提供一个如下的文本文件就可以开始训练了。
每一行需要提供 3 个信息,分别是视频存放的路径,视频的长度以及视频的类别。如果用户已经将视频抽成了帧也不要紧, 只需要把对应视频路径换成视频帧文件夹的路径即可。比如我们现在要加载一个数据集,要随机从一段视频中抽取一个视频片段,长为 64 帧,隔帧取样,同时调整帧的大小为 224x224。
还有很多默认的参数可以调整,满足大部分模型训练的需求,想了解更多选择请参考源代码。
其次是自定义的模型,我们提供了几个常见模型的自定义版本,比如 slowfast_4x16_resnet50_custom。用户在根据自己的数据集建立模型的时候,可以直接调用这个函数,只需要提供数据集里有几类就可以了。比如用一个视频异常检测的数据集做一个二分类问题,
在有了这两个自定义的功能后,用户基本无需写代码就可以直接在自己的数据集上自由的玩耍了。
过去的五年,视频理解与行为识别快速发展,可是直到最近才陆陆续续有稳定的开源代码库,比如 MMAction, PyVideoResearch, VMZ 和 PySlowFast。即便如此,简单易懂的教程依旧缺乏。我们 GluonCV 提供大量的 jupyter notebook 教程,用户可以直接本地体验,不论是在 Windows,Linux 还是 Mac 上。我们提供的教程包括如何复现 SOTA 模型,如何抽取特征,如何做推理,如何在自己的数据集上微调以及如何做分布式训练。
尤其值得一提的是分布式训练。鉴于视频领域训练太过耗时,训练一个 SOTA 模型动辄超过一周,最常见的方式就是使用分布式训练加速这个过程。可惜网上关于分布式训练的教程文档都非常少,更不要提专门针对视频模型讲解分布式训练的文档了。我们的教程包括如何设置集群通信,如何准备数据,如何启动分布式训练,一步步带你上手视频理解。我们的分布式训练扩展性能也很好,无需复杂的优化,两台机器即可提速 1.6 倍,四台机器可提速 3.2 倍, 八台机器可提速 6 倍。分布式训练可以帮助你快速迭代,是发论文做产品不可或缺的利器。
GluonCV 继续与英特尔携手带来更多的 INT8 量化模型。受益于 Intel Deep Learning Boost(VNNI) 的加持,用 INT8 量化后的视频理解模型比它们原本的 32 位浮点数版本要快许多。因为是快速部署,我们只提供了部分 2D 模型的量化模型。下表是基于 AWS EC2 C5 实例的结果,在保持原有精度的情况下, 量化过的模型可以达到 5 倍的提速。
对于想要尝试的小伙伴, INT8 量化版本的使用和标准的 GluonCV 模型一样,仅需在模型名称后加上_int8
后缀,就可以体验性能起飞的感觉!同时, 为了方便用户在自有数据集上进行 INT8 量化,我们还提供了量化校准工具。目前本校准工具仅支持 Hybridized 后的 Gluon 模型,用户可以使用quantize_net
接口来量化他们自己的模型, 方便各种部署。
GluonCV 网站 (gluon-cv.mxnet.io)
GluonCV Github (github.com/dmlc/gluon-cv)
论坛讨论 (discuss.gluon.ai)
喜欢我们的工作并且希望支持更多的更新,欢迎点赞加星 Fork!