视频美学评分(帧级)
更新时间:2026-09-14
简介
视频美学评分算子:抽帧后逐帧过 LAION 美学预测器(CLIP 主干 + 线性回归头),再按 reduce_mode 聚合成一个视频级分数。与已有 DOVERVideoAesthetic(时空双分支的视频质量网络)方法不同,分值量纲不可互比。
功能描述
- 抽帧内置
VideoFrameSampler,默认by_count_uniform+count_k=3;sample_mode与时间窗、间隔、时间戳、max_frames参数全部透传 - 按权重目录名选预测器实现:名字含
v1用AestheticsPredictorV1,含v2且含linear用AestheticsPredictorV2Linear,含v2且含relu用AestheticsPredictorV2ReLU,都不匹配时初始化抛ValueError - 归一化:
normalize_by_ten=None时,模型名含aesthetics-predictor就把原始 [0,10] 分除以 10,输出落在 [0,1];显式传 True/False 可覆盖 VideoFrameSampler输出 BGR 帧,算子内部转 RGB 后再交给CLIPProcessor- 聚合支持
avg/max/min,结果保留 6 位小数 - 逐帧分数按
batch_size微批推理,单个微批推理异常只丢这批帧并打日志,不让整列失败 - 抽帧口径由
VideoFrameSampler的by_count_uniform决定:在抽帧时间窗内按时间均匀取点 - 整列抽帧失败、帧形状非法、或该视频所有帧都推理失败时,该行返回 None
- 权重只从
model_path/model_name本地目录加载,初始化时校验目录存在,不联网下载
算子参数
输入
| 输入 | 含义 |
|---|---|
| videos | 视频列,内容形式由 video_src_type 决定(本地/BOS/HTTP 路径、Base64 字符串、二进制) |
输出
| 输出 | 含义 |
|---|---|
| aesthetic_score | float64,逐帧美学分按 reduce_mode 聚合后的视频级分数;默认权重下已除以 10,取值 [0,1]。无有效帧或全部帧推理失败返回 None |
参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| video_src_type | str | "video_url" | 视频输入类型:video_url(本地/BOS/HTTP 路径)、video_base64、video_binary |
| model_path | str | "/opt/aihc/model" | 权重根目录 |
| model_name | str | "shunk031/aesthetics-predictor-v2-sac-logos-ava1-l14-linearMSE" | 相对 model_path 的权重子目录 |
| sample_mode | str | "by_count_uniform" | 抽帧模式,透传 VideoFrameSampler:by_count_uniform / by_interval_time / by_interval_frames / by_fps / by_timestamps |
| start_time_sec | float | 0.0 | 抽帧起始秒 |
| end_time_sec | float 或 None | None | 抽帧结束秒,None 表示到视频末尾 |
| count_k | int 或 None | 3 | by_count_uniform 模式的抽帧数 |
| interval_sec | float 或 None | None | by_interval_time 模式的间隔秒 |
| interval_frames | int 或 None | None | by_interval_frames 模式的间隔帧 |
| target_fps | float 或 None | None | by_fps 模式的目标帧率 |
| timestamps_sec | list[float] 或 None | None | by_timestamps 模式的时间戳列表(秒) |
| max_frames | int 或 None | None | 抽帧数上限,None 不限 |
| reduce_mode | str | "avg" | 帧分数聚合方式:avg / max / min |
| normalize_by_ten | bool 或 None | None | 是否把分数除以 10;None 时按模型名是否含 "aesthetics-predictor" 自动判断 |
| video_format | str | "mp4" | video_binary / video_base64 输入时的容器格式 |
| batch_size | int | 16 | 算子内部推理微批大小(与 aihc_udf 的 batch_size 是两个参数) |
| rank | int | 0 | 多卡场景 worker 序号,设备取 cuda:(rank % 可见卡数) |
注意事项
- 与
ImageAestheticScore虽是同一份 LAION MLP 权重,但封装形式不同(HF 模型 vs CLIP-L14 + 裸.pth),且本算子默认再除以 10,两者分值不能直接比较;与DOVERVideoAesthetic是不同方法,更不可比。 - 本算子只出分、不做样本过滤,
min_score/max_score之类的阈值判断在 daft 侧用where()做。 - 一次
transform会先把该批次所有视频抽出的帧全部转成 PIL 图像再分批推理,峰值内存约等于 UDFbatch_size× 单视频抽帧数 × 帧尺寸;长视频或大count_k时要压小 UDFbatch_size。
调用示例
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_aesthetic_score import VideoAestheticScore
10
11os.environ.setdefault("BOS_ENDPOINT", "http://bj.bcebos.com")
12os.environ.setdefault("BOS_REGION", "bj")
13
14if __name__ == "__main__":
15 if os.getenv("DAFT_RUNNER", "native") == "ray":
16 import ray
17 ray.init(dashboard_host="0.0.0.0", ignore_reinit_error=True)
18 daft.set_runner_ray()
19 daft.set_execution_config(actor_udf_ready_timeout=6000, min_cpu_per_task=0)
20
21ds = daft.from_pydict({"video": ["bos://your-bucket/sample.mp4"]})
22 ds = ds.with_column(
23 "aesthetic_score",
24 aihc_udf(
25 VideoAestheticScore,
26 construct_args={
27 "video_src_type": "video_url",
28 "model_path": "/path/to/models",
29 "model_name": "shunk031/aesthetics-predictor-v2-sac-logos-ava1-l14-linearMSE",
30 "sample_mode": "by_count_uniform",
31 "count_k": 3,
32 "reduce_mode": "avg",
33 "batch_size": 16,
34 },
35 num_cpus=1,
36 num_gpus=1,
37 concurrency=1,
38 batch_size=1,
39 )(col("video")),
40 )
41 ds.show()
评价此篇文章
