パートナーシップ

TwelveLabsとApertureDBによるセマンティックビデオ検索エンジン

ジェームズ・リー

開発者は、Twelve LabsのEmbed APIとApertureDBを統合し、Marengo 2.6を用いてマルチモーダルなビデオ埋め込み(embeddings)を生成し、それをApertureDBのグラフ・ベクトル・データベースに保存することで、セマンティックなビデオ検索エンジンを構築できます。そして、自然言語を使用してクエリを実行することで、一致するビデオクリップを正確なタイムスタンプとともに取得することができます。

開発者は、Twelve LabsのEmbed APIとApertureDBを統合し、Marengo 2.6を用いてマルチモーダルなビデオ埋め込み(embeddings)を生成し、それをApertureDBのグラフ・ベクトル・データベースに保存することで、セマンティックなビデオ検索エンジンを構築できます。そして、自然言語を使用してクエリを実行することで、一致するビデオクリップを正確なタイムスタンプとともに取得することができます。

この記事の内容

No headings found on page

ニュースレターに登録する

ニュースレターに登録する

ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします

ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします

AIを活用してビデオを検索、分析、探索します。

2024/10/11

10分

記事へのリンクをコピー

このチュートリアルでは、TwelveLabsのEmbed APIとApertureDBの強力な統合を駆使して、高度なセマンティックビデオ検索エンジンを構築する方法を紹介します。最先端の動画基盤モデル「Marengo-2.6」を搭載したTwelve LabsのEmbed APIは、視覚表現、発話内容、文脈情報など、ビデオコンテンツの本質を捉えたマルチモーダル埋め込みを生成します。これらの埋め込みを、コンピュータビジョンや機械学習アプリケーション向けに最適化されたグラフ・ベクトルデータベースであるApertureDBと組み合わせることで、極めて正確で効率的なセマンティック検索機能が実現します。

このワークフローに従うことで、開発者やデータサイエンティストは、TwelveLabs Embed APIを活用してリッチなビデオ埋め込みを作成し、それらをソースビデオとともにApertureDBへシームレスに統合してセマンティック検索を行う方法を学ぶことができます。本ワークフローは、高度なビデオ分析・検索システム構築の可能性を示し、様々な業界におけるコンテンツ発見、レコメンデーションエンジン、およびビデオベースのアプリケーションに新たな可能性を切り拓きます。

セットアップとインストール

このセクションでは、TwelveLabs Embed APIとApertureDBを統合するために必要なライブラリと依存関係をインストールします。これには、APIコールを行うためのrequestsライブラリ、ApertureDBサービスと対話するためのaperturedb Python SDK、そしてTwelveLabs Embed APIにアクセスするためのtwelvelabs Python SDKのインストールが含まれます。

# Install necessary libraries and dependencies
!pip install requests
!pip install aperturedb
!pip install twelvelabs

# Import required modules
import requests
import aperturedb
import twelvelabs

上記のコードを実行すると、必要なライブラリがすべてインストールされ、ノートブックの以降のステップで使用できるようになります。

APIキーの設定

このセクションでは、TwelveLabsとApertureDBの両方に必要なAPIキーを設定します。これらのキーを安全に保存および取得するために、Google Colabのuserdata(シークレット)機能を使用します。

from google.colab import userdata

# Configure Twelve Labs
TL_API_KEY = userdata.get('TL_API_KEY')

# Configure ApertureDB
ADB_PASSWORD = userdata.get('ADB_PASSWORD')

# Verify that the keys are properly set
if not TL_API_KEY:
    raise ValueError("Twelve Labs API key not found. Please set it in Colab's Secrets.")
if not ADB_PASSWORD:
    raise ValueError("ApertureDB password not found. Please set it in Colab's Secrets.")

print("API keys successfully configured.")



このコードを使用するには、Google Colabの「シークレット(Secrets)」でAPIキーを設定する必要があります。

  1. Colabノートブックの左側にあるサイドバーに移動します。

  2. 「鍵」のアイコンをクリックして「シークレット(Secrets)」パネルを開きます。

  3. 次の2つのシークレットを追加します。

    • キー:TL_API_KEY、値:各自のTwelveLabs APIキー

    • キー:ADB_PASSWORD、値:各自のApertureDBパスワード

このアプローチにより、APIキーがノートブック内に公開されることなく安全に保管されます。コードはキーが正しく設定されているか確認し、不足している場合はエラーを発生させるため、設定に関するトラブルシューティングが容易になります。

TwelveLabs Embed APIによるビデオ埋め込みの生成

このセクションでは、TwelveLabs Embed APIを使用してビデオ埋め込みを生成する方法を実演します。このAPIは、あらゆるリトリーバルタスク(any-to-any retrieval)向けに設計されたTwelve Labsの最先端のビデオ基礎モデルであるMarengo-2.6をベースにしています。Marengo-2.6を使用すると、視覚表現、ジェスチャーや身体言語、話し言葉、そして全体的なコンテキストを含むビデオコンテンツのエッセンスをキャプチャするマルチモーダル埋め込みを作成できます。

それでは、TwelveLabsクライアントをセットアップし、埋め込みを生成する関数を定義してみましょう。

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

# Initialize the Twelve Labs client
twelvelabs_client = TwelveLabs(api_key=TL_API_KEY)

def generate_embedding(video_url):
    # 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

# Example usage
video_url = "https://storage.googleapis.com/ad-demos-datasets/videos/Ecommerce%20v2.5.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()

このコードは、TwelveLabs Embed APIを使用してビデオの埋め込みを生成するプロセスを示しています。以下はその仕組みの内訳です。

  1. APIキーを使用してTwelveLabsクライアントを初期化します。

  2. generate_embedding関数は、ビデオの理解と検索のタスクに最適化されたMarengo-2.6エンジンを使用して埋め込みタスクを作成します。

  3. タスクの進行状況を監視し、完了するまで待機します。

  4. タスクが完了したら、結果を取得して埋め込みを抽出します。

  5. 埋め込み情報は、対応する時間範囲やスコープなどのメタデータとともに返されます。

Embed APIが使用するMarengo-2.6モデルには、主に以下の利点があります。

  • マルチモーダルな理解:ビデオ内の視覚、音声、およびテキスト要素の相互作用を捉えます。

  • 時間的認知(Temporal awareness):静止画モデルとは異なり、Marengo-2.6はビデオ内の動き、アクション、時系列の情報を考慮します。

  • 柔軟なセグメンテーション:このAPIは、ビデオの異なるセグメントごとに埋め込みを生成することも、ビデオ全体に対して単一の埋め込みを生成することもできます。

  • 最先端のパフォーマンス:従来のアプローチと比較して、ビデオコンテンツのより正確で時間的に一貫した解釈を提供します。

このAPIを使用することで、開発者はビデオの文脈的なベクトル表現を簡単に作成でき、アプリケーションで高度な検索および分析機能を有効にすることができます。

ApertureDBへの埋め込みの挿入

ApertureDBを使用すると、ビデオ、クリップ、およびそれらに関連付けられた埋め込みを含むマルチモーダルデータを保存および管理できます。このセクションでは、TwelveLabs Embed APIによって生成されたビデオ埋め込みをApertureDBに挿入する方法を説明します。このステップは、効率的なセマンティックビデオ検索を可能にするために非常に重要です。

from typing import List
from aperturedb.DataModels import VideoDataModel, ClipDataModel, DescriptorDataModel, DescriptorSetDataModel
from aperturedb.CommonLibrary import create_connector, execute_query
from aperturedb.Query import generate_add_query
from aperturedb.Query import RangeType
from aperturedb.Connector import Connector
import json

# Define data models for the association of Video, Video Clips, and Embeddings
class ClipEmbeddingModel(ClipDataModel):
    embedding: DescriptorDataModel

class VideoClipsModel(VideoDataModel):
    title: str
    description: str
    clips: List[ClipEmbeddingModel] = []

def create_video_object_with_clips(URL: str, clips, collection):
    video = VideoClipsModel(url=URL, title="Ecommerce v2.5",
                            description="Ecommerce v2.5 video with clips by Marengo26")
    for clip in clips:
        video.clips.append(ClipEmbeddingModel(
            range_type=RangeType.TIME,
            start=clip['start_offset_sec'],
            stop=clip['end_offset_sec'],
            embedding=DescriptorDataModel(
                vector=clip['embedding'], set=collection)
        ))
    return video

video_url = "https://storage.googleapis.com/ad-demos-datasets/videos/Ecommerce%20v2.5.mp4"
clips = embeddings

# Instantiate an ApertureDB client
aperturedb_client = Connector(
    host="workshop.datasets.gcp.cloud.aperturedata.io",
    user="admin",
    password=ADB_PASSWORD
)

# Create a descriptor set (collection)
collection = DescriptorSetDataModel(
    name="marengo26", dimensions=len(clips[0]['embedding']))
q, blobs, c = generate_add_query(collection)
result, response, blobs = execute_query(query=q, blobs=blobs, client=aperturedb_client)
print(f"Descriptor set creation: {result=}, {response=}")

# Create and insert the video object with clips and embeddings
video = create_video_object_with_clips(video_url, clips, collection)
q, blobs, c = generate_add_query(video)
result, response, blobs = execute_query(query=q, blobs=blobs, client=aperturedb_client)
print(f"Video insertion: {result=}, {response=}")

このコードは、ビデオ埋め込みをApertureDBに挿入するプロセスを示しています。

  1. ビデオデータ、クリップ、およびそれらに関連付けられた埋め込みの構造を表現するために、カスタムデータモデル(ClipEmbeddingModelおよびVideoClipsModel)を定義します。

  2. create_video_object_with_clips関数は、関連するクリップと埋め込みを含むビデオオブジェクトを作成します。これは、以下の図に示すように、ApertureDB内で接続されたグラフスキーマとして表現されます。

  3. 指定された認証情報を使用して、ApertureDBクライアントをインスタンス化します。

  4. 埋め込みを保存するためのデスクリプタセット(コレクション)が作成されます。このセットが埋め込みの検索スペースを定義します。

  5. 最後に、すべてのクリップと対応する埋め込みを含むビデオオブジェクトを作成し、ApertureDBに挿入します。



上記のようにデータを追加することによって作成されるスキーマ‍

このようにデータを構造化することで、ビデオ内における各埋め込みの時系列情報を維持し、より正確なセマンティック検索機能を実現できます。各クリップは特定の時間範囲と埋め込みに関連付けられているため、ビデオセグメントのきめ細かな検索と取得が可能になります。‍

セマンティックビデオ検索の実行

このセクションでは、ApertureDBに保存されている埋め込みを使用してセマンティックビデオ検索を実行する方法を説明します。テキストクエリを使用して、セマンティックな類似性に基づいて関連するビデオクリップを検索します。

import struct
from aperturedb.Descriptors import Descriptors
from aperturedb.Query import ObjectType
from aperturedb.NotebookHelpers import display_video_mp4
from IPython.display import display

# Generate a text embedding for our search query
text_embedding = twelvelabs_client.embed.create(
  engine_name="Marengo-retrieval-2.6",
  text="Show me the part which has lot of outfits being displayed",
  text_truncate="none"
)

print("Created a text embedding")
print(f" Engine: {text_embedding.engine_name}")
print(f" Embedding: {text_embedding.text_embedding.float[:5]}...")  # Display first 5 values

# Define the descriptor set we'll search in
descriptorset = "marengo26"

# Find similar descriptors to the text embedding
descriptors = Descriptors(aperturedb_client)
descriptors.find_similar(
  descriptorset,
  text_embedding.text_embedding.float,
  k_neighbors=3,
  distances=True
)

# Find connected clips to the descriptors
clip_descriptors = descriptors.get_connected_entities(ObjectType.CLIP)

print(f"Found {len(clip_descriptors)} relevant clips")

このコードは以下の手順を実行します。

  1. Twelve Labs Embed API を使用して、検索クエリのテキスト埋め込みを生成します。

  2. ApertureDBのDescriptorsクラスを使用して、「marengo26」記述子セットの中から類似する埋め込みを検索します。

  3. 最も類似した埋め込みに関連付けられているビデオクリップを取得します。

結果を表示する

次に、検索結果を表示し、クリップのメタデータと対応するビデオセグメントを表示します。

# Show the metadata of the clips and the corresponding video segments
for i, clips in enumerate(clip_descriptors, 1):
    print(f"\nResult {i}:")
    for clip in clips:
        print(f"Clip metadata:")
        print(f"  Start time: {clip.start} seconds")
        print(f"  End time: {clip.stop} seconds")
        print(f"  Video URL: {clip.url}")
        
        # Display the video clip
        print("Displaying video clip:")
        display_video_mp4(clips.get_blob(clip))
        print("\n" + "-"*50 + "\n")

このコードは以下を行います。

  1. 見つかったクリップをループ処理で順に確認します。

  2. 開始時間、終了時間、およびビデオURLを含む各クリップのメタデータを表示します。

  3. display_video_mp4関数を使用して、各クリップに対応する実際のビデオセグメントを表示します。

まとめ

このチュートリアルでは、TwelveLabsのEmbed APIとApertureDBを統合し、高度なセマンティックビデオ検索を実現する強力な方法を実演しました。TwelveLabsの最先端のビデオ基礎モデル「Marengo-2.6」を活用することで、ビデオコンテンツの本質を捉えたリッチなマルチモーダル埋め込みを生成する方法を示しました。これらの埋め込みをApertureDBの効率的なマルチモーダルデータストレージおよびベクトル検索機能と組み合わせることで、極めて正確でコンテキストを考慮したビデオ検索機能が可能になります。

ここで紹介したワークフローは、コンテンツの発見、レコメンデーションエンジン、そして様々な業界におけるビデオベースのアプリケーションに新たな可能性をもたらします。ビデオのセマンティックな内容を理解することで、開発者は単純なキーワードマッチングを超えた、より直感的で強力な検索体験を構築できます。

次のステップ

このセマンティックビデオ検索システムをさらに強化するために、以下の方法を検討してみてください。

  1. 埋め込み生成の最適化:きめ細かさ(グラニュラリティ)とパフォーマンスのバランスを取るために、さまざまなビデオセグメンテーション戦略を試してみる。

  2. 検索機能の強化:テキスト、画像、音声の入力を組み合わせたマルチモーダルクエリなど、より高度なクエリ手法を実装する。TwelveLabs Embed APIは、間もなく画像および音声埋め込みの生成をサポートする予定です。ApertureDBは、すでに画像やマルチモーダル埋め込みの表現に対応しています。

  3. システムのスケールアップ:より大規模なビデオデータセットでパフォーマンスをテストし、大量のクエリに対して最適化する。

  4. ユーザーフィードバックの実装:時間の経過とともに検索結果を洗練させるために、ユーザーのインタラクション(対話)を取り入れる。

  5. 追加のユースケースの探索:コンテンツモデレーション、ビデオの要約、パーソナライズされたレコメンデーションなど、特定のアプリケーション向けにこのワークフローを適応させる。

この基盤をベースに構築を進めることで、開発者はビデオ理解と検索テクノロジーの限界を押し広げるような、洗練されたビデオ分析・検索システムを作成できます。

付録

参照および今後の探索のために、以下をご活用ください。

  1. 完全なColabノートブック

  2. TwelveLabs API ドキュメント

  3. ApertureDB ドキュメント

あなたがどのようなものを構築されるか、楽しみにしています!ご自身のプロジェクトや体験を、ぜひTwelveLabsおよびApertureDBコミュニティで共有してください。ハッピー・コーディング!

このチュートリアルでは、TwelveLabsのEmbed APIとApertureDBの強力な統合を駆使して、高度なセマンティックビデオ検索エンジンを構築する方法を紹介します。最先端の動画基盤モデル「Marengo-2.6」を搭載したTwelve LabsのEmbed APIは、視覚表現、発話内容、文脈情報など、ビデオコンテンツの本質を捉えたマルチモーダル埋め込みを生成します。これらの埋め込みを、コンピュータビジョンや機械学習アプリケーション向けに最適化されたグラフ・ベクトルデータベースであるApertureDBと組み合わせることで、極めて正確で効率的なセマンティック検索機能が実現します。

このワークフローに従うことで、開発者やデータサイエンティストは、TwelveLabs Embed APIを活用してリッチなビデオ埋め込みを作成し、それらをソースビデオとともにApertureDBへシームレスに統合してセマンティック検索を行う方法を学ぶことができます。本ワークフローは、高度なビデオ分析・検索システム構築の可能性を示し、様々な業界におけるコンテンツ発見、レコメンデーションエンジン、およびビデオベースのアプリケーションに新たな可能性を切り拓きます。

セットアップとインストール

このセクションでは、TwelveLabs Embed APIとApertureDBを統合するために必要なライブラリと依存関係をインストールします。これには、APIコールを行うためのrequestsライブラリ、ApertureDBサービスと対話するためのaperturedb Python SDK、そしてTwelveLabs Embed APIにアクセスするためのtwelvelabs Python SDKのインストールが含まれます。

# Install necessary libraries and dependencies
!pip install requests
!pip install aperturedb
!pip install twelvelabs

# Import required modules
import requests
import aperturedb
import twelvelabs

上記のコードを実行すると、必要なライブラリがすべてインストールされ、ノートブックの以降のステップで使用できるようになります。

APIキーの設定

このセクションでは、TwelveLabsとApertureDBの両方に必要なAPIキーを設定します。これらのキーを安全に保存および取得するために、Google Colabのuserdata(シークレット)機能を使用します。

from google.colab import userdata

# Configure Twelve Labs
TL_API_KEY = userdata.get('TL_API_KEY')

# Configure ApertureDB
ADB_PASSWORD = userdata.get('ADB_PASSWORD')

# Verify that the keys are properly set
if not TL_API_KEY:
    raise ValueError("Twelve Labs API key not found. Please set it in Colab's Secrets.")
if not ADB_PASSWORD:
    raise ValueError("ApertureDB password not found. Please set it in Colab's Secrets.")

print("API keys successfully configured.")



このコードを使用するには、Google Colabの「シークレット(Secrets)」でAPIキーを設定する必要があります。

  1. Colabノートブックの左側にあるサイドバーに移動します。

  2. 「鍵」のアイコンをクリックして「シークレット(Secrets)」パネルを開きます。

  3. 次の2つのシークレットを追加します。

    • キー:TL_API_KEY、値:各自のTwelveLabs APIキー

    • キー:ADB_PASSWORD、値:各自のApertureDBパスワード

このアプローチにより、APIキーがノートブック内に公開されることなく安全に保管されます。コードはキーが正しく設定されているか確認し、不足している場合はエラーを発生させるため、設定に関するトラブルシューティングが容易になります。

TwelveLabs Embed APIによるビデオ埋め込みの生成

このセクションでは、TwelveLabs Embed APIを使用してビデオ埋め込みを生成する方法を実演します。このAPIは、あらゆるリトリーバルタスク(any-to-any retrieval)向けに設計されたTwelve Labsの最先端のビデオ基礎モデルであるMarengo-2.6をベースにしています。Marengo-2.6を使用すると、視覚表現、ジェスチャーや身体言語、話し言葉、そして全体的なコンテキストを含むビデオコンテンツのエッセンスをキャプチャするマルチモーダル埋め込みを作成できます。

それでは、TwelveLabsクライアントをセットアップし、埋め込みを生成する関数を定義してみましょう。

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

# Initialize the Twelve Labs client
twelvelabs_client = TwelveLabs(api_key=TL_API_KEY)

def generate_embedding(video_url):
    # 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

# Example usage
video_url = "https://storage.googleapis.com/ad-demos-datasets/videos/Ecommerce%20v2.5.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()

このコードは、TwelveLabs Embed APIを使用してビデオの埋め込みを生成するプロセスを示しています。以下はその仕組みの内訳です。

  1. APIキーを使用してTwelveLabsクライアントを初期化します。

  2. generate_embedding関数は、ビデオの理解と検索のタスクに最適化されたMarengo-2.6エンジンを使用して埋め込みタスクを作成します。

  3. タスクの進行状況を監視し、完了するまで待機します。

  4. タスクが完了したら、結果を取得して埋め込みを抽出します。

  5. 埋め込み情報は、対応する時間範囲やスコープなどのメタデータとともに返されます。

Embed APIが使用するMarengo-2.6モデルには、主に以下の利点があります。

  • マルチモーダルな理解:ビデオ内の視覚、音声、およびテキスト要素の相互作用を捉えます。

  • 時間的認知(Temporal awareness):静止画モデルとは異なり、Marengo-2.6はビデオ内の動き、アクション、時系列の情報を考慮します。

  • 柔軟なセグメンテーション:このAPIは、ビデオの異なるセグメントごとに埋め込みを生成することも、ビデオ全体に対して単一の埋め込みを生成することもできます。

  • 最先端のパフォーマンス:従来のアプローチと比較して、ビデオコンテンツのより正確で時間的に一貫した解釈を提供します。

このAPIを使用することで、開発者はビデオの文脈的なベクトル表現を簡単に作成でき、アプリケーションで高度な検索および分析機能を有効にすることができます。

ApertureDBへの埋め込みの挿入

ApertureDBを使用すると、ビデオ、クリップ、およびそれらに関連付けられた埋め込みを含むマルチモーダルデータを保存および管理できます。このセクションでは、TwelveLabs Embed APIによって生成されたビデオ埋め込みをApertureDBに挿入する方法を説明します。このステップは、効率的なセマンティックビデオ検索を可能にするために非常に重要です。

from typing import List
from aperturedb.DataModels import VideoDataModel, ClipDataModel, DescriptorDataModel, DescriptorSetDataModel
from aperturedb.CommonLibrary import create_connector, execute_query
from aperturedb.Query import generate_add_query
from aperturedb.Query import RangeType
from aperturedb.Connector import Connector
import json

# Define data models for the association of Video, Video Clips, and Embeddings
class ClipEmbeddingModel(ClipDataModel):
    embedding: DescriptorDataModel

class VideoClipsModel(VideoDataModel):
    title: str
    description: str
    clips: List[ClipEmbeddingModel] = []

def create_video_object_with_clips(URL: str, clips, collection):
    video = VideoClipsModel(url=URL, title="Ecommerce v2.5",
                            description="Ecommerce v2.5 video with clips by Marengo26")
    for clip in clips:
        video.clips.append(ClipEmbeddingModel(
            range_type=RangeType.TIME,
            start=clip['start_offset_sec'],
            stop=clip['end_offset_sec'],
            embedding=DescriptorDataModel(
                vector=clip['embedding'], set=collection)
        ))
    return video

video_url = "https://storage.googleapis.com/ad-demos-datasets/videos/Ecommerce%20v2.5.mp4"
clips = embeddings

# Instantiate an ApertureDB client
aperturedb_client = Connector(
    host="workshop.datasets.gcp.cloud.aperturedata.io",
    user="admin",
    password=ADB_PASSWORD
)

# Create a descriptor set (collection)
collection = DescriptorSetDataModel(
    name="marengo26", dimensions=len(clips[0]['embedding']))
q, blobs, c = generate_add_query(collection)
result, response, blobs = execute_query(query=q, blobs=blobs, client=aperturedb_client)
print(f"Descriptor set creation: {result=}, {response=}")

# Create and insert the video object with clips and embeddings
video = create_video_object_with_clips(video_url, clips, collection)
q, blobs, c = generate_add_query(video)
result, response, blobs = execute_query(query=q, blobs=blobs, client=aperturedb_client)
print(f"Video insertion: {result=}, {response=}")

このコードは、ビデオ埋め込みをApertureDBに挿入するプロセスを示しています。

  1. ビデオデータ、クリップ、およびそれらに関連付けられた埋め込みの構造を表現するために、カスタムデータモデル(ClipEmbeddingModelおよびVideoClipsModel)を定義します。

  2. create_video_object_with_clips関数は、関連するクリップと埋め込みを含むビデオオブジェクトを作成します。これは、以下の図に示すように、ApertureDB内で接続されたグラフスキーマとして表現されます。

  3. 指定された認証情報を使用して、ApertureDBクライアントをインスタンス化します。

  4. 埋め込みを保存するためのデスクリプタセット(コレクション)が作成されます。このセットが埋め込みの検索スペースを定義します。

  5. 最後に、すべてのクリップと対応する埋め込みを含むビデオオブジェクトを作成し、ApertureDBに挿入します。



上記のようにデータを追加することによって作成されるスキーマ‍

このようにデータを構造化することで、ビデオ内における各埋め込みの時系列情報を維持し、より正確なセマンティック検索機能を実現できます。各クリップは特定の時間範囲と埋め込みに関連付けられているため、ビデオセグメントのきめ細かな検索と取得が可能になります。‍

セマンティックビデオ検索の実行

このセクションでは、ApertureDBに保存されている埋め込みを使用してセマンティックビデオ検索を実行する方法を説明します。テキストクエリを使用して、セマンティックな類似性に基づいて関連するビデオクリップを検索します。

import struct
from aperturedb.Descriptors import Descriptors
from aperturedb.Query import ObjectType
from aperturedb.NotebookHelpers import display_video_mp4
from IPython.display import display

# Generate a text embedding for our search query
text_embedding = twelvelabs_client.embed.create(
  engine_name="Marengo-retrieval-2.6",
  text="Show me the part which has lot of outfits being displayed",
  text_truncate="none"
)

print("Created a text embedding")
print(f" Engine: {text_embedding.engine_name}")
print(f" Embedding: {text_embedding.text_embedding.float[:5]}...")  # Display first 5 values

# Define the descriptor set we'll search in
descriptorset = "marengo26"

# Find similar descriptors to the text embedding
descriptors = Descriptors(aperturedb_client)
descriptors.find_similar(
  descriptorset,
  text_embedding.text_embedding.float,
  k_neighbors=3,
  distances=True
)

# Find connected clips to the descriptors
clip_descriptors = descriptors.get_connected_entities(ObjectType.CLIP)

print(f"Found {len(clip_descriptors)} relevant clips")

このコードは以下の手順を実行します。

  1. Twelve Labs Embed API を使用して、検索クエリのテキスト埋め込みを生成します。

  2. ApertureDBのDescriptorsクラスを使用して、「marengo26」記述子セットの中から類似する埋め込みを検索します。

  3. 最も類似した埋め込みに関連付けられているビデオクリップを取得します。

結果を表示する

次に、検索結果を表示し、クリップのメタデータと対応するビデオセグメントを表示します。

# Show the metadata of the clips and the corresponding video segments
for i, clips in enumerate(clip_descriptors, 1):
    print(f"\nResult {i}:")
    for clip in clips:
        print(f"Clip metadata:")
        print(f"  Start time: {clip.start} seconds")
        print(f"  End time: {clip.stop} seconds")
        print(f"  Video URL: {clip.url}")
        
        # Display the video clip
        print("Displaying video clip:")
        display_video_mp4(clips.get_blob(clip))
        print("\n" + "-"*50 + "\n")

このコードは以下を行います。

  1. 見つかったクリップをループ処理で順に確認します。

  2. 開始時間、終了時間、およびビデオURLを含む各クリップのメタデータを表示します。

  3. display_video_mp4関数を使用して、各クリップに対応する実際のビデオセグメントを表示します。

まとめ

このチュートリアルでは、TwelveLabsのEmbed APIとApertureDBを統合し、高度なセマンティックビデオ検索を実現する強力な方法を実演しました。TwelveLabsの最先端のビデオ基礎モデル「Marengo-2.6」を活用することで、ビデオコンテンツの本質を捉えたリッチなマルチモーダル埋め込みを生成する方法を示しました。これらの埋め込みをApertureDBの効率的なマルチモーダルデータストレージおよびベクトル検索機能と組み合わせることで、極めて正確でコンテキストを考慮したビデオ検索機能が可能になります。

ここで紹介したワークフローは、コンテンツの発見、レコメンデーションエンジン、そして様々な業界におけるビデオベースのアプリケーションに新たな可能性をもたらします。ビデオのセマンティックな内容を理解することで、開発者は単純なキーワードマッチングを超えた、より直感的で強力な検索体験を構築できます。

次のステップ

このセマンティックビデオ検索システムをさらに強化するために、以下の方法を検討してみてください。

  1. 埋め込み生成の最適化:きめ細かさ(グラニュラリティ)とパフォーマンスのバランスを取るために、さまざまなビデオセグメンテーション戦略を試してみる。

  2. 検索機能の強化:テキスト、画像、音声の入力を組み合わせたマルチモーダルクエリなど、より高度なクエリ手法を実装する。TwelveLabs Embed APIは、間もなく画像および音声埋め込みの生成をサポートする予定です。ApertureDBは、すでに画像やマルチモーダル埋め込みの表現に対応しています。

  3. システムのスケールアップ:より大規模なビデオデータセットでパフォーマンスをテストし、大量のクエリに対して最適化する。

  4. ユーザーフィードバックの実装:時間の経過とともに検索結果を洗練させるために、ユーザーのインタラクション(対話)を取り入れる。

  5. 追加のユースケースの探索:コンテンツモデレーション、ビデオの要約、パーソナライズされたレコメンデーションなど、特定のアプリケーション向けにこのワークフローを適応させる。

この基盤をベースに構築を進めることで、開発者はビデオ理解と検索テクノロジーの限界を押し広げるような、洗練されたビデオ分析・検索システムを作成できます。

付録

参照および今後の探索のために、以下をご活用ください。

  1. 完全なColabノートブック

  2. TwelveLabs API ドキュメント

  3. ApertureDB ドキュメント

あなたがどのようなものを構築されるか、楽しみにしています!ご自身のプロジェクトや体験を、ぜひTwelveLabsおよびApertureDBコミュニティで共有してください。ハッピー・コーディング!

このチュートリアルでは、TwelveLabsのEmbed APIとApertureDBの強力な統合を駆使して、高度なセマンティックビデオ検索エンジンを構築する方法を紹介します。最先端の動画基盤モデル「Marengo-2.6」を搭載したTwelve LabsのEmbed APIは、視覚表現、発話内容、文脈情報など、ビデオコンテンツの本質を捉えたマルチモーダル埋め込みを生成します。これらの埋め込みを、コンピュータビジョンや機械学習アプリケーション向けに最適化されたグラフ・ベクトルデータベースであるApertureDBと組み合わせることで、極めて正確で効率的なセマンティック検索機能が実現します。

このワークフローに従うことで、開発者やデータサイエンティストは、TwelveLabs Embed APIを活用してリッチなビデオ埋め込みを作成し、それらをソースビデオとともにApertureDBへシームレスに統合してセマンティック検索を行う方法を学ぶことができます。本ワークフローは、高度なビデオ分析・検索システム構築の可能性を示し、様々な業界におけるコンテンツ発見、レコメンデーションエンジン、およびビデオベースのアプリケーションに新たな可能性を切り拓きます。

セットアップとインストール

このセクションでは、TwelveLabs Embed APIとApertureDBを統合するために必要なライブラリと依存関係をインストールします。これには、APIコールを行うためのrequestsライブラリ、ApertureDBサービスと対話するためのaperturedb Python SDK、そしてTwelveLabs Embed APIにアクセスするためのtwelvelabs Python SDKのインストールが含まれます。

# Install necessary libraries and dependencies
!pip install requests
!pip install aperturedb
!pip install twelvelabs

# Import required modules
import requests
import aperturedb
import twelvelabs

上記のコードを実行すると、必要なライブラリがすべてインストールされ、ノートブックの以降のステップで使用できるようになります。

APIキーの設定

このセクションでは、TwelveLabsとApertureDBの両方に必要なAPIキーを設定します。これらのキーを安全に保存および取得するために、Google Colabのuserdata(シークレット)機能を使用します。

from google.colab import userdata

# Configure Twelve Labs
TL_API_KEY = userdata.get('TL_API_KEY')

# Configure ApertureDB
ADB_PASSWORD = userdata.get('ADB_PASSWORD')

# Verify that the keys are properly set
if not TL_API_KEY:
    raise ValueError("Twelve Labs API key not found. Please set it in Colab's Secrets.")
if not ADB_PASSWORD:
    raise ValueError("ApertureDB password not found. Please set it in Colab's Secrets.")

print("API keys successfully configured.")



このコードを使用するには、Google Colabの「シークレット(Secrets)」でAPIキーを設定する必要があります。

  1. Colabノートブックの左側にあるサイドバーに移動します。

  2. 「鍵」のアイコンをクリックして「シークレット(Secrets)」パネルを開きます。

  3. 次の2つのシークレットを追加します。

    • キー:TL_API_KEY、値:各自のTwelveLabs APIキー

    • キー:ADB_PASSWORD、値:各自のApertureDBパスワード

このアプローチにより、APIキーがノートブック内に公開されることなく安全に保管されます。コードはキーが正しく設定されているか確認し、不足している場合はエラーを発生させるため、設定に関するトラブルシューティングが容易になります。

TwelveLabs Embed APIによるビデオ埋め込みの生成

このセクションでは、TwelveLabs Embed APIを使用してビデオ埋め込みを生成する方法を実演します。このAPIは、あらゆるリトリーバルタスク(any-to-any retrieval)向けに設計されたTwelve Labsの最先端のビデオ基礎モデルであるMarengo-2.6をベースにしています。Marengo-2.6を使用すると、視覚表現、ジェスチャーや身体言語、話し言葉、そして全体的なコンテキストを含むビデオコンテンツのエッセンスをキャプチャするマルチモーダル埋め込みを作成できます。

それでは、TwelveLabsクライアントをセットアップし、埋め込みを生成する関数を定義してみましょう。

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

# Initialize the Twelve Labs client
twelvelabs_client = TwelveLabs(api_key=TL_API_KEY)

def generate_embedding(video_url):
    # 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

# Example usage
video_url = "https://storage.googleapis.com/ad-demos-datasets/videos/Ecommerce%20v2.5.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()

このコードは、TwelveLabs Embed APIを使用してビデオの埋め込みを生成するプロセスを示しています。以下はその仕組みの内訳です。

  1. APIキーを使用してTwelveLabsクライアントを初期化します。

  2. generate_embedding関数は、ビデオの理解と検索のタスクに最適化されたMarengo-2.6エンジンを使用して埋め込みタスクを作成します。

  3. タスクの進行状況を監視し、完了するまで待機します。

  4. タスクが完了したら、結果を取得して埋め込みを抽出します。

  5. 埋め込み情報は、対応する時間範囲やスコープなどのメタデータとともに返されます。

Embed APIが使用するMarengo-2.6モデルには、主に以下の利点があります。

  • マルチモーダルな理解:ビデオ内の視覚、音声、およびテキスト要素の相互作用を捉えます。

  • 時間的認知(Temporal awareness):静止画モデルとは異なり、Marengo-2.6はビデオ内の動き、アクション、時系列の情報を考慮します。

  • 柔軟なセグメンテーション:このAPIは、ビデオの異なるセグメントごとに埋め込みを生成することも、ビデオ全体に対して単一の埋め込みを生成することもできます。

  • 最先端のパフォーマンス:従来のアプローチと比較して、ビデオコンテンツのより正確で時間的に一貫した解釈を提供します。

このAPIを使用することで、開発者はビデオの文脈的なベクトル表現を簡単に作成でき、アプリケーションで高度な検索および分析機能を有効にすることができます。

ApertureDBへの埋め込みの挿入

ApertureDBを使用すると、ビデオ、クリップ、およびそれらに関連付けられた埋め込みを含むマルチモーダルデータを保存および管理できます。このセクションでは、TwelveLabs Embed APIによって生成されたビデオ埋め込みをApertureDBに挿入する方法を説明します。このステップは、効率的なセマンティックビデオ検索を可能にするために非常に重要です。

from typing import List
from aperturedb.DataModels import VideoDataModel, ClipDataModel, DescriptorDataModel, DescriptorSetDataModel
from aperturedb.CommonLibrary import create_connector, execute_query
from aperturedb.Query import generate_add_query
from aperturedb.Query import RangeType
from aperturedb.Connector import Connector
import json

# Define data models for the association of Video, Video Clips, and Embeddings
class ClipEmbeddingModel(ClipDataModel):
    embedding: DescriptorDataModel

class VideoClipsModel(VideoDataModel):
    title: str
    description: str
    clips: List[ClipEmbeddingModel] = []

def create_video_object_with_clips(URL: str, clips, collection):
    video = VideoClipsModel(url=URL, title="Ecommerce v2.5",
                            description="Ecommerce v2.5 video with clips by Marengo26")
    for clip in clips:
        video.clips.append(ClipEmbeddingModel(
            range_type=RangeType.TIME,
            start=clip['start_offset_sec'],
            stop=clip['end_offset_sec'],
            embedding=DescriptorDataModel(
                vector=clip['embedding'], set=collection)
        ))
    return video

video_url = "https://storage.googleapis.com/ad-demos-datasets/videos/Ecommerce%20v2.5.mp4"
clips = embeddings

# Instantiate an ApertureDB client
aperturedb_client = Connector(
    host="workshop.datasets.gcp.cloud.aperturedata.io",
    user="admin",
    password=ADB_PASSWORD
)

# Create a descriptor set (collection)
collection = DescriptorSetDataModel(
    name="marengo26", dimensions=len(clips[0]['embedding']))
q, blobs, c = generate_add_query(collection)
result, response, blobs = execute_query(query=q, blobs=blobs, client=aperturedb_client)
print(f"Descriptor set creation: {result=}, {response=}")

# Create and insert the video object with clips and embeddings
video = create_video_object_with_clips(video_url, clips, collection)
q, blobs, c = generate_add_query(video)
result, response, blobs = execute_query(query=q, blobs=blobs, client=aperturedb_client)
print(f"Video insertion: {result=}, {response=}")

このコードは、ビデオ埋め込みをApertureDBに挿入するプロセスを示しています。

  1. ビデオデータ、クリップ、およびそれらに関連付けられた埋め込みの構造を表現するために、カスタムデータモデル(ClipEmbeddingModelおよびVideoClipsModel)を定義します。

  2. create_video_object_with_clips関数は、関連するクリップと埋め込みを含むビデオオブジェクトを作成します。これは、以下の図に示すように、ApertureDB内で接続されたグラフスキーマとして表現されます。

  3. 指定された認証情報を使用して、ApertureDBクライアントをインスタンス化します。

  4. 埋め込みを保存するためのデスクリプタセット(コレクション)が作成されます。このセットが埋め込みの検索スペースを定義します。

  5. 最後に、すべてのクリップと対応する埋め込みを含むビデオオブジェクトを作成し、ApertureDBに挿入します。



上記のようにデータを追加することによって作成されるスキーマ‍

このようにデータを構造化することで、ビデオ内における各埋め込みの時系列情報を維持し、より正確なセマンティック検索機能を実現できます。各クリップは特定の時間範囲と埋め込みに関連付けられているため、ビデオセグメントのきめ細かな検索と取得が可能になります。‍

セマンティックビデオ検索の実行

このセクションでは、ApertureDBに保存されている埋め込みを使用してセマンティックビデオ検索を実行する方法を説明します。テキストクエリを使用して、セマンティックな類似性に基づいて関連するビデオクリップを検索します。

import struct
from aperturedb.Descriptors import Descriptors
from aperturedb.Query import ObjectType
from aperturedb.NotebookHelpers import display_video_mp4
from IPython.display import display

# Generate a text embedding for our search query
text_embedding = twelvelabs_client.embed.create(
  engine_name="Marengo-retrieval-2.6",
  text="Show me the part which has lot of outfits being displayed",
  text_truncate="none"
)

print("Created a text embedding")
print(f" Engine: {text_embedding.engine_name}")
print(f" Embedding: {text_embedding.text_embedding.float[:5]}...")  # Display first 5 values

# Define the descriptor set we'll search in
descriptorset = "marengo26"

# Find similar descriptors to the text embedding
descriptors = Descriptors(aperturedb_client)
descriptors.find_similar(
  descriptorset,
  text_embedding.text_embedding.float,
  k_neighbors=3,
  distances=True
)

# Find connected clips to the descriptors
clip_descriptors = descriptors.get_connected_entities(ObjectType.CLIP)

print(f"Found {len(clip_descriptors)} relevant clips")

このコードは以下の手順を実行します。

  1. Twelve Labs Embed API を使用して、検索クエリのテキスト埋め込みを生成します。

  2. ApertureDBのDescriptorsクラスを使用して、「marengo26」記述子セットの中から類似する埋め込みを検索します。

  3. 最も類似した埋め込みに関連付けられているビデオクリップを取得します。

結果を表示する

次に、検索結果を表示し、クリップのメタデータと対応するビデオセグメントを表示します。

# Show the metadata of the clips and the corresponding video segments
for i, clips in enumerate(clip_descriptors, 1):
    print(f"\nResult {i}:")
    for clip in clips:
        print(f"Clip metadata:")
        print(f"  Start time: {clip.start} seconds")
        print(f"  End time: {clip.stop} seconds")
        print(f"  Video URL: {clip.url}")
        
        # Display the video clip
        print("Displaying video clip:")
        display_video_mp4(clips.get_blob(clip))
        print("\n" + "-"*50 + "\n")

このコードは以下を行います。

  1. 見つかったクリップをループ処理で順に確認します。

  2. 開始時間、終了時間、およびビデオURLを含む各クリップのメタデータを表示します。

  3. display_video_mp4関数を使用して、各クリップに対応する実際のビデオセグメントを表示します。

まとめ

このチュートリアルでは、TwelveLabsのEmbed APIとApertureDBを統合し、高度なセマンティックビデオ検索を実現する強力な方法を実演しました。TwelveLabsの最先端のビデオ基礎モデル「Marengo-2.6」を活用することで、ビデオコンテンツの本質を捉えたリッチなマルチモーダル埋め込みを生成する方法を示しました。これらの埋め込みをApertureDBの効率的なマルチモーダルデータストレージおよびベクトル検索機能と組み合わせることで、極めて正確でコンテキストを考慮したビデオ検索機能が可能になります。

ここで紹介したワークフローは、コンテンツの発見、レコメンデーションエンジン、そして様々な業界におけるビデオベースのアプリケーションに新たな可能性をもたらします。ビデオのセマンティックな内容を理解することで、開発者は単純なキーワードマッチングを超えた、より直感的で強力な検索体験を構築できます。

次のステップ

このセマンティックビデオ検索システムをさらに強化するために、以下の方法を検討してみてください。

  1. 埋め込み生成の最適化:きめ細かさ(グラニュラリティ)とパフォーマンスのバランスを取るために、さまざまなビデオセグメンテーション戦略を試してみる。

  2. 検索機能の強化:テキスト、画像、音声の入力を組み合わせたマルチモーダルクエリなど、より高度なクエリ手法を実装する。TwelveLabs Embed APIは、間もなく画像および音声埋め込みの生成をサポートする予定です。ApertureDBは、すでに画像やマルチモーダル埋め込みの表現に対応しています。

  3. システムのスケールアップ:より大規模なビデオデータセットでパフォーマンスをテストし、大量のクエリに対して最適化する。

  4. ユーザーフィードバックの実装:時間の経過とともに検索結果を洗練させるために、ユーザーのインタラクション(対話)を取り入れる。

  5. 追加のユースケースの探索:コンテンツモデレーション、ビデオの要約、パーソナライズされたレコメンデーションなど、特定のアプリケーション向けにこのワークフローを適応させる。

この基盤をベースに構築を進めることで、開発者はビデオ理解と検索テクノロジーの限界を押し広げるような、洗練されたビデオ分析・検索システムを作成できます。

付録

参照および今後の探索のために、以下をご活用ください。

  1. 完全なColabノートブック

  2. TwelveLabs API ドキュメント

  3. ApertureDB ドキュメント

あなたがどのようなものを構築されるか、楽しみにしています!ご自身のプロジェクトや体験を、ぜひTwelveLabsおよびApertureDBコミュニティで共有してください。ハッピー・コーディング!