- ダッシュカムなどの動画ファイル内のシーンを自然言語で検索し、該当区間を自動で切り出す意味ベース検索システム
- 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秒あたり1フレームだけを処理する
- 前処理では 480p、5fps にダウンスケーリングし、転送速度の最適化 と タイムアウト回避 を目的とする
-
コスト削減の最適化
- 前処理(preprocessing) : アップロードサイズと転送時間を削減
- 静止フレームスキップ(still-frame skipping) : 視覚的変化のない区間は埋め込みを省略
- 検索クエリはテキスト埋め込みのみを行うため、コストはほぼゼロ
- 追加調整オプション
--chunk-duration, --overlap : API呼び出し回数を調整
--no-skip-still : すべてのチャンクを埋め込む
--target-resolution, --target-fps : 前処理品質を調整
--no-preprocess : 元のチャンクをそのまま送信
制限事項と今後の改善
- 静止フレーム検出 は JPEG ファイルサイズ比較ベースのヒューリスティック方式であり、微細な動きを見逃したり、静止区間を誤って含めたりする可能性がある
- 検索品質はチャンク境界に依存 し、イベントが2つのチャンクにまたがる場合は完全に捉えられないことがある
- 将来的には シーン検出(scene detection) ベースのチャンク分割で改善可能
- Gemini Embedding 2 は現在 プレビュー段階 のため、APIの挙動や価格が変更される可能性がある
互換性と要件
.mp4 形式のすべての動画ファイルで動作し、Tesla Sentry Mode 映像に限定されない
- フォルダ構造に関係なく、すべての
.mp4 ファイルを再帰的に探索
- 要件
1件のコメント
Hacker Newsの意見
この実装方法は本当にすごくクールだと感じる。今でも 埋め込み(embeddings) には魔法のように思える部分がある。
ただ、こうした技術が現実で 監視社会 につながる可能性がいちばん心配だ。
今は無数のカメラがあるが、実際にすべての映像を人間が見るのは不可能なので、ある程度の匿名性とプライバシーが保たれている。
しかしAIがすべての映像をリアルタイムで分析し、特定の人物や行動を自然言語で検出できるようになれば、全方位監視(panopticon) が現実になりうる。
犯罪検知や転倒検知のような前向きな活用もあるだろうが、規制がなければその結果は非常に危険だろう。
さまざまなカメラシステムとALPR、アラートを統合し、自然言語で映像を検索できるという。
今後は市民が設置したカメラも統合される予定らしい。結局これが Citizenアプリ のようなサービスとつながれば、近所の家のカメラが警察システムに直結する世界が来るかもしれない。
本当に不安になる方向だ。
だから私は、こうした処理は ローカルモデル で行い、映像が外部に出ないようにすることが重要だと思う。
ただ、技術全体の方向性については慎重に考える必要がある。
問題は、FlockやRingのように大規模展開されたり、1社がすべての映像にアクセスできたりする場合に生じる。
マルチモーダルAI は広告検知と広告挿入のあいだで 軍拡競争 を引き起こしそうだ。
以前、Gemini以前のモデルでAIによる広告除去を試したことがあるが、今回の技術ははるかに強力なので、広告を即座に識別してミュートしたり除去したりできそうだ。
関連する実験は ここにまとめてある
結局、広告は消えないだろう。AI提供者が広告のホワイトリストを受け取るか、もっと悪い場合はAI自体が 広告商品を宣伝 するようになるかもしれない。
数か月前に Rexingのドラレコ を買ったが、映像へのアクセスがあまりに不便で、自分でシステムを作ってみようと思っている。
SDカードを抜かなくても映像を閲覧・ダウンロードできるようにしたい。
録画映像をスクロールしながら「この場面を 自然言語で検索 できたらいいのに」と思っていたので、このプロジェクトを見てすぐにでも取り入れたくなった。
共有してくれてありがとう。
この技術を 映像編集ソフトウェア に適用できるのか気になる。
たとえばPremiereプラグインで「猫が出てくる場面を全部削除して」と言えば、自動で EDL(Edit Decision List) を作ってくれるような形で。
SentrySearchはすでに自然言語クエリに対して正確なin/outタイムスタンプを返し、ffmpegで自動トリミングしている。
これをEDLやPremiereプラグインに拡張するのは自然な進化だ。
私はPremiereの専門家ではないが、誰かが EDLエクスポーター やプラグインを試すなら、PRのレビューやマージを手伝うつもりだ。
始めたらGitHub issueで知らせてくれるとうれしい。
これが ローカルモデル でも動くのか気になる。
ドラレコではなく ホームモニタリング 用途でも面白そうだ。
前後にすばやく送れば、玄関先に誰かが近づく30秒程度なら簡単に見つけられる。
以前、猫がドアが開いたときに外へ出たか確認するために何時間も映像を見返したことがあるが、実際には家の中に隠れていた。
私も 埋め込みプロジェクト を進めているが、まだプロトタイプ段階だ。
私の場合はGeminiではなく、ゲーム向け接続パズル(reverse connections) を作っている。
関連内容は ここで見られる
「映像の断片がほとんど静止フレームかどうか確認する」コード部分を見たが、ffmpegの select と scene パラメータを組み合わせれば自動処理できそうだ。
私は コンテンツ/ビデオインテリジェンス 分野で働いている。
Geminiはこうした ユースケース に本当によく合うツールだ。
デモで「後ろに自転車ラックが付いた車が夜に自分の前へ割り込んできたとき」を検索しているのを見て笑った。
たぶんその車を見つけるのが、このプロジェクトを作った 本当の動機 だったのだろう。