视频自适应关键帧抽取
更新时间:2026-06-15
简介
视频自适应关键帧抽取处理器,使用CLIP和VideoAdaptiveKeyframesSampling算法进行智能抽帧
功能描述
- 基于CLIP的语义理解:利用CLIP模型计算视频帧与文本的语义相似度
- VideoAdaptiveKeyframesSampling自适应分段算法:动态调整关键帧分布,确保重要帧不丢失
- 批量处理:支持高效的批量视频处理
- 多格式支持:兼容多种视频输入格式
- 灵活配置:支持自定义采样率、关键帧数量、模型参数等
- 输入:支持视频URL、BOS地址、本地文件路径等
- 输出:包含关键帧信息的字典数组
- 视频格式:MP4、AVI、MOV等常见视频格式
- 视频帧采样:按指定帧率采样视频帧
- CLIP特征提取:提取视频帧和文本的特征向量
- 相似度计算:计算帧与文本的余弦相似度
- VideoAdaptiveKeyframesSampling关键帧选择:基于相似度分数进行自适应关键帧选择
算子参数
输入
| 输入 | 含义 |
|---|---|
| videos | 输入视频列,类型依据 video_src_type(url/base64/binary)。 |
输出
| 输出 | 含义 |
|---|---|
| result | pyarrow.Array: 包含关键帧信息的字典数组 |
参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| text | str | '' | 用于计算语义相似度的文本描述。 默认值:"" |
| model_path | str | '/opt/aihc/models' | 模型基础路径。如果为空,则从Hugging Face Hub下载模型。 默认值:'' |
| clip_model_name | str | 'openai/clip-vit-base-patch32' | CLIP模型名称/子目录。 默认值:'openai/clip-vit-base-patch32' |
| dtype | str | 'float16' | 模型推理精度选择: - float16: 更快推理 - float32: 更高精度 可选值:["float16", "float32"] 默认值:"float16" |
| video_src_type | str | 'video_url' | 输入视频的格式类型,支持: - 路径/URL(video_url) - base64 编码(video_base64) - 二进制流(video_binary) 可选值: ["video_url", "video_base64", "video_binary"] 默认值: "video_url" |
| fps | float | 1.0 | 候选帧采样率(按fps均匀采样)。 默认值:1.0 |
| max_num_frames | int | 32 | VideoAdaptiveKeyframesSampling最终要选出的关键帧数。 默认值:32 |
| t1 | float | 0.8 | 判断是否有明显峰值的阈值(mean_top - mean)。 默认值:0.8 |
| t2 | float | -100 | 判断是否继续分割的std阈值。 默认值:-100 |
| all_depth | int | 5 | 最大递归深度。 默认值:5 |
| img_type | str | '.jpg' | 输出关键帧图片格式,支持 ".jpg"、".png"。 可选值:[".jpg", ".png"] 默认值:".jpg" |
| output_tos_dir | str | '' | 保存关键帧图片到 BOS 的目标路径,若为空字符串则不上传。 默认值:"" |
| return_keyframes | bool | True | 是否返回关键帧图片的array数据。 默认值:True |
| batch_size | int | 16 | 批量推理的帧数量。 默认值:16 |
| rank | int | 0 | GPU编号。 默认值:0 |
| video_format | str | 'mp4' | 二进制/base64输入的视频格式(如mp4、mov)。 默认值:"mp4" |
调用示例
Python
1from __future__ import annotations
2
3import os
4
5import daft
6from daft import col
7
8from daft.aihc.common.udf import aihc_udf
9from daft.aihc.functions.video.video_adaptive_keyframes_sampling import VideoAdaptiveKeyframesSampling
10
11if __name__ == "__main__":
12 if os.getenv("DAFT_RUNNER", "native") == "ray":
13 import ray
14 ray.init(dashboard_host="0.0.0.0", ignore_reinit_error=True)
15 daft.set_runner_ray()
16 daft.set_execution_config(actor_udf_ready_timeout=6000, min_cpu_per_task=0)
17
18 # TODO: 根据实际场景准备样本数据
19 samples = {
20 "videos": ["bos://bucket/test/aihc/test_data/test_video.mp4"],
21 }
22 ds = daft.from_pydict(samples)
23 constructor_kwargs = {
24 "text": '',
25 "model_path": '/opt/aihc/models',
26 "clip_model_name": 'openai/clip-vit-base-patch32',
27 "dtype": 'float16',
28 "video_src_type": 'video_url',
29 }
30 ds = ds.with_column(
31 "result",
32 aihc_udf(
33 VideoAdaptiveKeyframesSampling,
34 construct_args=constructor_kwargs,
35 num_cpus=1,
36 concurrency=4,
37 batch_size=8,
38 )(col("videos")),
39 )
40 ds.show()
评价此篇文章
