Gemini의 비디오 임베딩 기능을 활용한 초단위 이하 의미 기반 영상 검색 도구 SentrySearch
(github.com/ssrajadh)- 대시캠 등 영상 파일에서 자연어로 장면을 검색해 해당 구간을 자동으로 잘라내는 의미 기반 검색 시스템
- 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)
Hacker News 의견들
-
이 구현 방식이 정말 멋지다고 느껴짐. 여전히 임베딩(embeddings) 은 마법처럼 느껴지는 부분이 있음
하지만 이런 기술이 현실에서 감시 사회로 이어질 가능성이 가장 걱정스러움
지금은 수많은 카메라가 있지만, 실제로 모든 영상을 사람이 다 보는 건 불가능하기 때문에 어느 정도의 익명성과 사생활이 유지되고 있음
그러나 AI가 모든 영상을 실시간으로 분석하고 특정 인물이나 행동을 자연어로 탐지할 수 있게 되면, 전면 감시(panopticon) 가 현실이 될 수 있음
범죄 탐지나 낙상 감지 같은 긍정적인 활용도 있겠지만, 규제가 없다면 그 결과는 매우 위험할 것임- 지금 이게 실제로 구현 중임. 시의회 회의에서 ALPR 카메라 계약을 논의하는 걸 들었는데, 거기서 Fusus라는 대시보드 제품을 알게 됨
다양한 카메라 시스템과 ALPR, 경보를 통합하고, 자연어로 영상 질의가 가능하다고 함
앞으로는 시민이 설치한 카메라도 통합될 예정이라 함. 결국 이게 Citizen 앱 같은 서비스와 연결되면, 이웃집 카메라가 경찰 시스템에 바로 연결되는 세상이 올 수도 있음
정말 걱정스러운 방향임 - 지금은 비용($2.50/시간)과 지연 시간(latency) 때문에 실시간 인덱싱이 어렵지만, 머지않아 가능해질 것임
그래서 나는 로컬 모델로 이런 걸 처리해서 영상이 외부로 나가지 않게 하는 게 중요하다고 생각함
하지만 전체적인 기술의 방향성은 신중히 고민해야 함 - 대부분의 카메라는 한 조직이 전부 접근할 수 없고, 정부가 보려면 영장(subpoena) 이 필요함
문제는 Flock이나 Ring처럼 대규모로 배포되거나, 한 회사가 모든 영상에 접근할 수 있을 때 생김 - 기술적으로는 이미 전면 감시 체계가 가능함. 단지 지금은 비용이 많이 들 뿐임
- 이런 비전 인식 모듈이 저전력 ASIC에서도 돌아가게 되면, 드론이 끔찍한 무기가 될 수 있음
- 지금 이게 실제로 구현 중임. 시의회 회의에서 ALPR 카메라 계약을 논의하는 걸 들었는데, 거기서 Fusus라는 대시보드 제품을 알게 됨
-
멀티모달 AI가 광고 탐지와 광고 삽입 간의 무기 경쟁을 불러올 것 같음
예전에 Gemini 이전 모델로 AI 광고 제거를 실험했는데, 이번 기술은 훨씬 강력해서 광고를 즉시 식별하고 음소거하거나 제거할 수 있을 듯함
관련 실험을 여기서 정리함- 흥미로운 글이었음. 어떤 사람이 AI 기반 웹 검색의 미래를 그렸는데, 결론은 밝지 않았음
결국 광고는 사라지지 않을 것임. AI 제공자가 광고 화이트리스트를 받거나, 더 나쁘게는 AI가 직접 광고 제품을 홍보하게 될 수도 있음
- 흥미로운 글이었음. 어떤 사람이 AI 기반 웹 검색의 미래를 그렸는데, 결론은 밝지 않았음
-
몇 달 전 Rexing 대시캠을 샀는데, 영상 접근이 너무 불편해서 직접 시스템을 만들어보려 함
SD카드를 뽑지 않고도 영상을 탐색하고 다운로드할 수 있게 하려는 중임
녹화 영상을 스크롤하다가 ‘이 장면을 자연어로 검색할 수 있으면 좋겠다’고 생각했는데, 이번 프로젝트를 보니 바로 적용하고 싶어짐
공유해줘서 고마움 -
이 기술을 영상 편집 소프트웨어에 적용할 수 있을까 궁금함
예를 들어 Premiere 플러그인에서 “고양이가 나오는 장면을 모두 제거해줘”라고 하면 자동으로 EDL(Edit Decision List) 을 만들어주는 식으로- 좋은 아이디어임. 나도 이걸 다음 단계로 생각하고 있었음
SentrySearch는 이미 자연어 질의에 대해 정확한 in/out 타임스탬프를 반환하고 ffmpeg로 자동 트리밍함
이걸 EDL이나 Premiere 플러그인으로 확장하는 건 자연스러운 진화임
나는 Premiere 전문가는 아니지만, 누군가 EDL 익스포터나 플러그인을 시도한다면 PR 리뷰와 병합을 도와줄 의향이 있음
시작하면 GitHub 이슈로 알려주면 좋겠음
- 좋은 아이디어임. 나도 이걸 다음 단계로 생각하고 있었음
-
이게 로컬 모델에서도 작동할 수 있는지 궁금함
-
대시캠이 아니라 홈 모니터링 용도로도 흥미로움
- 대부분의 홈 모니터링은 움직임 감지 시에만 녹화하므로 이미 검색 공간이 많이 줄어듦
앞뒤로 빠르게 넘기면 문 앞에 누가 다가오는 30초 정도는 쉽게 찾을 수 있음 - 이런 기능은 앞으로 모든 홈 보안 시스템의 필수 기능이 될 것 같음
예전에 고양이가 문이 열렸을 때 밖으로 나갔는지 확인하려고 몇 시간씩 영상을 돌려봤는데, 사실은 집 안에 숨어 있었음
- 대부분의 홈 모니터링은 움직임 감지 시에만 녹화하므로 이미 검색 공간이 많이 줄어듦
-
나도 임베딩 프로젝트를 진행 중인데, 아직 프로토타입 단계임
내 경우 Gemini는 아니고, 게임용 연결 퍼즐(reverse connections) 을 만드는 중임
관련 내용은 여기서 볼 수 있음 -
“영상 조각이 대부분 정지 프레임인지 확인”하는 코드 부분을 봤는데, ffmpeg의 select와 scene 파라미터를 조합하면 자동으로 처리할 수 있을 것 같음
-
나는 콘텐츠/비디오 인텔리전스 분야에서 일함
Gemini는 이런 사용 사례에 정말 잘 맞는 도구임 -
데모에서 “뒤에 자전거 거치대가 달린 차가 밤에 나를 끼어들었을 때”를 검색하는 걸 보고 웃었음
아마 그 차를 찾는 게 이 프로젝트를 만든 진짜 동기였을 듯함- 틀린 말은 아닌 듯함