介绍

我是个超级板球迷。从我记事起,我就迷上了这项运动,至今它仍在我的日常生活中起着重要的作用。我相信很多读到这篇文章的人都会点头!

但是自从我开始工作以来,要跟上所有的比赛就成了一件棘手的事。我不能看一场完整的比赛,只能看一些短暂的片段,或者看文字解说。

所以作为数据科学家的我决定做点什么。有没有一种方法可以让我使用我的Python技能并剪辑出比赛的所有重要部分?实际上,我想用Python创建我自己的集锦集合。

事实证明,我甚至不需要依靠机器学习或深度学习技术来做到这一点!现在,我想分享我的代码,在后面附有代码。这将让你尝试我们将在这篇文章中使用的一个简单的语音分析方法:

我将讨论我如何编写这个集锦生成的处理流程,使你可以学习和应用到任何比赛(或任何你想要的其他运动)。

目录

  1. 体育视频集锦简介
  2. 集锦生成的不同方法
  3. 我自己生成集锦的方法
  4. 理解问题描述
  5. 在Python中实现集锦生成

体育视频集锦简介

我们都看过一些体育比赛的精彩部分。即使你对运动没有兴趣,你也会在餐馆、酒店等地方看到电视上的精彩镜头。

集锦生成是从体育视频中提取最有趣的部分的剪辑的过程。

你可以将其视为视频摘要的经典用例。在视频摘要中,全长视频将转换为较短的格式,以便保留最重要的内容。

在板球比赛中,完整的比赛视频包含了四分打、六分打、三柱门等动作。未经过剪辑的版本会捕捉一些无趣的事件,如防御、离场、歪球、失误点等。

另一方面,集锦是人们肾上腺素激增的开始。所有主要的视频集锦,例如四分打、六分打、三柱门,这些结合在一起就构成了典型的集锦组合。

从一场完整的比赛视频中手动提取集锦需要大量的人工。这是一项耗时的工作,除非你想日复一日地从事这项工作,否则你需要找到其他方法。

存储一场完整的比赛视频也占用大量资源。因此,一场完整的比赛视频中自动提取集锦可以为创作者和用户节省大量时间。这就是我们将在本文中讨论的内容。

集锦生成的不同方法

除了手动方法之外,我们还有其他方法可以生成集锦。我们可以使用两种常见的方法-自然语言处理(NLP)和计算机视觉。在开始使用我的方法之前,让我们简要讨论一下它们如何工作。

基于自然语言处理(NLP)的方法

在查看以下步骤之前,请先考虑一下。你如何使用NLP或基于文本的方法从板球比赛中提取重要的数据?

以下是流程:

  • 从输入视频中提取音频
  • 将音频转录为文本
  • 对文本应用基于提取的摘要技术来识别最重要的短语
  • 提取相应重要短语的片段,生成集锦

基于计算机视觉的方法

这种基于计算机视觉的方法会给人一种非常直观的印象。毕竟,计算机视觉是我们训练机器看图像和视频的领域。因此,使用计算机视觉生成集锦的一种方法是一直跟踪比赛的记分卡,只有在出四分打、六分打、三柱门时才进行提取。

我自己生成集锦的方法

在这一点上,你可能想知道,我们刚才谈到了机器学习和深度学习的两个子领域。但是文章的标题和介绍表明我们不会使用这两个领域。那么我们真的可以在不构建模型的情况下生成集锦吗?是的!

“并非每个问题都需要深度学习和机器学习。对领域和数据的透彻理解可以解决大多数问题。” – Sunil Ray

我将讨论使用自动生成的集锦的概念——简易语音分析(Simple Speech Analysis)。在讨论最终方法之前,让我们讨论一些术语。

什么是短时能量?

我们可以在时域或频域中分析音频信号。在时域中,针对时间分量分析音频信号,而在频域中,针对频率分量进行分析:

音频信号的能量是指声音的响度。它是由时域中音频信号幅度的平方和求出的。当为整个音频信号的一部分计算能量时,则称为短时能量

解决方案背后的基本思想是,在大多数体育比赛中,每当发生有趣的事件时,评论员和观众的声音都会增加。

让我们以板球为例。每当击球手击中界线或投球手取球时,评论员的声音就会上升。观众的欢呼声就开始爆发。我们可以使用音频中的这些更改来捕捉视频中有趣的时刻。

以下是流程:

  • 输入完整匹配的视频
  • 提取音频
  • 将音频分成块
  • 计算每个块的短时能量
  • 将每个块归为是否"兴奋"(简单的基于阈值)
  • 合并所有"兴奋"片段,以形成视频集锦

理解问题描述

板球运动是印度最著名的运动,在印度几乎所有地区都可以玩。因此,作为顽固的板球迷,我决定自动从完整比赛的板球视频中提取集锦。但是,相同的想法也可以应用于其他运动。

在本文中,我只考虑了2007年T20世界杯印度对澳大利亚半决赛的前6轮。你可以在YouTube上观看完整的比赛(https://www.youtube.com/watch?v=lFq4eW9ewRE&t=2162s),并从这里下载前六场的视频(https://drive.google.com/drive/folders/1FRODSq1dgp-JvUcXRALKjn6bvIu15gU6)。

在Python中实现集锦生成

我已经借助名为WavePad Audio Editor的软件从视频中提取了音频。你可以从此处下载音频剪辑(https://drive.google.com/drive/folders/1FRODSq1dgp-JvUcXRALKjn6bvIu15gU6)。

filename='powerplay.wav'
import librosa
x, sr = librosa.load(filename,sr=16000)

我们可以使用以下代码以分钟为单位获取音频剪辑的持续时间:

int(librosa.get_duration(x, sr)/60)

现在,由于我们有兴趣找出特定的音频块是否包含音频声音的上升,因此将音频分为5秒的块:

max_slice=5
window_length = max_slice * sr

让我们听一听音频块:

import IPython.display as ipd
a=x[21*window_length:22*window_length]
ipd.Audio(a, rate=sr)

计算块的能量:

energy = sum(abs(a**2))
print(energy)

在时间序列域中可视化块:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(14, 8))
ax1 = fig.add_subplot(211)
ax1.set_xlabel('time')
ax1.set_ylabel('Amplitude')
ax1.plot(a)

如我们所见,信号幅度随时间变化。接下来,为每个块分配短期能量:

import numpy as np
energy = np.array([sum(abs(x[i:i window_length]**2)) for i in range(0, len(x), window_length)])

让我们查看这些块的短时能量分布:

import matplotlib.pyplot as plt
plt.hist(energy)
plt.show()

如上图所示,能量分布是右偏的。我们将选择极值作为阈值,因为仅当评论者的讲话和观众的欢呼声很高时,我们才对剪辑感兴趣。

在这里,我认为阈值是12,000,因为它位于分布的尾部。随意尝试不同的值,看看会得到什么结果。

import pandas as pd
df=pd.DataFrame(columns=['energy','start','end'])
thresh=12000
row_index=0
for i in range(len(energy)):
value=energy[i]
if(value>=thresh):
i=np.where(energy == value)[0]
df.loc[row_index,'energy']=value
df.loc[row_index,'start']=i[0] * 5
df.loc[row_index,'end']=(i[0] 1) * 5
row_index= row_index 1

将相连的时间间隔的连续音频片段合并为一个:

temp=[]
i=0
j=0
n=len(df) - 2
m=len(df) - 1
while(i<=n):
j=i 1
while(j<=m):
if(df['end'][i] == df['start'][j]):
df.loc[i,'end'] = df.loc[j,'end']
temp.append(j)
j=j 1
else:
i=j
break
df.drop(temp,axis=0,inplace=True)

在特定时间间隔内提取视频以形成集锦。 切记,由于只有在击球手打完球之后,评论员的讲话和观众的欢呼才会增加,所以我考虑了每个“兴奋”的片段之前五秒:

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
start=np.array(df['start'])
end=np.array(df['end'])
for i in range(len(df)):
if(i!=0):
start_lim = start[i] - 5
else:
start_lim = start[i]
end_lim = end[i]
filename="highlight" str(i 1) ".mp4"
ffmpeg_extract_subclip("powerplay.mp4",start_lim,end_lim,targetname=filename)

我已经使用在线视频编辑器来合并所有提取的视频剪辑成单个视频。

恭喜你生成了你自己的集锦集合!继续将此技术应用于你想要的任何比赛或运动吧。它可能看起来很简单,但是它是一种强大的方法。这里有完整代码(https://github.com/aravindpai/Cricket-Highlights-Generation)

结尾

本文的关键结论是:在进入模型构建过程之前,要对领域和数据有一个全面的了解,因为它可以帮助我们更好地解决大多数问题。

在本文中,我们了解了如何使用简单的语音分析来自动提取一场完整体育比赛视频中的集锦。我建议你也尝试不同的运动。

欢迎关注磐创博客资源汇总站:http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:http://pytorch.panchuang.net/

成为视频分析专家:自动生成视频集锦(Python实现)的更多相关文章

  1. 使用讯飞tts+ffmpeg自动生成视频

    参考 FFmpeg 讯飞离线语音合成 起因 某日,看到一个营销号的视频说做视频日进斗金,大意是用软件识别文章小说,搭配一些图片转换成自己的视频.看完当时脑海里冒出一个念头,我也可以,于是有了这番尝试. ...

  2. 利用FFmpeg生成视频缩略图 2.3.1

    1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ ...

  3. 利用FFmpeg生成视频缩略图 2.1.8

    1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ ...

  4. 利用FFmpeg生成视频缩略图 2.1.6

    利用FFmpeg生成视频缩略图 1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/build ...

  5. 【原创】Hibernate自动生成(1)

    本实战是博主初次学习Java,分析WCP源码时,学习HibernateTools部分的实战,由于初次接触,难免错误,仅供参考,希望批评指正. 开发环境: Eclipse Version: Photon ...

  6. NVIDIA DeepStream 5.0构建智能视频分析应用程序

    NVIDIA DeepStream 5.0构建智能视频分析应用程序 无论是要平衡产品分配和优化流量的仓库,工厂流水线检查还是医院管理,要确保员工和护理人员在照顾病人的同时使用个人保护设备(PPE),就 ...

  7. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  8. react将表格动态生成视频列表【代码】【案例】

    只需要创建一个表格,id为videos,react就能将这个表格转换成视频列表,并点击自动播放 index.html <!DOCTYPE html> <html> <he ...

  9. 视频分析(MATLAB)——MV分镜头图像分类

    引言:一个MV视频是有很多帧图像组合而成的,而一支MV是有多少个分镜头场景组合而成的呢?由MATLAB如何自动实现? 以<Love You Like A Love Song>的MV为例(这 ...

随机推荐

  1. 记录一下自己写PHP程序时走过的一些坑

    写在前面: 喔噢,转眼间发现自己正式开发程序(PHP)已经有快有1个月了,一路上走了许多的坑,有时遇到坑的时候真想放弃,但是还是坚持下来了!所以写了这篇文章来帮助那些刚刚接触PHP的小白们.[: )] ...

  2. 一个简单的爬取b站up下所有视频的所有评论信息的爬虫

    心血来潮搞了一个简单的爬虫,主要是想知道某个人的b站账号,但是你知道,b站在搜索一个用户时,如果这个用户没有投过稿,是搜不到的,,,这时就只能想方法搞到对方的mid,,就是 space.bilibil ...

  3. WebAPI-处理架构

    带着问题去思考,大家好! 问题1:HTTP请求和返回相应的HTTP响应信息之间发生了什么? 1:首先是最底层,托管层,位于WebAPI和底层HTTP栈之间 2:其次是 消息处理程序管道层,这里比如日志 ...

  4. JZOJ 1775. 合并果子2 (Standard IO)

    1775. 合并果子2 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 在一个果园里,多多已经将所有的果子 ...

  5. (数据科学学习手札79)基于geopandas的空间数据分析——深入浅出分层设色

    本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...

  6. 【译文连载】 理解Istio服务网格(第七章 安全)

    全书目录 第一章 概述 第二章 安装 第三章 流控 第四章 服务弹性 第五章 混沌测试 第六章 可观测性 本文目录 第7章 安全 7.1 身份认证 7.1.1 Kubernetes上的Istio的身份 ...

  7. HDFS 客户端读写操作详情

    1. 写操作 客户端向namenode发起上传请求 namenode检查datanode是否已经存有该文件,并且检查客户端的权限 确认可以上传后,根据文件块数返回datanode栈 注:namenod ...

  8. background-attachment 制造视差滚动效果案例

    简介 background-attachment 属性设置背景图像是否固定或者随着页面的其余部分滚动.可能的值有三个: scroll 默认值.背景图像会随着页面其余部分的滚动而移动. fixed 当页 ...

  9. 性能测试进阶:(一)性能测试工具Locust

    An open source load testing tool. 一个开源性能测试工具. define user behaviour with python code, and swarm your ...

  10. R|tableone 快速绘制文章“表一”-基线特征三线表

    首发于“生信补给站” :https://mp.weixin.qq.com/s/LJfgxbTqsp8egnQxEI0nJg 生物医学或其他研究论文中的“表一”多为基线特征的描述性统计.使用R单独进行统 ...