- 대시캠 등 영상 파일에서 자연어로 장면을 검색해 해당 구간을 자동으로 잘라내는 의미 기반 검색 시스템
- 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)