大模型实践笔记(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)
相关推荐
静心问道8 分钟前
TrOCR: 基于Transformer的光学字符识别方法,使用预训练模型
人工智能·深度学习·transformer·多模态
亲持红叶11 分钟前
GLU 变种:ReGLU 、 GEGLU 、 SwiGLU
人工智能·深度学习·神经网络·激活函数
火火PM打怪中3 小时前
产品经理如何绘制服务蓝图(Service Blueprint)
大数据·产品经理
绝顶大聪明9 小时前
【深度学习】神经网络-part2
人工智能·深度学习·神经网络
Danceful_YJ10 小时前
16.使用ResNet网络进行Fashion-Mnist分类
人工智能·深度学习·神经网络·resnet
Elastic 中国社区官方博客11 小时前
在 Windows 上使用 Docker 运行 Elastic Open Crawler
大数据·windows·爬虫·elasticsearch·搜索引擎·docker·容器
甄卷12 小时前
李沐动手学深度学习Pytorch-v2笔记【08线性回归+基础优化算法】2
pytorch·深度学习·算法
一切顺势而行12 小时前
Flink cdc 使用总结
大数据·flink
豆豆12 小时前
神经网络构建
人工智能·深度学习·神经网络
一勺汤14 小时前
多尺度频率辅助类 Mamba 线性注意力模块(MFM),融合频域和空域特征,提升多尺度、复杂场景下的目标检测能力
深度学习·yolo·yolov12·yolo12·yolo12改进·小目标·mamba like