利用PyTorchVideo 高效理解视频

了解如何从 PyTorchVideo 库中轻松可视化和评估活动分类模型

FiftyOne 中PyTorchVideo预测的可视化(图片由作者提供)

如果你试图为任务寻找最佳模型,或仅是寻找相关基线,那么海量的计算机视觉模型可能会让你无从下手。TensorFlow HubFacebook 的 Detectron2等模型库可以轻松访问流行模型。此外,像PyTorch Lightning这样的库可以轻松修改这些模型来满足你的需求,这对可视化图像来说很友好,但对于视频来说就不是这样了。视频数据正变得普及化,但随之附带的复杂性往往使与其相关的任务搁浅。

PyTorchVideo是一个新库,旨在使视频模型与图像模型一样易于加载、创建和训练。

PyTorchVideo提供访问视频模型动物园、视频数据处理功能以及视频加速器集中部署模型,PyTorch允许所有功能都能无缝集成到现有的工作流程。

PyTorchVideo 在完成视频工作流程方面 唯一缺少的功能是一种可视化数据集 和解释模型结果的方法 这就到了FiftyOne 的用武之地。FiftyOne 是我一直在Voxel51上使用的一个开源工具。它旨在使可视化任何图像或视频数据集变得容易,并探索存储在本地或云中的地面实况和预测标签。FiftyOne 数据集FiftyOne 应用程序的灵活表示让你可以快速掌握数据集并解释模型以查找故障模式注释错误可视化复杂的标签等等。

本篇文章是最近的 PyTorchVideo 教程的扩展,旨在教你如何将PyTorchVideoFiftyOne集成以关闭基于视频的机器学习工作流程的循环。具体来说,这篇文章的内容涵盖:

跟随Colab的脚步!

你可以在此 Google Colab 笔记本中的浏览器中直接运行此博文中的示例!

此演练在 Google Colab 中的屏幕截图(图片由作者提供)

设置

要按照本演练进行操作,你需要安装FiftyOnePyTorchVideoPyTorch 和 TorchVision

pip install fiftyone pytorch torchvision

虽然PyTorchVideo也可以通过 pip 安装,但本文中的功能需要通过GitHub安装:

git clone https://github.com/facebookresearch/pytorchvideo.git
cd pytorchvideo
pip install -e .

本演练使用Kinetics-400 数据集的一个子,可以使用以下代码片段进行下载:

pip install youtube-dl
wget https://storage.googleapis.com/deepmind-media/Datasets/kinetics400.tar.gz
tar -xvf ./kinetics400.tar.gz

视频数据集比图像数据集更难使用的众多原因之一是,许多流行的视频数据集只能通过 YouTube 获得。因此,你不能下载包含全部内容的 zip 文件,而是需要运行如下所示的脚本从 YouTube 下载单个视频,这些视频不知道会不会因为策划数据集而变得不可用。


image

加载和探索视频数据集

对于图像数据集,有一些基本选项可用于可视化批次数据,如PillowOpenCV。可用于可视化视频数据集的选项很少,FiftyOne是一个新的开源库,可为图像和视频数据集提供简单而强大的可视化。

如果你的数据集遵循通用的格式,例如用于检测COCO 格式,那么你可以在单行代码中加载它:

import fiftyone as fo

dataset = fo.Dataset(
    "/path/to/dataset_dir", 
    dataset_type=fo.types.COCODetectionDataset, 
    name="my_dataset"
)

即使你的数据集采用自定义格式,使用 FiftyOne 加载数据集仍很简单。举个例子,如果你使用的是对象检测视频模型,则可以按以下方式加载数据:

在此示例中,我们将遵循有关运行视频分类模型的PyTorchVision 教程。通常,视频分类数据集将存储在磁盘上的目录树中,其子文件夹定义数据集类别。这种格式可以在单行代码中加载:

import fiftyone as fo

name = "kinetics-subset"
dataset_dir = "./videos"

# Create the dataset
dataset = fo.Dataset.from_dir(
    dataset_dir, fo.types.VideoClassificationDirectoryTree, name=name
)

# Launch the App and view the dataset
session = fo.launch_app(dataset)

如果你自己跟随,请将鼠标悬停或单击示例以播放视频:

https://miro.medium.com/max/875/1*YDzvrZDlgwJ12RsBIyCafA.gif
FiftyOne APP中查看的动力学视频(图片由作者提供)

我们还需要下载并存储在评估预测时要使用的默认类名列

wget https://dl.fbaipublicfiles.com/pyslowfast/dataset/class_names/kinetics_classnames.json

运行 PyTorchVideo 模型

在本节中,我们使用 PyTorchVideo 下载我们在上一节中加载的数据并运行视频分类模型,再将结果存储在我们的数据集中。本节中的代码改编自PyTorchVideo 教程

Torch Hub是预训练 PyTorch 模型的存储库,允许你下载模型并在数据集上运行推理。PyTorchVideo通过其 Torch Hub 支持的模型动物园提供了许多视频分类模型,包括 SlowFast、I3D、C2D、R(2+1)D 和 X3D。以下代码片段使用 ResNet50 主干下载 SlowFast 的慢速分支并将其加载到 Python 中:

每个模型都有它所期望的特定输入结构。标准工作流程是编写自定义脚本,这些脚本执行必要的加载和转换功能,以格式化每个模型的数据。PyTorchVideo通过以灵活的方式为你提供这些功能来加快此过程,这将适用于大多数视频处理需求。例如,以下代码创建转换以从视频中采样帧,对其进行标准化、缩放和裁剪,无需自己编写任何函数:

image

由于数据集存储在 FiftyOne 中,我们可以轻松地迭代样本,使用 PyTorchVideo 加载并运行我们的模型,再将预测存储回 FiftyOne 以进行进一步的可视化和分析:


image

评估 PyTorchVideo 模型

除了作为数据集管理的开源生态系统之外,FiftyOne 还旨在通过允许快速查找和解决模型故障模式来可视化、评估和解释模型。

为此,我们可以从可视化上一节中生成的预测开始:

import fiftyone as fo

session = fo.launch_app(dataset)


FiftyOne 中可视化的 PyTorchVideo 模型预测(图片由作者提供)

然后,我们可以使用FiftyOne 来评估具有基本事实的预测,以查看聚合指标和显示混淆矩阵精确召回曲线等内容的图。该评估将每个样本的正确性标签(“eval”)添加到数据集,这使得通过正确/不正确的预测进行过滤变得容易,或者更一般地通过 TP/FP/FN 进行对象检测。只需一行代码即可执行评估:

image
image

让我们绘制令人感兴趣的类的混淆矩阵:

plot = results.plot_confusion_matrix(classes=target_classes)
plot.show()


在 FiftyOne 混淆矩阵中可视化的结果(图片由作者提供)

我们可以将此图附加到会话对象以使其具有交互性。因此,如果单击其中一个单元格,FiftyOneApp 会话将更新以显示该单元格中的样本。

# If you are in a Jupyter notebook, attach plot to session
session.plots.attach(plot)

%E6%9C%AA%E5%91%BD%E5%90%8D_%E5%89%AF%E6%9C%AC

Jupyter Lab 中的交互式混淆矩阵与 FiftyOne(图片由作者提供)

注意:绘图目前仅在 Jupyter Notebooks 中可交互,但很快将支持其他环境!

FiftyOne 还提供了一种新颖的查询语言,通过搜索和过滤任何给定的标签和元数据来创建数据集视图。这使你可以轻松探索数据集并找到可能想到的任何问题相关的样本。例如,我们可以根据跨多个类的相似置信度快速找到模型对其预测最不确定的样本,并使用先前评估中的每个样本正确性标签(“eval”)来仅查看错误预测的样本:

image

FiftyOne 中可视化的不确定 PyTorchVideo 模型预测(图片由作者提供)

可视化这些样本让我们了解应该添加到训练数据集中的数据类型。为了标记这些以供将来参考,我们可以使用FiftyOne 应用程序中标记功能


在 FiftyOne App 中标记样本(图片由作者提供)

这种动手分析的简便性通常会显著提高数据集质量,从而提高模型性能,这比仅使用聚合数据集统计数据的任何分析都要快。

视频中的物体检测

虽然大多数大型视频数据集和研究工作都围绕着人类活动识别等分类问题,但基于视频的 ML 的应用通常涉及对象检测。目前,PyTorchVideo 主要支持视频分类问题,但是,FiftyOne 中提供了视频对象检测功能。

FiftyOne 允许从FiftyOne Model Zoo 中基于图像的对象检测模型生成预测,或者你自己模型的预测添加到视频数据集。模型动物园里有很多模型可供选择。例如,我们可使用EfficientDet-D0。我们首先需要安装TensorFlowAutoML,可以使用FiftyOne自带的eta包轻松安装AutoML:

pip install tensorflow==1.14
eta install automl

现在让我们将模型应用于视频并可视化结果:

Visualizing video object detections in FiftyOne (Image by author)

FiftyOne 中可视化视频对象检测(图片由作者提供)

image
%E6%9C%AA%E5%91%BD%E5%90%8D_%E5%89%AF
这种可视化需要编写自定义脚本来加载原始视频、注释和预测,然后使用OpenCV 等软件绘制框并将可视化导出到磁盘上的新视频。如果你想更改正在查看的标签,则需要每次都重写脚本并重新生成视频。相反,所有这一切只需要我们几行代码,这使我们的数据更易于使用和表示。

总结

基于视频的机器学习模型越来越受欢迎,但缺乏相同级别的易于使用的代码库,无法快速开发和评估图像模型。PyTorchVideo旨在通过其模型动物园、专注于视频的组件和加速功能,使视频模型的实现、训练和评估变得更加容易。另一方面,PyTorchVideo使视频模型的使用变得更加简单,FiftyOne是一个开源库,旨在使管理、评估和改进视频(和图像)数据集变得轻松和高效。FiftyOnePyTorchVideo一起大大节省了创建高质量视频数据集和模型所需的时间和精力。

原文作者 Eric Hofesmann
原文链接 https://towardsdatascience.com/using-pytorchvideo-for-efficient-video-understanding-24d3cd99bc3c