大模型实践笔记(2)——Clip改进:通过文本检索视频帧

目录

超参数设置

配置LLM-clip的backbone

文本编码

抽取视频帧并编码

视频帧匹配

保存结果帧

工程流


全是干货

超参数设置

python 复制代码
# 超参数设置
PARAMS = {
    "clip_model": "openai/clip-vit-base-patch32", # 推理模型名称
    "video_folder": "./video_test", # 视频文件夹路径
    "text_description": "A photo of a person wearing pink clothes", # 文本特征描述
    "frame_extraction_interval": 10, # 每隔多少秒提取一帧
    "save_frames_dir": "saved_frames", # 保存匹配帧的目录
}

配置LLM-clip的backbone

python 复制代码
from transformers import CLIPProcessor, CLIPModel
import torch

# 加载CLIP模型和处理器
model = CLIPModel.from_pretrained(PARAMS["clip_model"])
processor = CLIPProcessor.from_pretrained(PARAMS["clip_model"])

文本编码

python 复制代码
text_inputs = processor(text=[PARAMS["text_description"]], return_tensors="pt", padding=True)
with torch.no_grad():
    text_embedding = model.get_text_features(**text_inputs)

抽取视频帧并编码

python 复制代码
from moviepy.editor import VideoFileClip
import numpy as np

def extract_frames(video_path, interval):
    clip = VideoFileClip(video_path)
    frame_times = np.arange(0, int(clip.duration), interval)
    frames = [clip.get_frame(t) for t in frame_times]
    return frames, frame_times

def get_frame_embeddings(frames):
    frame_embeddings = []
    for frame in frames:
        frame_inputs = processor(images=frame, return_tensors="pt", padding=True)
        with torch.no_grad():
            # 使用 get_image_features 方法来获取图像特征
            frame_outputs = model.get_image_features(**frame_inputs)
        # 直接使用 frame_outputs,不需要访问 pooler_output
        frame_embeddings.append(frame_outputs)
    return torch.vstack(frame_embeddings)

视频帧匹配

python 复制代码
def find_best_matching_frames(video_path, text_embedding, interval, top_k=10):
    frames, frame_times = extract_frames(video_path, interval)
    frame_embeddings = get_frame_embeddings(frames)
    similarities = torch.nn.functional.cosine_similarity(text_embedding, frame_embeddings.squeeze())
    top_k_values, top_k_indices = similarities.topk(top_k)
    return [(frames[idx], frame_times[idx]) for idx in top_k_indices.cpu().numpy()]

保存结果帧

python 复制代码
from PIL import Image
import os

def save_frames(frames_info, video_path, save_dir):
    # 从视频路径中提取视频名称作为文件夹名称
    video_name = os.path.basename(video_path).split('.')[0]
    save_path = os.path.join(save_dir, video_name)
    os.makedirs(save_path, exist_ok=True)
    
    for i, (frame, time) in enumerate(frames_info):
        frame_image = Image.fromarray(frame)
        frame_image.save(os.path.join(save_path, f"frame_at_{time:.2f}s_{i+1}.png"))

工程流

python 复制代码
def main(PARAMS):
    video_paths = [os.path.join(PARAMS["video_folder"], f) for f in os.listdir(PARAMS["video_folder"]) if f.endswith('.mp4')]
    
    # 确定保存图像的目录
    save_dir = PARAMS.get("save_frames_dir", "./saved_frames")
    os.makedirs(save_dir, exist_ok=True)
    
    for video_path in video_paths:
        best_frames_info = find_best_matching_frames(video_path, text_embedding, PARAMS["frame_extraction_interval"], top_k=10)
        save_frames(best_frames_info, video_path, save_dir)
        print(f"Saved top 10 frames for video {video_path} in {save_dir}.")


if __name__ == "__main__":
    main(PARAMS)
相关推荐
BYSJMG3 小时前
计算机毕设选题做什么好?基于大数据的用户健身行为数据分析与可视化系统,Hadoop+Spark处理
大数据·人工智能·hadoop·数据分析·spark·课程设计
知见漫记7 小时前
AI 桌面 Agent 本地执行能力技术对照:沙箱机制与权限模式拆解
大数据·人工智能
xcl09258 小时前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
cspttty8 小时前
国际经济与贸易专业考什么证对就业有帮助
大数据
知识分享小能手8 小时前
深度学习学习教程,从入门到精通,深度学习中的正则化 — 完整知识点与代码示例(7)
人工智能·深度学习·学习
足球魅力9 小时前
哪款足球软件能分析凯利指数大数据?
大数据·业界资讯
LaughingZhu9 小时前
Product Hunt 每日热榜 | 2026-09-05
人工智能·深度学习·神经网络·搜索引擎·百度
xwz小王子9 小时前
机器人的“最后一毫米”: 新加坡南洋理工大学Facet-0如何教会基础模型“感受”自己的动作?
大数据·人工智能·机器人
腾视科技-AI9 小时前
腾视科技AIBOX双版本重磅发布!本地安全与全球适配,解锁视频智能新可能
大数据·人工智能·科技·安全·大模型·腾视科技·ai算力盒
姜穆澜10 小时前
OneID 从 0 到 1 完整生产案例(五)
大数据·notepad++