在当今数字化时代,视频内容的爆炸性增长给内容审核带来了前所未有的挑战。传统的人工审核方法不仅耗时耗力,而且难以应对海量视频内容的审核需求。为了解决这一问题,可以利用计算机视觉技术,特别是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
            
视频——一个电影预告片——包含暴力场景。脚本成功地识别出视频中包含暴力场景。通过上述代码,可以根据商业逻辑做出判断。例如,可能决定包含暴力内容的视频(即描绘暴力电影的视频)需要提交给人工审核员进行进一步审核。或者,如果正在运营一个社区,可能拒绝包含暴力场景的内容。