システム概要
その名が示すように、画像による動画検索は、入力画像に類似したフレームを含む動画をリポジトリから検索するプロセスである。重要なステップの一つは、動画を埋め込み画像にすること、つまり、キーとなるフレームを抽出し、その特徴をベクトルに変換することである。さて、好奇心旺盛な読者の中には、画像から動画を検索するのと、画像から画像を検索するのと、何が違うのかと思うかもしれない。実は、動画からキーフレームを探すことは、画像から画像を探すことと同じなのです。
興味のある方は、以前の記事Milvus x VGG: コンテンツベースの画像検索システムの構築を参照していただきたい。
システム概要
以下の図は、このような動画検索システムの典型的なワークフローを示している。
1-動画検索システムのワークフロー.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 から直接引っ張ってくることができます。
# Get the video search code
$ git clone -b 0.10.0 https://github.com/JackLCL/search-video-demo.git
# Build front-end interface docker and api docker images
$ cd search-video-demo & make all
ステップ2:環境を設定する。
ここでは、docker-compose.ymlを使用して、上記の5つのコンテナを管理します。docker-compose.ymlの設定は以下の表を参照:
2-configure-docker-compose-yml.png
上表のIPアドレス192.168.1.38は、本記事で特に動画検索システムを構築するためのサーバーアドレスです。あなたのサーバーアドレスに更新する必要があります。
Milvus、Redis、Minio用のストレージ・ディレクトリを手動で作成し、docker-compose.ymlに対応するパスを追加する必要があります。この例では、以下のディレクトリを作成しました:
/mnt/redis/data /mnt/minio/data /mnt/milvus/db
docker-compose.ymlでは、以下のようにMilvus、Redis、Minioを設定できる:
3-configure-milvus-redis-minio-docker-compose-yml.png 。
ステップ3:システムを起動する。
変更したdocker-compose.ymlを使用して、動画検索システムで使用する5つのdockerコンテナを起動する:
$ docker-compose up -d
その後、docker-compose psを実行して、5つのdockerコンテナが正しく起動したかどうかを確認できる。次のスクリーンショットは、正常に起動した後の典型的なインターフェイスを示しています。
4-sucessful-setup.png
これで、データベースには動画がないものの、動画検索システムの構築に成功したことになる。
ステップ 4: 動画のインポート
システムリポジトリのdeployディレクトリに、動画をインポートするスクリプトimport_data.pyがあります。スクリプトを実行するには、動画ファイルへのパスとインポート間隔を更新するだけです。
5-update-path-video.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と入力すると、以下のように動画検索システムのインターフェイスが表示されます。
6-ビデオ検索インターフェース.png
右上の歯車スイッチを切り替えると、リポジトリ内のすべての動画が表示されます。
7-すべての動画を見る-リポジトリ.png
左上のアップロードボックスをクリックし、対象画像を入力します。下図のように、最も類似したフレームを含む動画が表示されます。
8-enjoy-recommender-system-cats.png
次に、動画検索システムを楽しんでみましょう!
自分で作る
この記事では、Milvusを使って、画像から動画を検索するシステムを構築しました。これは、非構造化データ処理におけるMilvusの応用例を示すものである。
Milvusは複数のディープラーニングフレームワークと互換性があり、数十億規模のベクトルに対してmilvusを使えばミリ秒での検索が可能だ。Milvusは、https://github.com/milvus-io/milvus、より多くのAIシナリオに自由に活用できる。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word