视频内容自动分类与审核

在当今数字化时代,视频内容的爆炸性增长给内容审核带来了前所未有的挑战。传统的人工审核方法不仅耗时耗力,而且难以应对海量视频内容的审核需求。为了解决这一问题,可以利用计算机视觉技术,特别是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

视频——一个电影预告片——包含暴力场景。脚本成功地识别出视频中包含暴力场景。通过上述代码,可以根据商业逻辑做出判断。例如,可能决定包含暴力内容的视频(即描绘暴力电影的视频)需要提交给人工审核员进行进一步审核。或者,如果正在运营一个社区,可能拒绝包含暴力场景的内容。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485