Milvusベクトルデータベースによる映像解析システムの構築

先週末、『フリーガイ』を観ていたとき、警備員のバディを演じている俳優をどこかで見たことがあるような気がしたのだが、彼の出演作を思い出すことができなかった。頭の中は "この人誰?"でいっぱいだった。確かに見たことのある顔なのに、必死に名前を思い出そうとしていた。似たようなケースに、昔よく好きだったお酒をビデオで主役が飲んでいるのを見たことがあるが、結局銘柄を思い出せなかったことがある。
答えは舌の先にあったのだが、脳が完全に行き詰まった感じだった。
映画を見ていると、舌先三寸(TOT)現象にイライラさせられる。動画を検索し、動画の内容を分析できる動画用逆画像検索エンジンがあればいいのだが。以前、私はMilvusを使った逆画像検索エンジンを作った。動画コンテンツ解析が画像解析に似ていることから、Milvusをベースに動画コンテンツ解析エンジンを構築することにした。
オブジェクト検出
概要
解析の前に、まず映像中の物体を検出する必要がある。ビデオ内の物体を効果的かつ正確に検出することは、このタスクの主な課題である。また、自動操縦、ウェアラブルデバイス、IoTなどのアプリケーションにとっても重要な課題である。
伝統的な画像処理アルゴリズムからディープニューラルネットワーク(DNN)へと発展し、現在の物体検出の主流モデルには、R-CNN、FRCNN、SSD、YOLOなどがある。本トピックで紹介するMilvusベースのディープラーニング映像解析システムは、インテリジェントかつ迅速に物体を検出することができる。
実装
映像中の物体を検出・認識するためには、まず映像からフレームを抽出し、物体検出を用いてフレーム画像中の物体を検出し、次に検出した物体から特徴ベクトルを抽出し、最後に特徴ベクトルに基づいて物体を解析する。
- フレーム抽出
映像解析はフレーム抽出により画像解析に変換される。現在、フレーム抽出技術は非常に成熟している。FFmpegやOpenCVのようなプログラムは、指定された間隔でフレームを抽出することをサポートしています。この記事では、OpenCVを使って動画から1秒ごとにフレームを抽出する方法を紹介します。
- オブジェクト検出
オブジェクト検出とは、抽出したフレームからオブジェクトを見つけ、その位置に応じてスクリーンショットを抽出することです。以下の図のように、自転車、犬、車が検出されました。このトピックでは、物体検出によく使われるYOLOv3を使った物体検出の方法を紹介します。
図1](https://assets.zilliz.com/p1_0913edccdc.png)
- 特徴抽出
特徴抽出とは、機械が認識しにくい非構造化データを特徴ベクトルに変換することを指す。例えば、画像はディープラーニングモデルを用いて多次元の特徴ベクトルに変換することができる。現在、画像認識のAIモデルとしては、VGG、GNN、ResNetなどが有名です。本トピックでは、ResNet-50を用いて、検出された物体から特徴量を抽出する方法を紹介します。
図2](https://assets.zilliz.com/p2_b398855741.png)
- ベクトル解析
抽出された特徴ベクトルをライブラリベクトルと比較し、最も類似したベクトルに対応する情報を返す。大規模な特徴ベクトルデータセットの場合、その計算は非常に困難です。このトピックでは、Milvusを用いた特徴ベクトルの解析方法を紹介します。
キーテクノロジー
OpenCV
Open Source Computer Vision Library (OpenCV) は、クロスプラットフォームのコンピュータビジョンライブラリで、画像処理とコンピュータビジョンのための多くの普遍的なアルゴリズムを提供します。OpenCVはコンピュータビジョン分野で一般的に使用されています。
以下の例では、PythonでOpenCVを使用して、指定した間隔でビデオフレームをキャプチャし、画像として保存する方法を示します。
Python インポート cv2 cap = cv2.VideoCapture(file_path). framerate = cap.get(cv2.CAP_PROP_FPS). allframes = int(cv2.VideoCapture.get(cap, int(cv2.CAP_PROP_FRAME_COUNT))) success, image = cap.read(). cv2.imwrite(file_name, image).
### YOLOv3
You Only Look Once, Version 3 (YOLOv3 [5])は,近年提案された1段階の物体検出アルゴリズムである.従来の同じ精度の物体検出アルゴリズムと比較して、YOLOv3は2倍高速である。本トピックで紹介するYOLOv3は、PaddlePaddle[6]の改良版である。複数の最適化手法を用い、推論速度が向上している。
### ResNet-50
ResNet[7]は、そのシンプルさと実用性からILSVRC2015の画像分類部門で優勝した。多くの画像解析手法の基礎として、ResNetは画像検出、セグメンテーション、認識に特化した人気のあるモデルであることが証明されている。
### ミルバス
[Milvus](https://milvus.io/)は、機械学習モデルやニューラルネットワークによって生成された埋め込みベクトルを管理するために構築された、クラウドネイティブでオープンソースのベクトルデータベースです。コンピュータビジョン、自然言語処理、計算化学、パーソナライズされたレコメンダーシステムなどのシナリオで広く使用されています。
以下の手順では、Milvusがどのように動作するかを説明します。
1.非構造化データをディープラーニングモデルを用いて特徴ベクトルに変換し、Milvusにインポートする。
2.Milvusは特徴ベクトルを保存し、インデックスを作成する。
3.Milvusは、ユーザーが問い合わせたベクトルと最も類似したベクトルを返す。
図3](https://assets.zilliz.com/p3_00168a4c93.png)
## 配置
これでMilvusベースの映像解析システムについてある程度ご理解いただけたと思います。このシステムは主に以下の図のように2つの部分から構成されている。
- 赤い矢印はデータのインポート処理を示しています。ResNet-50を用いて画像データセットから特徴ベクトルを抽出し、その特徴ベクトルをMilvusにインポートする。
- 黒い矢印は動画解析のプロセスを示す。まず、動画からフレームを抽出し、画像として保存する。次に、YOLOv3を用いて画像中の物体を検出・抽出する。次に、ResNet-50を使って画像から特徴ベクトルを抽出する。最後に、Milvusがオブジェクトの情報を検索し、対応する特徴ベクトルとともに返す。
図4](https://assets.zilliz.com/p4_fdf0a9d93f.png)
詳細は[Milvus Bootcamp: Video Object Detection System](https://github.com/milvus-io/bootcamp/tree/master/solutions/video_similarity_search/object_detection)を参照。
**データインポート
データのインポート方法は簡単です。データを2048次元のベクトルに変換し、Milvusにインポートします。
``python
vector = image_encoder.execute(ファイル名)
エンティティ = [ベクトル]
collection.insert(data=entities)
ビデオ解析
上で紹介したように、ビデオ解析プロセスには、ビデオフレームのキャプチャ、各フレーム内のオブジェクトの検出、オブジェクトからのベクトルの抽出、ユークリッド距離(L2)メトリクスによるベクトルの類似度の計算、およびMilvusを使用した結果の検索が含まれます。
python images = extract_frame(filename, 1, prefix) detector = Detector() run(detector, DATA_PATH) vectors = get_object_vector(image_encoder, DATA_PATH) search_params = {"metric_type":"L2", "params":{"nprobe":10}} results = collection.search(vectors, param=search_params, limit=10)
## 結論
現在、データの80%以上は非構造化データである。AIの急速な発展に伴い、非構造化データを分析するためのディープラーニング・モデルの開発が進んでいる。物体検出や画像処理などの技術は、学術界と産業界の両方で大きなブレークスルーを達成している。これらの技術に後押しされ、より多くのAIプラットフォームが実用的な要件を満たすようになった。
本トピックで取り上げる映像解析システムは、映像コンテンツを迅速に解析できるMilvusで構築されている。
オープンソースのベクトルデータベースであるMilvusは、様々なディープラーニングモデルを用いて抽出された特徴ベクトルをサポートしている。Faiss、NMSLIB、Annoyなどのライブラリと統合されたMilvusは、直感的なAPI群を提供し、シナリオに応じてインデックスタイプを切り替えることができる。さらに、Milvusはスカラーフィルタリングをサポートしており、想起率と検索の柔軟性を高めている。Milvusは、画像処理、コンピュータビジョン、自然言語処理、音声認識、レコメンダーシステム、新薬発見など多くの分野に応用されている。
## 参考文献
[1] A. D. Bagdanov, L. Ballan, M. Bertini, A. Del Bimbo."スポーツビデオデータベースにおける商標のマッチングと検索".Proceedings of the international workshop on Workshop on multimedia information retrieval, ACM, 2007. https://www.researchgate.net/publication/210113141_Trademark_matching_and_retrieval_in_sports_video_databases
[2] J. Kleban, X. Xie, W.-Y.Ma."Spatial pyramid mining for logo detection in natural scenes.".IEEE International Conference, 2008. https://ieeexplore.ieee.org/document/4607625
[3] R. Boia, C. Florea, L. Florea, R. Dogaru."ホモグラフィッククラスグラフを用いた自然画像におけるロゴの位置特定と認識".Machine Vision and Applications 27 (2), 2016. https://link.springer.com/article/10.1007/s00138-015-0741-7
[4] R. Boia, C. Florea, L. Florea."Elliptical asift agglomeration in class prototype for logo detection.".BMVC, 2015. http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=5C87F52DE38AB0C90F8340DFEBB841F7?doi=10.1.1.707.9371&rep=rep1&type=pdf
[5] https://arxiv.org/abs/1804.02767
[6] https://paddlepaddle.org.cn/modelbasedetail/yolov3
[7] https://arxiv.org/abs/1512.03385
読み続けて

Will Amazon S3 Vectors Kill Vector Databases—or Save Them?
AWS S3 Vectors aims for 90% cost savings for vector storage. But will it kill vectordbs like Milvus? A deep dive into costs, limits, and the future of tiered storage.

Zilliz Cloud Delivers Better Performance and Lower Costs with Arm Neoverse-based AWS Graviton
Zilliz Cloud adopts Arm-based AWS Graviton3 CPUs to cut costs, speed up AI vector search, and power billion-scale RAG and semantic search workloads.

Vector Databases vs. NoSQL Databases
Use a vector database for AI-powered similarity search; use NoSQL databases for flexibility, scalability, and diverse non-relational data storage needs.
