見出し画像

Image Similarity

Transformers を使用した画像類似度システムの構築

このノートブックでは、Transformers を使用して画像類似性システムを構築する方法を学びます。クエリ画像と潜在的な候補との類似性を見つけることは、情報検索システム (逆画像検索など) の重要な使用例です。システムが答えようとしているのは、クエリ画像と一連の候補画像が与えられた場合、どの画像がクエリ画像に最も似ているかということだけです。

🤗 データセット ライブラリ

このノートブックは、並列処理をシームレスにサポートするため、データセット ライブラリを活用します。これは、このシステムを構築するときに役立ちます。

任意のモデルとデータセット

ノートブックは ViT ベースのモデル ( nateraw/vit-base-beans ) と特定のデータセット ( Beans ) を使用しますが、視覚モダリティをサポートする他のモデルや他の画像データセットを使用するように簡単に拡張できます。あなたが試すことができるいくつかの注目すべきモデル:

ノートブックに示されているアプローチは、他のモダリティにも拡張できる可能性があります。


始める前に、データセットとトランスフォーマー ライブラリをインストールしましょう。

## 画像類似システムの構築 


このシステムを構築するには、まず 2 つの画像間の類似度を計算する方法を定義する必要があります。広く普及している手法の 1 つは、特定の画像の密な表現 (埋め込み) を計算し、[コサイン類似度メトリック](https://en.wikipedia.org/wiki/Cosine_similarity) を使用して 2 つの画像がどの程度類似しているかを判断することです。 


このチュートリアルでは、「埋め込み」を使用してベクトル空間で画像を表現します。これにより、画像の高次元のピクセル空間 (たとえば 224 x 224 x 3) をかなり低い次元 (たとえば 768) に圧縮する優れた方法が得られます。これを行う主な利点は、後続のステップでの計算時間が短縮されることです。

https://i.ibb.co/mTtdh7F/embeddings.png

![](https://i.ibb.co/mTtdh7F/embeddings.png)


これらのことがまったく意味をなさない場合でも、心配しないでください。これらについては、後ほど詳しく説明します。 


### 埋め込みを計算するための基本モデルのロード


「埋め込み」は、画像の意味情報をエンコードします。画像から埋め込みを計算するには、ベクトル空間で入力画像を表現する方法をある程度理解しているビジョン モデルを使用します。このタイプのモデルは、一般にイメージ エンコーダーとも呼ばれます。


モデルの読み込みには、[`AutoModel` クラス](https://huggingface.co/docs/transformers/model_doc/auto#transformers.AutoModel) を利用します。Hugging Face Hub から互換性のあるモデル チェックポイントを読み込むためのインターフェイスを提供します。モデルとともに、データの前処理のためにモデルに関連付けられたプロセッサもロードします。 

埋め込みを計算するための基本モデルの読み込み

「埋め込み」は、画像の意味情報をエンコードします。画像から埋め込みを計算するには、ベクトル空間で入力画像を表現する方法をある程度理解しているビジョン モデルを使用します。このタイプのモデルは、一般にイメージ エンコーダーとも呼ばれます。
モデルをロードするために、AutoModel クラスを利用します。Hugging Face Hub から互換性のあるモデル チェックポイントを読み込むためのインターフェイスを提供します。モデルとともに、データの前処理のためにモデルに関連付けられたプロセッサもロードします。


この場合、チェックポイントは、「beans」データセットに基づいてVision Transformer ベースのモデルを微調整することによって取得されました。モデルの詳細については、モデル リンクをクリックしてモデル カードを確認してください。

警告は、基になるモデルが「分類子」から何も使用しなかったことを示しています。AutoModelForImageClassification を使用しなかったのはなぜですか?

これは、「AutoModelForImageClassification」が提供する個別のカテゴリではなく、画像の密な表現を取得したいためです。

次に、別の質問が来ます - なぜこのチェックポイントが特にあるのでしょうか?

前述のように、特定のデータセットを使用してシステムを構築しています。そのため、ジェネラリスト モデル (たとえば、ImageNet-1k データセットでトレーニングされたモデルなど) を使用する代わりに、使用されているデータセットで微調整されたモデルを使用することをお勧めします。そうすれば、基になるモデルは入力画像をよりよく理解できます。

埋め込みを計算するためのモデルができたので、クエリを実行するいくつかの候補画像が必要です。

候補画像のデータセットの読み込み

類似の画像を見つけるには、クエリを実行する一連の候補画像が必要です。そのために、 「beans」データセットの「train」分割を使用します。データセットの詳細については、リンクをたどってそのデータセット カードを調べてください。

データセットには 3 つの列 / 機能があります。

次に、今後のユーティリティ用に 2 つの辞書をセットアップします。

  • クラス ラベルを整数にマップする label2id。

  • id2label は label2id の逆を行います。

これらのコンポーネントを使用して、画像類似性システムの構築に進むことができます。これを実証するために、候補画像データセットから 100 個のサンプルを使用して、全体的なランタイムを短くします。


[ ]
num_samples = 100
シード = 42
候補_サブセット = データセット["train"].shuffle(seed=seed).select(range(num_samples))


以下に、同様の画像のフェッチの基礎となるプロセスの概要図を示します。

上記の図を少し分解すると、次のようになります。

  1. 候補画像 (candidate_subset) から埋め込みを抽出し、行列に格納します。

  2. クエリ画像を取得し、その埋め込みを抽出します。

  3. 埋め込み行列 (ステップ 1 で計算) を反復処理し、クエリ埋め込みと現在の候補埋め込みの間の類似度スコアを計算します。通常、候補画像の識別子と類似度スコアの間の対応を維持する辞書のようなマッピングを維持します。

  4. マッピング構造を類似性スコアでソートし、基礎となる識別子を返します。これらの識別子を使用して候補サンプルを取得します。

次のセルでは、上記の手順をコードで実装します。


次に、便宜上、候補画像の識別子を含むリストを作成します。


クエリ画像との類似性スコアを計算するために、すべての候補画像の埋め込みのマトリックスを使用します。画像埋め込みの候補は既に計算されています。次のセルでは、それらをマトリックスにまとめます。

コサイン類似度を使用して、2 つの埋め込みベクトル間の類似度スコアを計算します。次に、それを使用して、与えられたクエリ サンプルから同様の候補サンプルを取得します。

これで、これらのユーティリティをテストすることができます。

クエリ画像を指定すると、同様のラベルを持つ候補画像が取得されたことがわかります。

これで、これらすべてを視覚化できます。

これで、画像の類似性システムが機能するようになりました。しかし実際には、もっと多くの候補画像を扱うことになります。そのため、現在の手順には複数の欠点があります。
埋め込みをそのまま保存すると、特に何百万もの候補画像を処理する場合に、メモリ要件が急速に急増する可能性があります。ただし、この場合、埋め込みは 768-d であり、大規模な体制ではまだ比較的高くなる可能性があります。それらには、検索部分に含まれる後続の計算に直接影響する高次元の埋め込みがあります。そのため、埋め込みの意味を乱すことなく何らかの方法で埋め込みの次元を減らすことができれば、速度と検索品質の間の適切なトレードオフを維持することができます。
したがって、次のセクションでは、ハッシュユーティリティを実装して、画像類似性システムの実行時間を最適化します。

いいなと思ったら応援しよう!