近傍探索お試し
spotifyさんが新しく公開した近傍探索ライブラリのvoyagerを使用した類似画像検索を試してみます。
とりあえずパパっと動かしたメモなので詳細な性能検証ではないです。
https://spotify.github.io/voyager/
https://github.com/spotify/voyager
先に結論いろいろ
前提
- 約57万枚の画像を使用
- 画像を768次元の埋め込みベクトルにして利用
結果
- 57万のデータからインデックスを作成 → 約82.7秒 (修正・再計測中)
- クエリとなる画像を渡しtop15を取得 → 約0.23秒
- 検索部分のみの時間です。実際の検索はクエリ画像をエンコードしたりでもう少しかかる
- 実際に検索した例は後述
追記:
ミス発見。
検索時間はもう少し速かったです。上記の0.23秒は近傍探索+必要な情報の付与(テーブルのjoin処理)を行ったものでした。
実際に利用する場合はこんなもん、という程度で見ていただければ。
結論
簡単。速い。すごい。
リソース関連メモ
画像生成周りの情報も残しておきます。
案外、このへんの「個人向けPCでやると実際どのくらいかかるの?」という情報少ないので。
PCスペック
CPU: Core i7-13700
Mem: 64GB
GPU: RTX-4070(VRAM:12GB)
2024年時点の個人向けPCとしては最高スペックではないがそこそこモリモリぐらいの性能でどうなったかの記録です。
画像生成
SDXL-turboを使用します。
SDXLでは1024pxの画像を生成しますが、SDXL-turboは512pxのサイズになります。
そして生成速度はめちゃくちゃ速くなります。
SDXLでは一枚あたり10~20秒程度で画像を生成できましたが、turboでは↓ぐらい。
step数の設定
SDXLは徐々に画像を生成していく動きをしますが、その生成ステップを何回行うか、の数字
A single step is enough to generate high quality images.
SDXLでは20stepぐらい。SDXL-turboでは1ステップで十分とのこと
今回は1~5をランダムに設定(数字を増やすと比例して時間はかかる)しました
生成速度
- 3枚/秒ぐらい =1時間で1万枚ぐらい生成できた
- GPUはVRAMを8~9G程度使用
- 画像の質
- SDXLよりは荒れる印象
ベクトル化
CLIPの画像エンコーダを使用。
20秒/100枚ぐらい処理できました。
voyager
インデックス作成
検索用のインデックスを作成&ファイルに保存をデータ量ごとに比較。
データ量 | 処理時間 | ファイル |
---|---|---|
1k | 0.12s | 2.1M |
10k | 0.49s | 21M |
100k | 9.83s | 207M |
575k | 82.7s | 1.2G |
検索速度
top15の検索を5回やって平均
データ量 | 検索時間 |
---|---|
1k | 0.092s |
10k | 0.097s |
100k | 0.11s |
575k | 0.24s |
検索結果
目視で評価。
対象に入っていない画像をクエリにして検索実験。
上側がクエリ画像、下側に9つ見えているのが検索結果です。
- 近未来っぽい車
うまく車、特に黄色っぽいのが検索できています。
- カラフルなオウム
- 宇宙服
宇宙っぽい雰囲気を捉えた検索になってそう。
- 犬のロボット
検索対象の画像に同じような機械の犬っぽい画像はないです。
そのためロボットっぽいのが検索できるかどうかを見たところうまくできてそう。
- スマホ
スマホ内の絵柄の方が強く反応したパターン
検索対象の画像の中にも似た構図(スマホを持っている画像)もあったが、宇宙っぽいイラストが優先された。