原标题:手把手带你构建视频分类模型(附Python演练)
概述
了解如何使用计算机视觉和深度学习技术处理视频数据
我们将在Python中构建自己的视频分类模型
一个非常实用的视频分类教程,准备好Jupyter Notebook
介绍
我们可以使用计算机视觉和深度学习做很多事情,例如检测图像中的对象,对这些对象进行分类,从电影海报中生成标签。
这一次,我决定将注意力转向计算机视觉中不太引人注目的方面-视频!我们正以前所未有的速度消费视频内容。我觉得对数据科学家来说这个计算机视觉的领域具有很大的潜力。
我很好奇将相同的计算机视觉算法应用于视频数据。我用于构建图像分类模型的方法是否可以推广?
对于机器来说,视频可能很棘手。它们的动态特性与图像的静态特性相反,这可能使数据科学家构建这些模型变得复杂。
但不要担心,它与处理图像数据没有什么不同。在本文中,我们将使用Python构建我们自己的视频分类模型。这是一个非常实用的教程,所以准备好Jupyter Notebook,这将是一个非常有趣的过程。
我们将在本视频分类教程中介绍的内容
视频分类概述
构建视频分类模型的步骤
探索视频分类数据集
训练视频分类模型
评估视频分类模型
视频分类概述
你会如何定义视频?
我们可以说视频是按特定顺序排列的一组图像的集合。这些图像也称为帧。
这就是为什么视频分类问题与图像分类问题没有什么不同。对于图像分类任务,我们采用图像,使用特征提取器(如卷积神经网络或CNN)从图像中提取特征,然后基于这些提取的特征对该图像进行分类。视频分类仅涉及一个额外步骤。
我们首先从给定视频中提取帧。然后,我们可以按照与图像分类任务相同的步骤进行操作。这是处理视频数据的最简单方法。
实际上有多种其他方式来处理视频,甚至还有视频分析领域。我们将使用CNN从视频帧中提取特征。
构建视频分类模型的步骤
建立一个能够将视频分类到各自类别的模型很兴奋吧!我们将研究UCF101 – Action Recognition Data Set(动作识别数据集),它包含13,320种不同的视频片段,属于101个不同的类别。
让我总结一下我们将构建视频分类模型的步骤:
浏览数据集并创建训练和验证集。我们将使用训练集来训练模型和验证集来评估模型
从训练集以及验证集中的所有视频提取帧
预处理这些帧,然后使用训练集中的帧来训练模型。使用验证集中的帧来评估模型
一旦我们对验证集上的性能感到满意,就可以使用训练好的模型对新视频进行分类
我们现在开始探索数据吧!
探索视频分类数据集
你可以从官方UCF101站点(https://www.crcv.ucf.edu/data/UCF101.php)下载数据集。数据集采用.rar格式,因此我们首先必须从中提取视频。创建一个新文件夹,假设为"视频"(你也可以选择任何其他名称),然后使用以下命令提取所有下载的视频:unrar e UCF101.rar Videos/
UCF101的官方文件指出:
"在训练和测试中,将属于同一组的视频分开是非常重要的。由于组内的视频都是来自一个较长的视频,所以在训练集和测试集上共享来自同一组的视频可以获得较高的性能。"
因此,我们将按照官方文档中的建议将数据集拆分为训练和测试集。你可以从这里下载训练/测试集(https://www.crcv.ucf.edu/data/UCF101/UCF101TrainTestSplits-RecognitionTask.zip)。请记住,由于我们处理的是大型数据集,因此你可能需要较高的计算能力。
我们现在将视频放在一个文件夹中,将训练/测试拆分文件放在另一个文件夹中。接下来,我们将创建数据集。打开你的Jupyter Notebook,然后按照下面的代码块。我们将首先导入所需的库:
importcv2 #捕获视频库
importmath #数学操作库
importmatplotlib.pyplot asplt #画图的库
%matplotlib inline
importpandas aspd
fromkeras.preprocessing importimage # 预处理图像库
importnumpy asnp #数学操作库
fromkeras.utils importnp_utils
fromskimage.transform importresize #改变图像尺寸
fromsklearn.model_selection importtrain_test_split
fromglob importglob
fromtqdm importtqdm
我们现在将视频的名称存储在dataframe中:
# 导入训练集txt文件,里面有视频名字列表
f = open("trainlist01.txt", "r")
temp = f.read
videos = temp.split('n')
# 创建含有视频名字列表的dataframe
train = pd.DataFrame
train['video_name'] = videos
train = train[:-1]
train.head