视频水印概率
更新时间:2026-09-14
简介
视频水印概率算子:抽帧后逐帧过 HuggingFace 水印图像分类器,取「有水印」类别的 softmax 概率,再按 reduce_mode 聚合成视频级概率。只出概率,不给水印位置。
功能描述
- 抽帧内置
VideoFrameSampler,默认by_count_uniform+count_k=3;sample_mode与时间窗、间隔、时间戳、max_frames参数全部透传 - 逐帧
softmax(logits)后取「有水印」类别的概率:类别下标从model.config.id2label里找含watermark且不含no的那一项,找不到时回落到下标 1(不同权重的 label 命名习惯不同) VideoFrameSampler输出 BGR 帧,算子内部转 RGB 后再交给AutoImageProcessor- 聚合支持
avg/max/min,结果保留 6 位小数 - 按
batch_size微批推理,单个微批异常只丢这批帧并打日志,不让整列失败 - 抽帧默认均匀抽 3 帧,吞吐可控但覆盖面有限;水印通常整片存在,抽样代价可接受,需要更全的覆盖可调大
count_k或换by_fps/by_interval_*模式 - 整列抽帧失败、帧形状非法、或该视频所有帧都推理失败时,该行返回 None
- 权重只从
model_path/model_name本地目录加载,初始化时校验目录存在,不联网下载
算子参数
输入
| 输入 | 含义 |
|---|---|
| videos | 视频列,内容形式由 video_src_type 决定(本地/BOS/HTTP 路径、Base64 字符串、二进制) |
输出
| 输出 | 含义 |
|---|---|
| watermark_prob | float64,逐帧水印概率按 reduce_mode 聚合后的结果,取值 [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 | "amrul-hzz/watermark_detector" | 相对 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 |
| video_format | str | "mp4" | video_binary / video_base64 输入时的容器格式 |
| batch_size | int | 16 | 算子内部推理微批大小(与 aihc_udf 的 batch_size 是两个参数) |
| rank | int | 0 | 多卡场景 worker 序号,设备取 cuda:(rank % 可见卡数) |
注意事项
- 与存量的
VideoWatermarkDetect是两个不同算子:后者走 PP-OCRv4 文本检测 + 跨帧位置一致性,输出水印区域;本算子是逐帧图像分类器,输出水印概率,不给位置。目标相同、方法不同,按需选用。 - 本算子只出概率、不做样本过滤,例如
prob_threshold=0.8这类阈值判断在 daft 侧用where()做。 - 一次
transform会先把该批次所有视频抽出的帧全部转成 PIL 图像再分批推理,峰值内存约等于 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_watermark_prob import VideoWatermarkProb
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 "watermark_prob",
24 aihc_udf(
25 VideoWatermarkProb,
26 construct_args={
27 "video_src_type": "video_url",
28 "model_path": "/path/to/models",
29 "model_name": "amrul-hzz/watermark_detector",
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 # 过滤水印概率高于 0.8 的视频
42 ds = ds.where(col("watermark_prob") < 0.8)
43 ds.show()
评价此篇文章
