在当今数字化时代,视频内容的爆炸性增长给内容审核带来了前所未有的挑战。传统的人工审核方法不仅耗时耗力,而且难以应对海量视频内容的审核需求。为了解决这一问题,可以利用计算机视觉技术,特别是CLIP模型,来自动化地识别和分类视频内容。这种方法不仅可以大大提高审核效率,还可以减少人工审核的主观性和误差。
例如,假设是一位视频制作人,想要了解某个视频片段是否包含酒精内容。通过使用计算机视觉技术,可以自动识别视频中是否包含酒精,并据此触发特定的商业逻辑,例如在一天中的某个特定时间之前禁止展示该内容。
本指南将展示如何使用Roboflow视频推理API和CLIP模型来审核视频内容。将使用CLIP模型来识别特定的场景(例如暴力、酒精等)。通过本指南的学习,将能够对视频进行分析,识别视频中是否包含特定的内容类别。
将对以下视频进行分析:
# 安装Roboflow pip包
pip install roboflow
# 计算CLIP向量
from roboflow import CLIPModel
model = CLIPModel(api_key="API_KEY")
job_id, signed_url, expire_time = model.predict_video(
"trailer.mp4",
fps=3,
prediction_type="batch-video",
)
results = model.poll_until_video_results(job_id)
with open("results.json", "w") as f:
json.dump(results, f)
在上面的代码中,使用Roboflow视频推理API来计算视频中帧的CLIP向量。首先,需要安装Roboflow Python SDK,然后创建一个新的Python文件并添加上述代码。请将"API_KEY"替换为Roboflow API密钥,将"trailer.mp4"替换为想要进行推理的视频文件名。还可以提供一个指向视频的URL。
fps=3表示每秒进行三次推理。推理次数越高,对视频帧进行推理的次数就越多。有关视频推理定价的更多信息,请参考Roboflow定价页面。上述脚本将在Roboflow云上启动一个视频推理作业。poll_until_video_results函数将每60秒轮询一次Roboflow API以检查结果。当结果可用时,结果将保存到一个文件中。
该文件包含:
- 推理运行的帧,位于frame_offset。
- 与推理运行的帧相对应的时间戳。
- 推理的CLIP向量。
接下来,将比较审核标签与CLIP向量。Roboflow视频推理API返回原始CLIP向量,因为可以利用CLIP向量完成许多不同的任务。在本指南中,将专注于使用CLIP来识别视频中是否包含暴力场景。
import json
import torch
import clip
from PIL import Image
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
with open("results.json", "r") as f:
results = json.load(f)
frames = []
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/16", device=device)
prompts = ["violence", "something else"]
text = clip.tokenize(prompts).to(device)
with torch.no_grad():
text_features = model.encode_text(text)
prompts_to_features = list(zip(prompts, text_features))
buffer = []
for result in results["clip"]:
results_for_frame = {}
for prompt, embedding in prompts_to_features:
results_for_frame[prompt] = cosine_similarity(
embedding.cpu().numpy().reshape(1, -1), np.array(result).reshape(1, -1)
)[0][0]
buffer.append(max(results_for_frame, key=results_for_frame.get))
# 如果连续5次检测为True,则有匹配项
match = False
for i in range(len(buffer) - 5):
if buffer[i : i + 5] == ["violence"] * 5:
match = True
break
print("Match for 'violence':", match)
在这段代码中,为两个提示计算了CLIP向量:“violence”和“something else”。然后,计算每个帧CLIP向量与提示的相似度。如果与提示“violence”相关的CLIP向量在最后20个向量中的5个连续向量中与“something else”向量更相似,将停止对视频的迭代,并记录视频包含暴力内容。代码以这种方式实现,以确保一两个误报不会阻止场景被分类为暴力。
以上脚本的结果是:
Match for 'violence': True
视频——一个电影预告片——包含暴力场景。脚本成功地识别出视频中包含暴力场景。通过上述代码,可以根据商业逻辑做出判断。例如,可能决定包含暴力内容的视频(即描绘暴力电影的视频)需要提交给人工审核员进行进一步审核。或者,如果正在运营一个社区,可能拒绝包含暴力场景的内容。