论文笔记: 视频关键帧抽取相关工作

2024-08-06,星期二,北京,晴

今天来看视频关键帧抽取主题。随着最近Sora文生视频的火热,视频相关的数据获得逐渐变得重要起来。这也就涉及到提取视频关键帧的问题。

从文本生成视频,我们拆分来看,一般流程是先将文本扩写生成几部分,之后将每部分生成对应的图像,这步的图像就可以看做视频的关键帧;最后由这一些关键帧扩展为完整的视频。

而视频关键帧抽取任务则是上述过程的反向操作,目的是构造训练数据使用。目前互联网上完整视频最多。而有对应关键帧的视频数据集则少之又少。

我们主要来看一篇2020年的综述文章Keyframe Extraction Techniques: A Review(https://elektrika.utm.my/index.php/ELEKTRIKA_Journal/article/download/221/136),该工作中系统总结了视频关键帧抽取部分的常用流程和方法。主要有以下几步来做:

在这里插入图片描述

其中,Keyframe Extraction Process主要有Sampling-Based、Shot-Based、Clustering-Based和其他方法

Sampling-Based:

  • 不考虑视频内容,从视频帧中,均匀或者随机采样即可。直白来说就是每隔几帧采样一次。
  • 缺点是:sample所得帧并不一定代表整个video,而且会有大量内容相似的帧。

Shot-Based:

  • 该方法分为两步:首先检测镜头边缘或转换卡点,将video分成小的shots,之后再做关键帧提取,通常选择小的shots的第一帧和最后一帧最为关键帧。因为这两帧图像,很确定有镜头变换的

Clustering-Based:

  • 聚类相似的视频帧图像点,在每一个cluster中,挑选距离cluster最近的作为关键帧。
  • 缺点是:事先确定cluster数量比较困难

关键帧提取算法评估指标:
Compress ratio:
C R = ( 1 − N k N f ) × 100 % CR = (1 - \frac{N_{k}}{N_{f}}) \times 100\% CR=(1NfNk)×100%
N f N_{f} Nf: 视频总帧数

N k N_{k} Nk: 提取的关键帧数目

Precision and Recall:
P r e c i s i o n = N a N k × 100 % R e c a l l = N a N a + N m × 100 % Precision = \frac{N_{a}}{N_{k}} \times 100\% \\ Recall = \frac{N_{a}}{N_{a} + N_{m}} \times 100\% Precision=NkNa×100%Recall=Na+NmNa×100%

N a N_{a} Na: 准确的keyframes数
N k N_{k} Nk: 提取得到的keyframes数目
N m N_{m} Nm: 丢失的key frame数目

F-Measure:
F = 2 × p r e c i s i o n i × r e c a l l p r e c i s i o n + r e c a l l F = 2 \times \frac{precisioni \times recall}{precision + recall} F=2×precision+recallprecisioni×recall

Computational Time:
提取关键帧所用时间

相关开源仓库

  • https://github.com/Breakthrough/PySceneDetect
  • https://github.com/keplerlab/katna
  • https://github.com/amanwalia123/KeyFramesExtraction
  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python视频关键帧抽取是指使用Python编程语言来从视频中提取关键帧(Key Frames)的过程。 关键帧是在视频中起关键作用的帧,它们能够概括和表示视频内容的主要信息。一般来说,关键帧视频中发生剧烈变化或重要场景的帧,与其它连续帧相比具有较高的信息量。 在Python中,可以使用一些现有的库和工具来实现视频关键帧抽取。其中最常用的是OpenCV库,它提供了强大的图像和视频处理功能。 以下是一个简单的Python代码示例,演示了如何使用OpenCV来进行视频关键帧抽取: ```python import cv2 def extract_keyframes(video_path, interval): video_capture = cv2.VideoCapture(video_path) keyframes = [] frame_count = 0 while True: success, frame = video_capture.read() if not success: break if frame_count % interval == 0: keyframes.append(frame) frame_count += 1 video_capture.release() return keyframes # 调用抽取函数,提取每隔10帧的关键帧 keyframes = extract_keyframes('input_video.mp4', 10) # 保存关键帧为图像文件 for i, keyframe in enumerate(keyframes): cv2.imwrite(f'keyframe_{i}.jpg', keyframe) ``` 在这个示例中,我们首先导入了OpenCV库。然后定义了一个`extract_keyframes`函数,它接受视频路径和关键帧间隔作为参数。 在函数内部,我们使用`cv2.VideoCapture()`打开视频文件,并通过`read()`方法逐帧读取视频。然后根据设定的关键帧间隔,选择每隔一定帧数的帧作为关键帧,并将其存储在`keyframes`列表中。 最后,我们通过`cv2.imwrite()`将提取到的关键帧保存为图像文件。 通过以上代码,我们可以方便地使用Python来实现视频关键帧抽取,从而获得视频的主要内容信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值