Hugging Face datasets による画像検索

Hugging Face は、datasets ライブラリ、OpenAI の CLIP モデル、および FAISS ライブラリを使用して、画像検索アプリケーションを構築するためのワークフローを実演しました。このアプローチにより、ユーザーはテキストプロンプトと画像を共通の埋め込み空間にエンコードすることで、意味的な画像検索を実行できます。

datasets による効率的な画像データ処理

datasets ライブラリは、画像データの取り込みと処理を簡素化する専用の Image フィーチャー型を提供します。この機能は、絶対ファイルパス、バイトとパスを含む辞書、NumPy 配列、および PIL 画像オブジェクトを含む、複数の入力形式をサポートしています。

データセット作成を効率化するために、ImageFolder ローダーを使用すると、標準的なフォルダ構造で整理された画像データセットを直接ロードできます。例えば、British Library の "Digitised Books - Images identified as Embellishments. c. 1510 - c. 1900" データセットは、load_dataset("imagefolder", ...) を使用して zip ファイルから直接ロードできます。

ワークフローのポータビリティのために Hugging Face Hub を活用する

push_to_hub メソッドにより、開発者は処理済みのデータセットを Hugging Face Hub にアップロードできます。この機能は、ローカルのノートパソコンでデータ準備を開始し、Google Colab で GPU 加速された埋め込み生成を実行するといった、異なるコンピューティング環境間でワークロードを移動させるために不可欠です。

embed_external_files=True(デフォルトの動作)を設定することで、画像は Hub 上のデータセットに直接埋め込まれ、生のソースファイルを再ダウンロードすることなく、異なるセッション間でデータセットのポータビリティとアクセシビリティが確保されます。

CLIP と FAISS による意味的検索の実装

画像検索を可能にするには、画像を意味的な意味を捉える高密度ベクトル(埋め込み)に変換する必要があります。

CLIP による埋め込み生成

Hugging Face は、sentence_transformers ライブラリを使用して clip-ViT-B-32 モデルを実装しています。CLIP (Contrastive Language-Image Pre-training) は、画像とテキストの共通表現を学習するように設計されており、これはテキストプロンプトと対応する画像がベクトル空間内の同様の場所へマッピングされることを意味します。

FAISS による効率的な検索

埋め込みが生成され、データセットの列として追加された後、datasets ライブラリの add_faiss_index メソッドを使用して FAISS (Facebook AI Similarity Search) インデックスを作成します。このインデックスは、大規模な高密度ベクトルのコレクション全体に対して、高性能な類似性検索を可能にします。

get_nearest_examples メソッドを使用すると、システムはテキストプロンプトを受け取り、同じ CLIP モデルを使用してそれをエンコードし、ベクトル空間内でプロンプトの埋め込みに最も近い埋め込みを持つ画像を取得できます。

デプロイメントの検討事項と倫理的制約

Gradio アプリを使用してこの機能を検索可能なデモとしてラップすることは可能ですが、Hugging Face は CLIP ベースの検索ツールのデプロイメントに関して、重要な注意点を強調しています。

  • Model Scope: CLIP モデルカードには、デプロイされたユースケース(商用またはその他)は現在スコープ外であることを明記しています。非デプロイ環境でのユースケースは、固定されたクラス分類学(taxonomy)に対する徹底的なドメイン内テストなしでは推奨されません。
  • Performance Variability: CLIP の性能は、異なるクラス分類学(taxonomy)の間で大きく異なる可能性があるため、、無制限のデプロイメントは潜在的に有害となる可能性があります。
  • Dataset Bias: 歴史的なデータセット(19 世紀の書籍の挿絵など)を使用する場合、画像が植民地主義的な態度や特定のグループに対する否定的な表現を反映しているリスクがあります。このようなデータを任意のテキストプロンプトと組み合わせると、問題のある出力につながる可能性があります。

Sources

関連