Skip to content

Instantly share code, notes, and snippets.

@Cdaprod
Created July 3, 2024 18:57
Show Gist options
  • Save Cdaprod/98553701e9a0249deb5be1884efb3160 to your computer and use it in GitHub Desktop.
Save Cdaprod/98553701e9a0249deb5be1884efb3160 to your computer and use it in GitHub Desktop.
These steps provide a structured approach to processing, analyzing, and searching video files using LangChain and related tools. This workflow leverages the strengths of various components to provide comprehensive video analysis capabilities.

To process and analyze video files using LangChain, you can follow some best practices and examples from the LangChain cookbook and related resources. Here's a comprehensive approach to accomplish video analysis and search:

Extracting Frames from Video

First, you need to extract frames from the video, which can be done using a library like OpenCV:

import cv2
import os

def extract_frames(video_path, output_folder):
    cap = cv2.VideoCapture(video_path)
    frame_rate = cap.get(cv2.CAP_PROP_FPS)
    success, frame = cap.read()
    count = 0
    while success:
        cv2.imwrite(os.path.join(output_folder, f"frame_{count}.jpg"), frame)
        success, frame = cap.read()
        count += 1
    cap.release()

Extracting Features from Frames

Use a pre-trained model like ResNet to extract features from each frame. These features can be embedded into a vector space for similarity search:

import numpy as np
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
from tensorflow.keras.preprocessing import image

model = ResNet50(weights='imagenet', include_top=False)

def extract_features(img_path):
    img = image.load_img(img_path, target_size=(224, 224))
    img_data = image.img_to_array(img)
    img_data = np.expand_dims(img_data, axis=0)
    img_data = preprocess_input(img_data)
    features = model.predict(img_data)
    return features.flatten()

Storing and Querying Vectors in Weaviate

Store the extracted features in Weaviate, and use LangChain to manage and query the data:

import weaviate
from langchain.vectorstores import WeaviateVectorStore
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import Runnable

client = weaviate.Client("http://localhost:8080")

schema = {
    "classes": [
        {
            "class": "Frame",
            "properties": [
                {"name": "frame_id", "dataType": ["int"]},
                {"name": "features", "dataType": ["blob"]}
            ]
        }
    ]
}
client.schema.create(schema)

def store_features(frame_id, features):
    client.data_object.create({
        "frame_id": frame_id,
        "features": features.tolist()
    }, "Frame")

output_folder = "path_to_extracted_frames"
for frame_file in os.listdir(output_folder):
    frame_path = os.path.join(output_folder, frame_file)
    features = extract_features(frame_path)
    frame_id = int(frame_file.split('_')[1].split('.')[0])
    store_features(frame_id, features)

query_vector = extract_features("path_to_query_frame.jpg")
result = client.query.get("Frame", ["frame_id"]).with_near_vector(query_vector).do()
print(result)

Using LangChain for Video Captioning

You can use LangChain's components to handle video captioning, as shown in this example from the LangChain cookbook:

import openai
from langchain.prompts import ChatPromptTemplate
from langchain.output_parsers.openai_tools import PydanticToolsParser
from langchain.language_models import OpenAI

video_path = "path_to_video.mp4"
with open(video_path, "rb") as video_file:
    video_data = video_file.read()

prompt = ChatPromptTemplate.from_messages([
    ("system", "Caption the following video."),
    ("user", "{input}")
])

llm = OpenAI(model_name="text-davinci-002")

chain = prompt | llm | PydanticToolsParser()
response = chain.invoke({"input": video_data})
print(response)

Resources

These steps provide a structured approach to processing, analyzing, and searching video files using LangChain and related tools. This workflow leverages the strengths of various components to provide comprehensive video analysis capabilities.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment