milvus-logo
LFAI
Home
  • Integrationen

Erweiterte Videosuche: Nutzung von Twelve Labs und Milvus für die semantische Suche

Einführung

Willkommen zu diesem umfassenden Tutorial zur Implementierung der semantischen Videosuche mit der Twelve Labs Embed API und Milvus. In diesem Leitfaden erfahren Sie, wie Sie die Leistungsfähigkeit der fortschrittlichen multimodalen Einbettungen von Twelve Labs und der effizienten Vektordatenbank von Milvus nutzen können, um eine robuste Videosuchlösung zu erstellen. Durch die Integration dieser Technologien können Entwickler neue Möglichkeiten bei der Analyse von Videoinhalten erschließen und Anwendungen wie inhaltsbasierte Videoabfragen, Empfehlungssysteme und hochentwickelte Suchmaschinen, die die Nuancen von Videodaten verstehen, ermöglichen.

Dieser Lehrgang führt Sie durch den gesamten Prozess, von der Einrichtung Ihrer Entwicklungsumgebung bis zur Implementierung einer funktionalen semantischen Videosuchanwendung. Wir behandeln Schlüsselkonzepte wie die Erzeugung multimodaler Einbettungen aus Videos, deren effiziente Speicherung in Milvus und die Durchführung von Ähnlichkeitssuchen zum Abrufen relevanter Inhalte. Ganz gleich, ob Sie eine Videoanalyseplattform oder ein Tool zur Erkennung von Inhalten entwickeln oder Ihre bestehenden Anwendungen mit Funktionen für die Videosuche erweitern möchten, dieses Handbuch vermittelt Ihnen das Wissen und die praktischen Schritte, um die kombinierten Stärken von Twelve Labs und Milvus in Ihren Projekten zu nutzen.

Voraussetzungen

Bevor wir beginnen, stellen Sie sicher, dass Sie über die folgenden Voraussetzungen verfügen:

Einen API-Schlüssel von Twelve Labs (melden Sie sich unter https://api.twelvelabs.io an, wenn Sie noch keinen haben) Python 3.7 oder höher auf Ihrem System installiert

Einrichten der Entwicklungsumgebung

Erstellen Sie ein neues Verzeichnis für Ihr Projekt und navigieren Sie dorthin:

mkdir video-search-tutorial
cd video-search-tutorial

Richten Sie eine virtuelle Umgebung ein (optional, aber empfohlen):

python -m venv venv
source venv/bin/activate  # On Windows, use `venv\Scripts\activate`

Installieren Sie die erforderlichen Python-Bibliotheken:

pip install twelvelabs pymilvus

Erstellen Sie eine neue Python-Datei für Ihr Projekt:

touch video_search.py

Diese Datei video_search.py wird das Hauptskript sein, das wir für den Lehrgang verwenden. Als Nächstes richten Sie Ihren Twelve Labs API-Schlüssel als Umgebungsvariable ein, um die Sicherheit zu gewährleisten:

export TWELVE_LABS_API_KEY='your_api_key_here'

Verbindung zu Milvus herstellen

Um eine Verbindung mit Milvus herzustellen, verwenden wir die Klasse MilvusClient. Dieser Ansatz vereinfacht den Verbindungsprozess und ermöglicht es uns, mit einer lokalen, dateibasierten Milvus-Instanz zu arbeiten, was für unser Tutorial perfekt ist.

from pymilvus import MilvusClient

# Initialize the Milvus client
milvus_client = MilvusClient("milvus_twelvelabs_demo.db")

print("Successfully connected to Milvus")

Dieser Code erstellt eine neue Milvus-Client-Instanz, die alle Daten in einer Datei namens milvus_twelvelabs_demo.db speichert. Dieser dateibasierte Ansatz ist ideal für Entwicklungs- und Testzwecke.

Erstellen einer Milvus-Sammlung für Videoeinbettungen

Nachdem wir nun mit Milvus verbunden sind, können wir eine Sammlung erstellen, um unsere Videoeinbettungen und die zugehörigen Metadaten zu speichern. Wir definieren das Sammlungsschema und erstellen die Sammlung, falls sie noch nicht vorhanden ist.

# Initialize the collection name
collection_name = "twelvelabs_demo_collection"

# Check if the collection already exists and drop it if it does
if milvus_client.has_collection(collection_name=collection_name):
    milvus_client.drop_collection(collection_name=collection_name)

# Create the collection
milvus_client.create_collection(
    collection_name=collection_name,
    dimension=1024  # The dimension of the Twelve Labs embeddings
)

print(f"Collection '{collection_name}' created successfully")

In diesem Code wird zunächst geprüft, ob die Sammlung bereits existiert, und wenn ja, wird sie gelöscht. Auf diese Weise wird sichergestellt, dass wir mit einer reinen Weste beginnen. Die Sammlung wird mit einer Dimension von 1024 erstellt, was der Ausgabedimension der Einbettungen von Twelve Labs entspricht.

Erzeugen von Einbettungen mit der Twelve Labs Embed API

Um Einbettungen für unsere Videos mit der Twelve Labs Embed API zu erzeugen, verwenden wir das Twelve Labs Python SDK. Bei diesem Prozess wird eine Einbettungsaufgabe erstellt, auf ihre Fertigstellung gewartet und die Ergebnisse abgerufen. So wird dies umgesetzt:

Stellen Sie zunächst sicher, dass Sie das Twelve Labs SDK installiert haben und importieren Sie die erforderlichen Module:

from twelvelabs import TwelveLabs
from twelvelabs.models.embed import EmbeddingsTask
import os

# Retrieve the API key from environment variables
TWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')

Initialisieren Sie den Twelve Labs-Client:

twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)

Erstellen Sie eine Funktion zur Erzeugung von Einbettungen für eine bestimmte Video-URL:

def generate_embedding(video_url):
    """
    Generate embeddings for a given video URL using the Twelve Labs API.

    This function creates an embedding task for the specified video URL using
    the Marengo-retrieval-2.6 engine. It monitors the task progress and waits
    for completion. Once done, it retrieves the task result and extracts the
    embeddings along with their associated metadata.

    Args:
        video_url (str): The URL of the video to generate embeddings for.

    Returns:
        tuple: A tuple containing two elements:
            1. list: A list of dictionaries, where each dictionary contains:
                - 'embedding': The embedding vector as a list of floats.
                - 'start_offset_sec': The start time of the segment in seconds.
                - 'end_offset_sec': The end time of the segment in seconds.
                - 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').
            2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.

    Raises:
        Any exceptions raised by the Twelve Labs API during task creation,
        execution, or retrieval.
    """

    # Create an embedding task
    task = twelvelabs_client.embed.task.create(
        engine_name="Marengo-retrieval-2.6",
        video_url=video_url
    )
    print(f"Created task: id={task.id} engine_name={task.engine_name} status={task.status}")

    # Define a callback function to monitor task progress
    def on_task_update(task: EmbeddingsTask):
        print(f"  Status={task.status}")

    # Wait for the task to complete
    status = task.wait_for_done(
        sleep_interval=2,
        callback=on_task_update
    )
    print(f"Embedding done: {status}")

    # Retrieve the task result
    task_result = twelvelabs_client.embed.task.retrieve(task.id)

    # Extract and return the embeddings
    embeddings = []
    for v in task_result.video_embeddings:
        embeddings.append({
            'embedding': v.embedding.float,
            'start_offset_sec': v.start_offset_sec,
            'end_offset_sec': v.end_offset_sec,
            'embedding_scope': v.embedding_scope
        })
    
    return embeddings, task_result

Verwenden Sie die Funktion, um Einbettungen für Ihre Videos zu generieren:

# Example usage
video_url = "https://example.com/your-video.mp4"

# Generate embeddings for the video
embeddings, task_result = generate_embedding(video_url)

print(f"Generated {len(embeddings)} embeddings for the video")
for i, emb in enumerate(embeddings):
    print(f"Embedding {i+1}:")
    print(f"  Scope: {emb['embedding_scope']}")
    print(f"  Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds")
    print(f"  Embedding vector (first 5 values): {emb['embedding'][:5]}")
    print()

Mit dieser Implementierung können Sie Einbettungen für jede beliebige Video-URL mithilfe der Twelve Labs Embed-API generieren. Die Funktion generate_embedding übernimmt den gesamten Prozess, von der Erstellung der Aufgabe bis zum Abrufen der Ergebnisse. Sie gibt eine Liste von Wörterbüchern zurück, die jeweils einen Einbettungsvektor zusammen mit seinen Metadaten (Zeitspanne und Umfang) enthalten. Denken Sie daran, mögliche Fehler wie Netzwerkprobleme oder API-Limits in einer Produktionsumgebung zu behandeln. Je nach Anwendungsfall können Sie auch Wiederholungsversuche oder eine robustere Fehlerbehandlung implementieren.

Einfügen von Einbettungen in Milvus

Nach der Generierung von Einbettungen mit der Twelve Labs Embed API werden diese Einbettungen zusammen mit ihren Metadaten in unsere Milvus-Sammlung eingefügt. Dieser Prozess ermöglicht es uns, unsere Videoeinbettungen zu speichern und zu indizieren, um später eine effiziente Ähnlichkeitssuche durchzuführen.

So fügen Sie die Einbettungen in Milvus ein:

def insert_embeddings(milvus_client, collection_name, task_result, video_url):
    """
    Insert embeddings into the Milvus collection.

    Args:
        milvus_client: The Milvus client instance.
        collection_name (str): The name of the Milvus collection to insert into.
        task_result (EmbeddingsTaskResult): The task result containing video embeddings.
        video_url (str): The URL of the video associated with the embeddings.

    Returns:
        MutationResult: The result of the insert operation.

    This function takes the video embeddings from the task result and inserts them
    into the specified Milvus collection. Each embedding is stored with additional
    metadata including its scope, start and end times, and the associated video URL.
    """
    data = []

    for i, v in enumerate(task_result.video_embeddings):
        data.append({
            "id": i,
            "vector": v.embedding.float,
            "embedding_scope": v.embedding_scope,
            "start_offset_sec": v.start_offset_sec,
            "end_offset_sec": v.end_offset_sec,
            "video_url": video_url
        })

    insert_result = milvus_client.insert(collection_name=collection_name, data=data)
    print(f"Inserted {len(data)} embeddings into Milvus")
    return insert_result

# Usage example
video_url = "https://example.com/your-video.mp4"

# Assuming this function exists from previous step
embeddings, task_result = generate_embedding(video_url)

# Insert embeddings into the Milvus collection
insert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)
print(insert_result)

Diese Funktion bereitet die Daten für das Einfügen vor, einschließlich aller relevanten Metadaten wie dem Einbettungsvektor, dem Zeitbereich und der Quellvideo-URL. Anschließend verwendet sie den Milvus-Client, um diese Daten in die angegebene Sammlung einzufügen.

Sobald wir unsere Einbettungen in Milvus gespeichert haben, können wir eine Ähnlichkeitssuche durchführen, um die relevantesten Videosegmente auf der Grundlage eines Abfragevektors zu finden. Im Folgenden wird beschrieben, wie diese Funktionalität implementiert wird:

def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):
    """
    Perform a similarity search on the Milvus collection.

    Args:
        milvus_client: The Milvus client instance.
        collection_name (str): The name of the Milvus collection to search in.
        query_vector (list): The query vector to search for similar embeddings.
        limit (int, optional): The maximum number of results to return. Defaults to 5.

    Returns:
        list: A list of search results, where each result is a dictionary containing
              the matched entity's metadata and similarity score.

    This function searches the specified Milvus collection for embeddings similar to
    the given query vector. It returns the top matching results, including metadata
    such as the embedding scope, time range, and associated video URL for each match.
    """
    search_results = milvus_client.search(
        collection_name=collection_name,
        data=[query_vector],
        limit=limit,
        output_fields=["embedding_scope", "start_offset_sec", "end_offset_sec", "video_url"]
    )

    return search_results
    
# define the query vector
# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.
query_vector = task_result.video_embeddings[0].embedding.float

# Perform a similarity search on the Milvus collection
search_results = perform_similarity_search(milvus_client, collection_name, query_vector)

print("Search Results:")
for i, result in enumerate(search_results[0]):
    print(f"Result {i+1}:")
    print(f"  Video URL: {result['entity']['video_url']}")
    print(f"  Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds")
    print(f"  Similarity Score: {result['distance']}")
    print()

Diese Implementierung tut Folgendes:

  1. Definiert eine Funktion perform_similarity_search, die einen Abfragevektor nimmt und nach ähnlichen Einbettungen in der Milvus-Sammlung sucht.
  2. Verwendet die Suchmethode des Milvus-Clients, um die ähnlichsten Vektoren zu finden.
  3. Gibt die Ausgabefelder an, die wir abrufen möchten, einschließlich der Metadaten über die übereinstimmenden Videosegmente.
  4. Bietet ein Beispiel für die Verwendung dieser Funktion mit einem Abfragevideo, wobei zunächst dessen Einbettung generiert und dann für die Suche verwendet wird.
  5. Druckt die Suchergebnisse aus, einschließlich relevanter Metadaten und Ähnlichkeitswerte.

Durch die Implementierung dieser Funktionen haben Sie einen vollständigen Arbeitsablauf für die Speicherung von Videoeinbettungen in Milvus und die Durchführung von Ähnlichkeitssuchen geschaffen. Diese Einrichtung ermöglicht eine effiziente Suche nach ähnlichen Videoinhalten auf der Grundlage der von der Embed-API von Twelve Labs generierten multimodalen Einbettungen.

Optimierung der Leistung

Nun gut, bringen wir diese Anwendung auf die nächste Stufe! Beim Umgang mit großen Videosammlungen ist die Leistung entscheidend. Um diese zu optimieren, sollten wir eine Stapelverarbeitung für die Erzeugung von Einbettungen und das Einfügen in Milvus implementieren. Auf diese Weise können wir mehrere Videos gleichzeitig verarbeiten und die Gesamtverarbeitungszeit erheblich reduzieren. Außerdem könnten wir die Partitionierungsfunktion von Milvus nutzen, um unsere Daten effizienter zu organisieren, beispielsweise nach Videokategorien oder Zeiträumen. Dies würde die Abfragen beschleunigen, da wir nur relevante Partitionen durchsuchen könnten.

Ein weiterer Optimierungstrick ist die Verwendung von Caching-Mechanismen für häufig verwendete Einbettungen oder Suchergebnisse. Dies könnte die Antwortzeiten für beliebte Suchanfragen drastisch verbessern. Vergessen Sie nicht, die Indexparameter von Milvus auf der Grundlage Ihres spezifischen Datensatzes und Ihrer Abfragemuster fein abzustimmen - eine kleine Anpassung kann die Suchleistung erheblich verbessern.

Erweiterte Funktionen

Fügen wir nun einige coole Funktionen hinzu, damit sich unsere Anwendung von anderen abhebt! Wir könnten eine hybride Suche implementieren , die Text- und Videoabfragen kombiniert. Tatsächlich kann die Twelve Labs Embed API auch Texteinbettungen für Ihre Textabfragen erzeugen. Stellen Sie sich vor, die Nutzer könnten sowohl eine Textbeschreibung als auch ein Beispielvideo eingeben - wir würden Einbettungen für beide generieren und eine gewichtete Suche in Milvus durchführen. Das würde uns sehr präzise Ergebnisse liefern.

Eine weitere großartige Ergänzung wäre die zeitliche Suche innerhalb von Videos. Wir könnten lange Videos in kleinere Segmente unterteilen, jedes mit seiner eigenen Einbettung. Auf diese Weise könnten die Nutzer bestimmte Momente in Videos finden, nicht nur ganze Clips. Und warum sollte man nicht auch eine grundlegende Videoanalyse einbauen? Wir könnten die Einbettungen verwenden, um ähnliche Videosegmente zu gruppieren, Trends zu erkennen oder sogar Ausreißer in großen Videosammlungen zu identifizieren.

Fehlerbehandlung und Protokollierung

Machen wir uns nichts vor, es kann immer etwas schief gehen, und wenn das der Fall ist, müssen wir darauf vorbereitet sein. Die Implementierung einer robusten Fehlerbehandlung ist entscheidend. Wir sollten unsere API-Aufrufe und Datenbankoperationen in Try-Except-Blöcke verpacken und den Benutzern informative Fehlermeldungen geben, wenn etwas fehlschlägt. Bei netzwerkbezogenen Problemen kann die Implementierung von Wiederholungsversuchen mit exponentiellem Backoff helfen, vorübergehende Störungen elegant zu behandeln.

Die Protokollierung ist unser bester Freund beim Debuggen und Überwachen. Wir sollten das Logging-Modul von Python verwenden, um wichtige Ereignisse, Fehler und Leistungsmetriken in unserer Anwendung zu verfolgen. Wir sollten verschiedene Protokollierungsebenen einrichten - DEBUG für die Entwicklung, INFO für den allgemeinen Betrieb und ERROR für kritische Probleme. Vergessen Sie nicht, die Protokollrotation zu implementieren, um die Dateigrößen zu verwalten. Mit einer ordnungsgemäßen Protokollierung können wir Probleme schnell erkennen und beheben und sicherstellen, dass unsere Videosuchanwendung auch bei einer Erweiterung reibungslos funktioniert.

Fazit

Herzlichen Glückwunsch! Sie haben nun eine leistungsstarke semantische Videosuchanwendung mithilfe der Embed-API von Twelve Labs und Milvus erstellt. Diese Integration ermöglicht es Ihnen, Videoinhalte mit beispielloser Genauigkeit und Effizienz zu verarbeiten, zu speichern und abzurufen. Durch die Nutzung von multimodalen Einbettungen haben Sie ein System geschaffen, das die Nuancen von Videodaten versteht und spannende Möglichkeiten für die Erkennung von Inhalten, Empfehlungssysteme und fortschrittliche Videoanalysen eröffnet.

Denken Sie bei der weiteren Entwicklung und Verfeinerung Ihrer Anwendung daran, dass die Kombination aus der fortschrittlichen Einbettungsgenerierung von Twelve Labs und der skalierbaren Vektorspeicherung von Milvus eine solide Grundlage für die Bewältigung noch komplexerer Herausforderungen beim Verstehen von Videos bietet. Wir möchten Sie ermutigen, mit den besprochenen fortschrittlichen Funktionen zu experimentieren und die Grenzen dessen, was bei der Videosuche und -analyse möglich ist, zu erweitern.