Gemini의 비디오 임베딩 기능을 활용한 초단위 이하 의미 기반 영상 검색 도구 SentrySearch

1 day ago 4
  • 대시캠 등 영상 파일에서 자연어로 장면을 검색해 해당 구간을 자동으로 잘라내는 의미 기반 검색 시스템
  • Google Gemini Embedding 2 모델을 이용해 비디오 자체를 벡터로 임베딩하고, ChromaDB 에 저장해 텍스트 쿼리와 직접 비교
  • ffmpeg 로 영상을 겹치는 청크 단위로 분할해 임베딩하며, 검색 시 가장 유사한 구간을 하위 초 단위 속도로 반환
  • 전처리와 정지 프레임 스킵 기능으로 API 호출 비용을 줄이고, 1시간 영상 인덱싱에 약 $2.84 수준의 비용 발생
  • Gemini Embedding 2의 비디오 직접 임베딩 기능을 활용해 자막 생성 없이도 수시간 분량의 영상에서 빠른 의미 검색을 가능하게 함

개요

  • SentrySearch대시캠 영상에서 의미 기반 검색(semantic search) 을 수행하는 도구로, 사용자가 자연어로 검색어를 입력하면 해당 장면이 포함된 잘린 클립(trimmed clip) 을 반환함
  • Google Gemini Embedding 2 모델을 이용해 영상 자체를 벡터로 임베딩하고, 이를 ChromaDB 로컬 데이터베이스에 저장함
  • 텍스트 쿼리를 동일한 벡터 공간에 임베딩해 가장 유사한 영상 조각을 찾아냄
  • 검색 결과는 원본 파일에서 자동으로 잘라 저장되며, 하위 초 단위(sub-second) 의 검색 속도를 제공함

작동 방식

  • 영상은 겹치는 구간(overlapping chunks) 으로 분할되어 각 구간이 Gemini Embedding 모델을 통해 직접 임베딩됨
  • 각 임베딩 벡터는 ChromaDB 에 저장되며, 검색 시 텍스트 쿼리가 동일한 벡터 공간으로 변환되어 매칭됨
  • 가장 높은 유사도를 가진 구간이 원본 영상에서 자동으로 잘려 클립으로 저장됨
  • ffmpeg 가 영상 분할과 트리밍에 사용되며, 시스템에 설치되어 있지 않으면 imageio-ffmpeg 가 자동으로 사용됨

설치 및 초기 설정

  • Python 3.10 이상 환경에서 다음 명령으로 설치 가능
    • git clone 후 pip install -e .
  • sentrysearch init 명령으로 Gemini API 키를 설정하고 .env 파일에 저장
    • 키 유효성 검증을 위해 테스트 임베딩을 수행함
  • 수동 설정 시 .env.example을 복사해 직접 API 키를 추가할 수 있음

주요 명령어 및 옵션

  • index

    • 지정된 폴더 내 .mp4 파일을 재귀적으로 스캔해 인덱싱 수행
    • 각 파일은 여러 chunk 로 분할되어 임베딩됨
    • 옵션
      • --chunk-duration : 청크 길이(초 단위)
      • --overlap : 청크 간 겹침 길이
      • --no-preprocess : 다운스케일링 및 프레임 축소 생략
      • --target-resolution : 전처리 시 목표 해상도(기본 480p)
      • --target-fps : 전처리 시 목표 프레임 속도(기본 5fps)
      • --no-skip-still : 정지 프레임 구간도 모두 임베딩
  • search

    • 예시: sentrysearch search "red truck running a stop sign"
    • 결과는 유사도 점수와 함께 표시되며, 최고 결과는 자동으로 잘려 저장됨
    • 유사도 점수가 기본 임계값(0.35) 이하일 경우 확인 프롬프트가 표시됨
    • 옵션
      • --results N : 표시할 결과 수
      • --output-dir DIR : 클립 저장 경로
      • --no-trim : 자동 트리밍 비활성화
      • --threshold : 유사도 임계값 조정
  • stats

    • 인덱싱된 총 청크 수와 원본 파일 수를 표시
  • --verbose

    • 임베딩 차원, API 응답 시간, 유사도 점수 등 디버그 정보를 출력

기술적 배경

  • Gemini Embedding 2비디오를 직접 임베딩할 수 있으며, 텍스트 쿼리와 동일한 768차원 벡터 공간에서 비교 가능
  • 별도의 자막 생성이나 프레임 캡션화 과정이 필요 없음
  • 예를 들어 “red truck at a stop sign”이라는 텍스트 쿼리는 30초짜리 영상 클립과 직접 비교 가능
  • 이 기능으로 수 시간 분량의 영상에서도 초 단위 이하의 의미 검색이 가능함

비용 구조

  • 기본 설정(30초 청크, 5초 겹침) 기준으로 1시간 영상 인덱싱 비용은 약 $2.84
    • Gemini API는 업로드된 영상에서 초당 1프레임만 처리함
    • 전처리 과정은 480p, 5fps로 다운스케일링하여 전송 속도 최적화타임아웃 방지 목적
  • 비용 절감 최적화

    • 전처리(preprocessing) : 업로드 크기와 전송 시간을 줄임
    • 정지 프레임 스킵(still-frame skipping) : 시각적 변화가 없는 구간은 임베딩 생략
      • 주차 중 장시간 녹화된 영상에서 효과적
    • 검색 쿼리는 텍스트 임베딩만 수행하므로 비용이 거의 없음
    • 추가 조정 옵션
    • --chunk-duration, --overlap : API 호출 횟수 조절
    • --no-skip-still : 모든 청크 임베딩
    • --target-resolution, --target-fps : 전처리 품질 조정
    • --no-preprocess : 원본 청크 그대로 전송

한계 및 향후 개선

  • 정지 프레임 감지는 JPEG 파일 크기 비교 기반의 휴리스틱 방식으로, 미세한 움직임을 놓치거나 정지 구간을 잘못 포함할 수 있음
  • 검색 품질은 청크 경계에 의존, 이벤트가 두 청크에 걸칠 경우 완벽히 포착되지 않을 수 있음
    • 향후 장면 감지(scene detection) 기반 청크 분할로 개선 가능
  • Gemini Embedding 2는 현재 프리뷰 단계로, API 동작 및 가격이 변경될 수 있음

호환성 및 요구사항

  • .mp4 형식의 모든 영상 파일에서 작동하며, Tesla Sentry Mode 영상에 한정되지 않음
  • 폴더 구조와 관계없이 모든 .mp4 파일을 재귀적으로 탐색
  • 요구사항
    • Python 3.10 이상
    • ffmpeg 설치 필요 (또는 imageio-ffmpeg 자동 사용)
    • Gemini API 키 필요 (무료 키 발급 가능: aistudio.google.com/apikey)
Read Entire Article