파트너십

TwelveLabs와 ApertureDB를 활용한 시맨틱 비디오 검색 엔진

제임스 러

개발자는 Twelve Labs의 Embed API를 ApertureDB와 통합하여 시맨틱 비디오 검색 엔진을 구축할 수 있습니다. Marengo 2.6을 통해 멀티모달 비디오 임베딩을 생성하고 이를 ApertureDB의 그래프-벡터 데이터베이스에 저장한 뒤, 자연어로 쿼리하여 정확한 타임스탬프와 함께 일치하는 비디오 클립을 찾아낼 수 있습니다.

개발자는 Twelve Labs의 Embed API를 ApertureDB와 통합하여 시맨틱 비디오 검색 엔진을 구축할 수 있습니다. Marengo 2.6을 통해 멀티모달 비디오 임베딩을 생성하고 이를 ApertureDB의 그래프-벡터 데이터베이스에 저장한 뒤, 자연어로 쿼리하여 정확한 타임스탬프와 함께 일치하는 비디오 클립을 찾아낼 수 있습니다.

In this article

No headings found on page

뉴스레터 구독하기

뉴스레터 구독하기

영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.

영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.

AI로 영상을 검색하고, 분석하고, 탐색하세요.

2024. 10. 11.

10분

링크 복사하기

이 튜토리얼에서는 TwelveLabs의 Embed API와 ApertureDB의 강력한 통합을 활용하여 고급 의미론적(semantic) 비디오 검색 엔진을 빌드하는 방법을 설명합니다. 최첨단 비디오 파운데이션 모델인 Marengo-2.6 기반의 Twelve Labs Embed API는 시각적 표현, 음성, 문맥 정보를 포함한 비디오 콘텐츠의 본질을 포착하는 다중모드 임베딩(multimodal embeddings)을 생성합니다. 이러한 임베딩을 컴퓨터 비전 및 머신러닝 애플리케이션에 최적화된 그래프-벡터 데이터베이스인 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의 ‘Secret(비밀)’에 API 키를 설정해야 합니다.

  1. Colab 노트북의 왼쪽 사이드바 메뉴로 이동합니다.

  2. 열쇠 모양 아이콘을 클릭하여 "Secrets" 패널을 엽니다.

  3. 다음 두 가지의 비밀값을 추가합니다.

    • Key: TL_API_KEY, Value: 사용자의 TwelveLabs API 키

    • Key: ADB_PASSWORD, Value: 사용자의 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 엔진을 사용하여 임베딩 작업(task)을 만듭니다.

  3. 작업 진행 상황을 모니터링하며 프로세스가 완료될 때까지 대기합니다.

  4. 작업이 완료되면 결과를 검색하고 임베딩을 추출합니다.

  5. 추출된 임베딩은 해당 시간 범위 및 분석 범위(scope) 등의 메타데이터와 함께 반환됩니다.

Embed API에서 사용하는 Marengo-2.6 모델은 다음과 같은 강력한 장점을 제공합니다.

  • 다중모드(Multimodal) 이해: 비디오 생태계의 시각, 오디오 및 텍스트 요소 간의 상호작용을 그대로 포착합니다.

  • 시간의 흐름 파악(Temporal awareness): 정적인 이미지 모델과 달리 Marengo-2.6은 비디오 내의 움직임, 액션, 시간 경과에 따른 정보를 정밀하게 추적합니다.

  • 유연한 세그멘테이션: 비디오의 특정 구간별로 각각 임베딩을 생성하거나, 비디오 전체를 아우르는 단일 임베딩을 커스텀하게 생성할 수 있습니다.

  • 업계 최고의 성능: 전통적인 비디오 모델에 비해 비디오 콘텐츠를 시간에 맞춰 훨씬 정밀하고 일관되게 해석해 냅니다.

이 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. 커스텀 데이터 모델(ClipEmbeddingModelVideoClipsModel)을 명확하게 정의하여 클립 및 연관 데이터가 포함된 비디오 데이터의 전체 구조를 스키마 형식으로 구조화합니다.

  2. create_video_object_with_clips 함수는 클립과 해당 임베딩이 포함된 비디오 인스턴스를 동적으로 찍어냅니다. 이는 파일 아래 그림과 같이 ApertureDB 내에서 유기적으로 연결된 그래프 네트워크 구조(connected graph schema)로 변환됩니다.

  3. 사전에 전달된 인증 자격 정보를 통해 ApertureDB 클라이언트를 활성화합니다.

  4. 업로드할 임베딩을 수용할 디스크립터 세트(컬렉션)를 프로비저닝합니다. 이 세트가 임베딩 검색 대상의 메인 인덱스 역할을 수행하게 됩니다.

  5. 마지막 단계로 모든 클립 세그먼트와 맵핑된 임베딩 정보가 통합된 완성형 비디오 객체를 생성한 후 ApertureDB 데이터베이스에 완전히 적재합니다.



위 방식에 따라 데이터 삽입 완료 시 구축되는 데이터 스키마 형태‍

비디오 데이터를 이처럼 정교하게 구성해 두면, 동영상 안의 개별 임베딩들이 지닌 시각적·시간적 전후 정보가 그대로 완벽하게 보존됩니다. 따라서 더 정확하며 세분화된 세만틱 검색 시스템을 구축할 수 있습니다. 각 클립은 고유한 시간대 데이터 및 임베딩 벡터와 다이렉트로 매칭되어 있어, 타겟 비디오 세그먼트를 마이크로 단위로 세밀하게 끄집어낼 수 있게 돕습니다.‍

우수한 성능의 세만틱 비디오 검색 수행하기

이번 장에서는 ApertureDB 서비스 내부의 임베딩 저장소를 무대로 삼아 실제 세만틱 비디오 검색(semantic video search)을 가볍게 수행해보고자 합니다. 자연어 기반의 텍스트 쿼리를 입력해 의미적 유사도가 아주 높은 대표 비디오 클립을 정교하게 발굴해 낼 것입니다.

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. TwelveLabs 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 플랫폼의 벡터 엔진 영역과 조우할 때, 그 어떤 고전적인 기술보다 의미적으로 일치하는 콘텐츠를 칼같이 정밀해진 실시간 검색 기술로 뽑아낼 수 있습니다.

오늘 설계해 본 이상적인 프로세스는 기업들의 다양한 영상 추천 코어 아키텍처 및 미디어 탐색 시스템의 지평을 활짝 열어줄 것입니다. 비디오 원천 콘텐츠의 속내 깊은 내용까지 AI 모델이 완벽하게 동기화하여 이해하게 함으로써 개발자들은 단순히 수작업된 태그 키워드 매칭이나 텍스트 검색에 머물렀던 구시대 방식을 너머, 유저가 원하는 신차원의 비디오 내비게이션 경험을 쉽고 매끄럽게 구축할 수 있을 것입니다.

다음 단계로 나아가기

이 고급형 세만틱 비디오 검색(semantic video search) 시스템의 아키텍처 완성도를 극대화화기 위해 아래와 같은 확장 개발 도전을 적극적으로 권장합니다.

  1. 임베딩 제너레이션 파인튜닝: 비디오의 클리핑 세그먼트를 쪼개는 다양한 방법론들을 비교 적용하여 데이터의 유실 없는 최적의 분석 프레임을 도출해 보세요.

  2. 쿼리 탐색 기능의 극대화: 단순한 문자 검색에서 한발 더 나아가 텍스트, 이미지, 서라운드 오디오 등을 복합 연동하는 멀티모달 패턴 쿼리 레이아웃을 도입해 보세요. TwelveLabs Embed API 제품군은 완벽한 이미지 세력 연계 및 오디오 임베딩(audio embedding) 지원 엔진 출시를 정조준하고 있습니다. 이에 발맞춰 ApertureDB 역시 이러한 통합 다중모드 벡터에 대한 유연한 맵핑 스토리지 구조를 완전하게 갖추고 있습니다.

  3. 프로덕션 크기의 대용량 아키텍처 빌딩: 실제 초대형 메가 바이트급 비디오 데이터셋을 로드하고 밀려드는 동시 사용자 트래픽 쿼리를 밀리 세컨드 단위로 정밀하게 쳐내는 성능 최적화를 감행해 보세요.

  4. 사용자 상호작용 피드백 반영: 최종 유저의 행동 반응 로그를 수집하여 추천 및 검색의 신뢰 정교함을 더욱 연마하는 선순환 루프를 빌드해 보세요.

  5. 무궁무진한 버티컬 비즈니스 모델로의 파생: 이번 지식을 디딤돌 삼아 스마트한 콘텐츠 모니터링 모더레이션 패트롤 엔진, 실시간 영상 하이라이트 요약 봇, 혹은 완벽히 초개인화된 맞춤 광고 추천 분야로 응용해 보세요.

이 탄탄한 기반 위에 여러분의 창의력을 더해 비디오 기술의 한계를 시험하고, 영상 데이터가 담고 있는 무수한 숨은 가치를 실현하는 최고의 인텔리전트 서비스를 직접 경험해 가시길 바랍니다.

부록 자료

여러분의 더 깊이 있는 탐구 여정을 돕기 위해 공식 개발 레퍼런스를 공유합니다.

  1. 프로젝트 코드 전체가 담긴 Colab 노트북 바로가기

  2. TwelveLabs 정식 개발자 문서 사이트

  3. ApertureDB 공식 데이터베이스 가이드

개발자 여러분이 이 통합 솔루션으로 어떤 혁신을 만들어낼지 무척 기대됩니다! 구현 과정 중에 얻은 멋진 아이디어와 값진 질문들은 TwelveLabsApertureDB 글로벌 엔지니어 커뮤니티 공간에 언제든 편히 공유하고 논의해 보세요. 즐거운 코딩 되시길 응원합니다!

이 튜토리얼에서는 TwelveLabs의 Embed API와 ApertureDB의 강력한 통합을 활용하여 고급 의미론적(semantic) 비디오 검색 엔진을 빌드하는 방법을 설명합니다. 최첨단 비디오 파운데이션 모델인 Marengo-2.6 기반의 Twelve Labs Embed API는 시각적 표현, 음성, 문맥 정보를 포함한 비디오 콘텐츠의 본질을 포착하는 다중모드 임베딩(multimodal embeddings)을 생성합니다. 이러한 임베딩을 컴퓨터 비전 및 머신러닝 애플리케이션에 최적화된 그래프-벡터 데이터베이스인 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의 ‘Secret(비밀)’에 API 키를 설정해야 합니다.

  1. Colab 노트북의 왼쪽 사이드바 메뉴로 이동합니다.

  2. 열쇠 모양 아이콘을 클릭하여 "Secrets" 패널을 엽니다.

  3. 다음 두 가지의 비밀값을 추가합니다.

    • Key: TL_API_KEY, Value: 사용자의 TwelveLabs API 키

    • Key: ADB_PASSWORD, Value: 사용자의 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 엔진을 사용하여 임베딩 작업(task)을 만듭니다.

  3. 작업 진행 상황을 모니터링하며 프로세스가 완료될 때까지 대기합니다.

  4. 작업이 완료되면 결과를 검색하고 임베딩을 추출합니다.

  5. 추출된 임베딩은 해당 시간 범위 및 분석 범위(scope) 등의 메타데이터와 함께 반환됩니다.

Embed API에서 사용하는 Marengo-2.6 모델은 다음과 같은 강력한 장점을 제공합니다.

  • 다중모드(Multimodal) 이해: 비디오 생태계의 시각, 오디오 및 텍스트 요소 간의 상호작용을 그대로 포착합니다.

  • 시간의 흐름 파악(Temporal awareness): 정적인 이미지 모델과 달리 Marengo-2.6은 비디오 내의 움직임, 액션, 시간 경과에 따른 정보를 정밀하게 추적합니다.

  • 유연한 세그멘테이션: 비디오의 특정 구간별로 각각 임베딩을 생성하거나, 비디오 전체를 아우르는 단일 임베딩을 커스텀하게 생성할 수 있습니다.

  • 업계 최고의 성능: 전통적인 비디오 모델에 비해 비디오 콘텐츠를 시간에 맞춰 훨씬 정밀하고 일관되게 해석해 냅니다.

이 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. 커스텀 데이터 모델(ClipEmbeddingModelVideoClipsModel)을 명확하게 정의하여 클립 및 연관 데이터가 포함된 비디오 데이터의 전체 구조를 스키마 형식으로 구조화합니다.

  2. create_video_object_with_clips 함수는 클립과 해당 임베딩이 포함된 비디오 인스턴스를 동적으로 찍어냅니다. 이는 파일 아래 그림과 같이 ApertureDB 내에서 유기적으로 연결된 그래프 네트워크 구조(connected graph schema)로 변환됩니다.

  3. 사전에 전달된 인증 자격 정보를 통해 ApertureDB 클라이언트를 활성화합니다.

  4. 업로드할 임베딩을 수용할 디스크립터 세트(컬렉션)를 프로비저닝합니다. 이 세트가 임베딩 검색 대상의 메인 인덱스 역할을 수행하게 됩니다.

  5. 마지막 단계로 모든 클립 세그먼트와 맵핑된 임베딩 정보가 통합된 완성형 비디오 객체를 생성한 후 ApertureDB 데이터베이스에 완전히 적재합니다.



위 방식에 따라 데이터 삽입 완료 시 구축되는 데이터 스키마 형태‍

비디오 데이터를 이처럼 정교하게 구성해 두면, 동영상 안의 개별 임베딩들이 지닌 시각적·시간적 전후 정보가 그대로 완벽하게 보존됩니다. 따라서 더 정확하며 세분화된 세만틱 검색 시스템을 구축할 수 있습니다. 각 클립은 고유한 시간대 데이터 및 임베딩 벡터와 다이렉트로 매칭되어 있어, 타겟 비디오 세그먼트를 마이크로 단위로 세밀하게 끄집어낼 수 있게 돕습니다.‍

우수한 성능의 세만틱 비디오 검색 수행하기

이번 장에서는 ApertureDB 서비스 내부의 임베딩 저장소를 무대로 삼아 실제 세만틱 비디오 검색(semantic video search)을 가볍게 수행해보고자 합니다. 자연어 기반의 텍스트 쿼리를 입력해 의미적 유사도가 아주 높은 대표 비디오 클립을 정교하게 발굴해 낼 것입니다.

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. TwelveLabs 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 플랫폼의 벡터 엔진 영역과 조우할 때, 그 어떤 고전적인 기술보다 의미적으로 일치하는 콘텐츠를 칼같이 정밀해진 실시간 검색 기술로 뽑아낼 수 있습니다.

오늘 설계해 본 이상적인 프로세스는 기업들의 다양한 영상 추천 코어 아키텍처 및 미디어 탐색 시스템의 지평을 활짝 열어줄 것입니다. 비디오 원천 콘텐츠의 속내 깊은 내용까지 AI 모델이 완벽하게 동기화하여 이해하게 함으로써 개발자들은 단순히 수작업된 태그 키워드 매칭이나 텍스트 검색에 머물렀던 구시대 방식을 너머, 유저가 원하는 신차원의 비디오 내비게이션 경험을 쉽고 매끄럽게 구축할 수 있을 것입니다.

다음 단계로 나아가기

이 고급형 세만틱 비디오 검색(semantic video search) 시스템의 아키텍처 완성도를 극대화화기 위해 아래와 같은 확장 개발 도전을 적극적으로 권장합니다.

  1. 임베딩 제너레이션 파인튜닝: 비디오의 클리핑 세그먼트를 쪼개는 다양한 방법론들을 비교 적용하여 데이터의 유실 없는 최적의 분석 프레임을 도출해 보세요.

  2. 쿼리 탐색 기능의 극대화: 단순한 문자 검색에서 한발 더 나아가 텍스트, 이미지, 서라운드 오디오 등을 복합 연동하는 멀티모달 패턴 쿼리 레이아웃을 도입해 보세요. TwelveLabs Embed API 제품군은 완벽한 이미지 세력 연계 및 오디오 임베딩(audio embedding) 지원 엔진 출시를 정조준하고 있습니다. 이에 발맞춰 ApertureDB 역시 이러한 통합 다중모드 벡터에 대한 유연한 맵핑 스토리지 구조를 완전하게 갖추고 있습니다.

  3. 프로덕션 크기의 대용량 아키텍처 빌딩: 실제 초대형 메가 바이트급 비디오 데이터셋을 로드하고 밀려드는 동시 사용자 트래픽 쿼리를 밀리 세컨드 단위로 정밀하게 쳐내는 성능 최적화를 감행해 보세요.

  4. 사용자 상호작용 피드백 반영: 최종 유저의 행동 반응 로그를 수집하여 추천 및 검색의 신뢰 정교함을 더욱 연마하는 선순환 루프를 빌드해 보세요.

  5. 무궁무진한 버티컬 비즈니스 모델로의 파생: 이번 지식을 디딤돌 삼아 스마트한 콘텐츠 모니터링 모더레이션 패트롤 엔진, 실시간 영상 하이라이트 요약 봇, 혹은 완벽히 초개인화된 맞춤 광고 추천 분야로 응용해 보세요.

이 탄탄한 기반 위에 여러분의 창의력을 더해 비디오 기술의 한계를 시험하고, 영상 데이터가 담고 있는 무수한 숨은 가치를 실현하는 최고의 인텔리전트 서비스를 직접 경험해 가시길 바랍니다.

부록 자료

여러분의 더 깊이 있는 탐구 여정을 돕기 위해 공식 개발 레퍼런스를 공유합니다.

  1. 프로젝트 코드 전체가 담긴 Colab 노트북 바로가기

  2. TwelveLabs 정식 개발자 문서 사이트

  3. ApertureDB 공식 데이터베이스 가이드

개발자 여러분이 이 통합 솔루션으로 어떤 혁신을 만들어낼지 무척 기대됩니다! 구현 과정 중에 얻은 멋진 아이디어와 값진 질문들은 TwelveLabsApertureDB 글로벌 엔지니어 커뮤니티 공간에 언제든 편히 공유하고 논의해 보세요. 즐거운 코딩 되시길 응원합니다!

이 튜토리얼에서는 TwelveLabs의 Embed API와 ApertureDB의 강력한 통합을 활용하여 고급 의미론적(semantic) 비디오 검색 엔진을 빌드하는 방법을 설명합니다. 최첨단 비디오 파운데이션 모델인 Marengo-2.6 기반의 Twelve Labs Embed API는 시각적 표현, 음성, 문맥 정보를 포함한 비디오 콘텐츠의 본질을 포착하는 다중모드 임베딩(multimodal embeddings)을 생성합니다. 이러한 임베딩을 컴퓨터 비전 및 머신러닝 애플리케이션에 최적화된 그래프-벡터 데이터베이스인 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의 ‘Secret(비밀)’에 API 키를 설정해야 합니다.

  1. Colab 노트북의 왼쪽 사이드바 메뉴로 이동합니다.

  2. 열쇠 모양 아이콘을 클릭하여 "Secrets" 패널을 엽니다.

  3. 다음 두 가지의 비밀값을 추가합니다.

    • Key: TL_API_KEY, Value: 사용자의 TwelveLabs API 키

    • Key: ADB_PASSWORD, Value: 사용자의 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 엔진을 사용하여 임베딩 작업(task)을 만듭니다.

  3. 작업 진행 상황을 모니터링하며 프로세스가 완료될 때까지 대기합니다.

  4. 작업이 완료되면 결과를 검색하고 임베딩을 추출합니다.

  5. 추출된 임베딩은 해당 시간 범위 및 분석 범위(scope) 등의 메타데이터와 함께 반환됩니다.

Embed API에서 사용하는 Marengo-2.6 모델은 다음과 같은 강력한 장점을 제공합니다.

  • 다중모드(Multimodal) 이해: 비디오 생태계의 시각, 오디오 및 텍스트 요소 간의 상호작용을 그대로 포착합니다.

  • 시간의 흐름 파악(Temporal awareness): 정적인 이미지 모델과 달리 Marengo-2.6은 비디오 내의 움직임, 액션, 시간 경과에 따른 정보를 정밀하게 추적합니다.

  • 유연한 세그멘테이션: 비디오의 특정 구간별로 각각 임베딩을 생성하거나, 비디오 전체를 아우르는 단일 임베딩을 커스텀하게 생성할 수 있습니다.

  • 업계 최고의 성능: 전통적인 비디오 모델에 비해 비디오 콘텐츠를 시간에 맞춰 훨씬 정밀하고 일관되게 해석해 냅니다.

이 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. 커스텀 데이터 모델(ClipEmbeddingModelVideoClipsModel)을 명확하게 정의하여 클립 및 연관 데이터가 포함된 비디오 데이터의 전체 구조를 스키마 형식으로 구조화합니다.

  2. create_video_object_with_clips 함수는 클립과 해당 임베딩이 포함된 비디오 인스턴스를 동적으로 찍어냅니다. 이는 파일 아래 그림과 같이 ApertureDB 내에서 유기적으로 연결된 그래프 네트워크 구조(connected graph schema)로 변환됩니다.

  3. 사전에 전달된 인증 자격 정보를 통해 ApertureDB 클라이언트를 활성화합니다.

  4. 업로드할 임베딩을 수용할 디스크립터 세트(컬렉션)를 프로비저닝합니다. 이 세트가 임베딩 검색 대상의 메인 인덱스 역할을 수행하게 됩니다.

  5. 마지막 단계로 모든 클립 세그먼트와 맵핑된 임베딩 정보가 통합된 완성형 비디오 객체를 생성한 후 ApertureDB 데이터베이스에 완전히 적재합니다.



위 방식에 따라 데이터 삽입 완료 시 구축되는 데이터 스키마 형태‍

비디오 데이터를 이처럼 정교하게 구성해 두면, 동영상 안의 개별 임베딩들이 지닌 시각적·시간적 전후 정보가 그대로 완벽하게 보존됩니다. 따라서 더 정확하며 세분화된 세만틱 검색 시스템을 구축할 수 있습니다. 각 클립은 고유한 시간대 데이터 및 임베딩 벡터와 다이렉트로 매칭되어 있어, 타겟 비디오 세그먼트를 마이크로 단위로 세밀하게 끄집어낼 수 있게 돕습니다.‍

우수한 성능의 세만틱 비디오 검색 수행하기

이번 장에서는 ApertureDB 서비스 내부의 임베딩 저장소를 무대로 삼아 실제 세만틱 비디오 검색(semantic video search)을 가볍게 수행해보고자 합니다. 자연어 기반의 텍스트 쿼리를 입력해 의미적 유사도가 아주 높은 대표 비디오 클립을 정교하게 발굴해 낼 것입니다.

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. TwelveLabs 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 플랫폼의 벡터 엔진 영역과 조우할 때, 그 어떤 고전적인 기술보다 의미적으로 일치하는 콘텐츠를 칼같이 정밀해진 실시간 검색 기술로 뽑아낼 수 있습니다.

오늘 설계해 본 이상적인 프로세스는 기업들의 다양한 영상 추천 코어 아키텍처 및 미디어 탐색 시스템의 지평을 활짝 열어줄 것입니다. 비디오 원천 콘텐츠의 속내 깊은 내용까지 AI 모델이 완벽하게 동기화하여 이해하게 함으로써 개발자들은 단순히 수작업된 태그 키워드 매칭이나 텍스트 검색에 머물렀던 구시대 방식을 너머, 유저가 원하는 신차원의 비디오 내비게이션 경험을 쉽고 매끄럽게 구축할 수 있을 것입니다.

다음 단계로 나아가기

이 고급형 세만틱 비디오 검색(semantic video search) 시스템의 아키텍처 완성도를 극대화화기 위해 아래와 같은 확장 개발 도전을 적극적으로 권장합니다.

  1. 임베딩 제너레이션 파인튜닝: 비디오의 클리핑 세그먼트를 쪼개는 다양한 방법론들을 비교 적용하여 데이터의 유실 없는 최적의 분석 프레임을 도출해 보세요.

  2. 쿼리 탐색 기능의 극대화: 단순한 문자 검색에서 한발 더 나아가 텍스트, 이미지, 서라운드 오디오 등을 복합 연동하는 멀티모달 패턴 쿼리 레이아웃을 도입해 보세요. TwelveLabs Embed API 제품군은 완벽한 이미지 세력 연계 및 오디오 임베딩(audio embedding) 지원 엔진 출시를 정조준하고 있습니다. 이에 발맞춰 ApertureDB 역시 이러한 통합 다중모드 벡터에 대한 유연한 맵핑 스토리지 구조를 완전하게 갖추고 있습니다.

  3. 프로덕션 크기의 대용량 아키텍처 빌딩: 실제 초대형 메가 바이트급 비디오 데이터셋을 로드하고 밀려드는 동시 사용자 트래픽 쿼리를 밀리 세컨드 단위로 정밀하게 쳐내는 성능 최적화를 감행해 보세요.

  4. 사용자 상호작용 피드백 반영: 최종 유저의 행동 반응 로그를 수집하여 추천 및 검색의 신뢰 정교함을 더욱 연마하는 선순환 루프를 빌드해 보세요.

  5. 무궁무진한 버티컬 비즈니스 모델로의 파생: 이번 지식을 디딤돌 삼아 스마트한 콘텐츠 모니터링 모더레이션 패트롤 엔진, 실시간 영상 하이라이트 요약 봇, 혹은 완벽히 초개인화된 맞춤 광고 추천 분야로 응용해 보세요.

이 탄탄한 기반 위에 여러분의 창의력을 더해 비디오 기술의 한계를 시험하고, 영상 데이터가 담고 있는 무수한 숨은 가치를 실현하는 최고의 인텔리전트 서비스를 직접 경험해 가시길 바랍니다.

부록 자료

여러분의 더 깊이 있는 탐구 여정을 돕기 위해 공식 개발 레퍼런스를 공유합니다.

  1. 프로젝트 코드 전체가 담긴 Colab 노트북 바로가기

  2. TwelveLabs 정식 개발자 문서 사이트

  3. ApertureDB 공식 데이터베이스 가이드

개발자 여러분이 이 통합 솔루션으로 어떤 혁신을 만들어낼지 무척 기대됩니다! 구현 과정 중에 얻은 멋진 아이디어와 값진 질문들은 TwelveLabsApertureDB 글로벌 엔지니어 커뮤니티 공간에 언제든 편히 공유하고 논의해 보세요. 즐거운 코딩 되시길 응원합니다!