動画検索システム構築の4ステップ
その名が示すように、画像による動画検索は、入力画像に類似したフレームを含む動画をリポジトリから検索するプロセスである。重要なステップのひとつは、動画を埋め込み画像にすること、つまり、キーとなるフレームを抽出し、その特徴をベクトルに変換することである。さて、好奇心旺盛な読者の中には、画像から動画を検索するのと、画像から画像を検索するのと、何が違うのかと思うかもしれない。実は、動画からキーフレームを探すことは、画像から画像を探すことに等しい。
興味のある方は、以前の記事Milvus x VGG: コンテンツベースの画像検索システムの構築を参照していただきたい。
システム概要2
以下の図は、このようなビデオ検索システムの典型的なワークフローを示している。
動画検索システムのワークフロー](https://assets.zilliz.com/1_video_search_system_workflow_c68d658b93.png)
動画をインポートする際には、OpenCVライブラリを用いて各動画をフレーム単位に切り出し、画像特徴抽出モデルVGGを用いてキーフレームのベクトルを抽出し、抽出したベクトル(エンベッディング)をMilvusに挿入する。元の動画の保存にはMinioを、動画とベクトルの相関関係の保存にはRedisを使用しています。
動画を検索する際には、同じVGGモデルを使って入力画像を特徴ベクトルに変換し、Milvusに挿入して最も類似性の高いベクトルを見つける。そして、Redisの相関関係に従って、Minioのインターフェイス上で対応する動画を検索する。
データの準備
この記事では、動画を検索するためのエンドツーエンドのソリューションを構築するためのサンプルデータセットとして、Tumblrの約10万個のGIFファイルを使用する。自分の動画リポジトリを使うこともできる。
デプロイメント
この記事の動画検索システムを構築するためのコードは、GitHubにあります。
ステップ1: Dockerイメージをビルドする。
動画検索システムの構築には、Milvus v0.7.1ドッカー、Redisドッカー、Minioドッカー、フロントエンドインターフェースドッカー、バックエンドAPIドッカーが必要です。フロントエンドのインターフェース docker とバックエンドの API docker は自分でビルドする必要がありますが、他の3つの docker は Docker Hub から直接引っ張ってくることができます。
# 動画検索のコードを取得する
$ git clone -b 0.10.0 https://github.com/JackLCL/search-video-demo.git
# フロントエンドのインターフェース docker と API docker イメージをビルドする
cd search-video-demo & make all
ステップ2: 環境を設定する。
ここでは、docker-compose.ymlを使って上記の5つのコンテナを管理する。docker-compose.ymlの設定は以下の表を参照:
docker composeの設定](https://assets.zilliz.com/2_configure_docker_compose_yml_a33329e5e9.png)
上表の192.168.1.38というIPアドレスは、この記事で特に動画検索システムを構築するためのサーバーアドレスです。自分のサーバアドレスに更新する必要があります。
Milvus、Redis、Minio用のストレージ・ディレクトリを手動で作成し、docker-compose.ymlに対応するパスを追加する必要があります。この例では、以下のディレクトリを作成しました:
/mnt/redis/data /mnt/minio/data /mnt/milvus/db
docker-compose.ymlでは、Milvus、Redis、Minioを以下のように設定できる:
Milvus、Redis、MinIO、Docker-composeの設定](https://assets.zilliz.com/3_configure_milvus_redis_minio_docker_compose_yml_4a8104d53e.png)
ステップ3: システムを起動する。
変更したdocker-compose.ymlを使用して、動画検索システムで使用する5つのdockerコンテナを起動します:
docker-compose up -d
その後、docker-compose ps を実行して、5 つの docker コンテナが正しく起動したかどうかを確認できます。次のスクリーンショットは、正常に起動した後の典型的なインターフェイスです。
セットアップ成功](https://assets.zilliz.com/4_sucessful_setup_f2b3006487.png)
これで、データベースには動画がないものの、動画検索システムの構築に成功しました。
ステップ4: 動画をインポートする。
システムリポジトリのデプロイディレクトリに、動画をインポートするスクリプト import_data.py を置きます。スクリプトを実行するには、動画ファイルへのパスとインポート間隔を更新するだけです。
動画のパスを更新](https://assets.zilliz.com/5_update_path_video_5065928961.png)
data_path:インポートする動画のパス。
time.sleep(0.5):システムが動画をインポートする間隔。動画検索システムを構築するために使用しているサーバーのCPUコアは96である。そのため、間隔は0.5秒に設定することを推奨する。サーバーのCPUコアが少ない場合は、間隔を大きく設定してください。そうしないと、インポート処理でCPUに負担がかかり、ゾンビ・プロセスが発生します。
import_data.pyを実行して動画をインポートします。
$ cd deploy
$ python3 import_data.py
動画がインポートされたら、動画検索システムの準備は完了です!
インターフェイスの表示
ブラウザを開き、192.168.1.38:8001と入力すると、以下のように動画検索システムのインターフェイスが表示されます。
動画検索インターフェース](https://assets.zilliz.com/6_video_search_interface_4c26d93e02.png)
右上の歯車スイッチを切り替えると、リポジトリ内のすべての動画が表示されます。
すべての動画を見る](https://assets.zilliz.com/7_view_all_videos_repository_26ff37cad5.png)
左上のアップロードボックスをクリックして、対象画像を入力します。下図のように、最も類似したフレームを含む動画が返されます。
猫レコメンドシステムを楽しもう!](https://assets.zilliz.com/8_enjoy_recommender_system_cats_bda1bf9db3.png)
次に、動画検索システムを楽しんでみましょう!
自分で作る
この記事では、Milvusを使って画像から動画を検索するシステムを構築した。これは非構造化データ処理におけるMilvusの応用例です。
Milvusは複数のディープラーニングフレームワークと互換性があり、数十億規模のベクトルに対してミリ秒単位の検索を可能にする。より多くのAIシナリオにMilvusを自由に活用してください。https://github.com/milvus-io/milvus。
Twitter](https://twitter.com/milvusio/)で私たちをフォローするか、Slackに参加してください!👇🏻
読み続けて

How to Install and Run OpenClaw (Previously Clawdbot/Moltbot) on Mac
Turn your Mac into an AI gateway for WhatsApp, Telegram, Discord, iMessage, and more — in under 5 minutes.

The Great AI Agent Protocol Race: Function Calling vs. MCP vs. A2A
Compare Function Calling, MCP, and A2A protocols for AI agents. Learn which standard best fits your development needs and future-proof your applications.

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
In this article, we’ll explore how DeepRAG works, unpack its key components, and show how vector databases like Milvus and Zilliz Cloud can further enhance its retrieval capabilities.
