Hugging Face Datasets と Transformers を用いた画像類似性
Hugging Face は Transformers と Datasets ライブラリを使用して画像類似性システムを構築するための技術ガイドを提供しています。このシステムは、クエリ画像が与えられたときに候補セットから最も類似した画像を特定できるようにし、リバース画像検索のような情報検索システムの核心機能を実現します。
埋め込みによる画像類似性の定義
画像類似性は、高次元のピクセルデータを埋め込みと呼ばれる密な表現に変換することで実現します。このプロセスは画像空間(例: 224 x 224 x 3 ピクセル)を低次元のベクトル空間(例: 768 次元)に圧縮し、検索時の計算時間を大幅に削減します。
2 つの画像間の類似性を判断するために、システムはそれぞれの埋め込み間の 余弦類似度指標 を計算します。余弦類似度スコアが高いほど、ベクトル空間上で画像はより類似しているとみなされます。
画像エンコーダで埋め込みを計算する
これらの埋め込みを生成するには、画像エンコーダとして機能するビジョンモデルが必要です。Hugging Face は、Hugging Face Hub から互換性のあるチェックポイントをロードするために AutoModel クラスの使用を推奨しています。
モデル選択
提供された例では、システムは nateraw/vit-base-beans を使用しています。これは beans データセットでファインチューニングされた Vision Transformer (ViT) モデルです。ガイドではいくつかの重要な技術的選択肢が強調されています:
AutoModelvsAutoModelForImageClassification: 目標が離散的なカテゴリラベルではなく密な表現(埋め込み)を取得することなので、AutoModelが使用されます。- Domain-Specific Fine-tuning:
beansのような特定データセットでファインチューニングされたモデルを使用することで、ImageNet-1k で訓練された汎用モデルを使用するよりも、理解度と検索性能が一般的に向上します。 - Self-Supervised Learning: ガイドでは、自己教師あり事前学習で得られたチェックポイントも、優れた検索性能を示すことができると指摘しています。
代替モデル
例では ViT を使用していますが、システムは Transformers ライブラリで利用可能な他のビジョンモデルにも拡張できます。例えば:
- Swin Transformer
- ConvNeXT
- RegNet
画像類似性ワークフロー
類似画像を見つけるプロセスは、4 段階のパイプラインに従います:
- Candidate Embedding Extraction: 候補画像のサブセットから埋め込みを抽出し、行列に保存します。
- Query Embedding Extraction: クエリ画像を同じ画像エンコーダで処理し、埋め込みを生成します。
- Similarity Scoring: システムは候補埋め込み行列を走査し、クエリ埋め込みと各候補との余弦類似度を計算します。
- Ranking: 結果を類似度スコアでソートし、上位 k 個の識別子を返して最も類似した画像を取得します。
これを効率的に実装するために、datasets ライブラリの map() 関数を使用して、候補データセット全体で埋め込みを並列計算します。
大規模データセットへのスケーリング
数百万枚の画像を扱う大規模な本番環境では、生の 768 次元埋め込みを保存するとメモリと計算のボトルネックが生じます。Hugging Face はこれを最適化するための主な方法を 2 つ提案しています:
次元削減
埋め込みの意味的な情報を失わずに次元を削減することで、速度と検索品質のバランスを取ることができます。この目的のために ランダム射影 や 局所感度ハッシュ (LSH) といった手法が推奨されます。
FAISS との統合
高性能な類似検索のために、datasets ライブラリは FAISS(Facebook AI Similarity Search)との直接統合を提供しています。この統合によりインデックス作成が簡素化されます:
add_faiss_index(): このメソッドはデータセット内の特定の埋め込みカラムに対して密なインデックスを構築します。get_nearest_examples(): このメソッドはクエリ埋め込みが与えられたときに、最も近いサンプルを効率的に取得できるようにします。
この統合により、埋め込み行列を手動で走査する必要がなくなり、低レイテンシーを保ちながらシステムを大規模データセットにスケールさせることができます。