動画検索システム構築の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に参加してください!👇🏻
読み続けて

Zilliz Named "Highest Performer" and "Easiest to Use" in G2's Summer 2025 Grid® Report for Vector Databases
Zilliz shines in G2's Summer 2025 Grid® Report as both "Highest Performer" and "Easiest to Use," solving the performance-usability dilemma.

Milvus WebUI: A Visual Management Tool for Your Vector Database
Explore Milvus WebUI to monitor, manage, and optimize your vector database with real-time insights, performance tracking, and system health monitoring.

Vector Databases vs. Spatial Databases
Use a vector database for AI-powered similarity search; use a spatial database for geographic and geometric data analysis and querying.



