見出し画像

CLIPを試す - OpenAIのZero-shot画像分類器

以下の記事を参考にして書いてます。

How to Try CLIP: OpenAI's Zero-Shot Image Classifier

1. はじめに

今年はじめに、OpenAIはコンピュータービジョンの世界に爆弾を投下しました。2つの新しい画期的なモデルは、巨大なGPT3風のTransformerモデルが画像分野に侵入することを示唆しています。「DALL-E」(テキストプロンプトから画像を生成できるモデル)が多くの注目を集めましたが、この投稿では「CLIP」に焦点を当てます。「CLIP」は間違いなくより重要なZero-shot画像分類器になります。

これまで「画像分類」は、ターゲットクラスを適切に表す数百〜数千、さらには数百万のラベル付き画像のカスタムデータセットを収集し、それを使用して教師あり分類モデル(通常はCNN)を学習していました。このアプローチ(および「物体検出」のような拡張)は、過去10年間でコンピュータービジョンの急速な普及につながりました。

教師あり学習の欠点は、結果のモデルがうまく汎化されないことです。別のドメインの画像を見せた場合、通常はランダム予測と同等になります。これは、モデルが実際に実行する正確なタスクを十分に表す様々なデータをキュレートする必要があることを意味します。

2. OpenAI CLIP の導入

CLIP」(Contrastive Language-Image Pre-training)の導入は、このパラダイムを混乱させました。 これは「Zero-shotモデル」です。つまり、これまでに見たことのない膨大な範囲の物を識別できます。

画像1

CLIPは最高のAIキャプションライターのようなものです。32,768のサンプルキャプションから画像に何が含まれているかを言うことができます。

従来の分類では、ラベルの意味は無視されます(実際、ラベルは単に破棄され、内部で整数に置き換えられることがよくあります)。対照的に、「CLIP」はそのクラスのエンコーディングを作成し、4億を超えるテキストと画像のペアで事前学習させています。これにより、Transformerモデルのテキストから語彙の意味を抽出する機能を活用して、カスタムデータをファインチューニングすることなく、すぐに画像を分類できます。

「クラスキャプションのリスト」を定義するだけで、「CLIP」は、事前の知識に基づいて、特定の画像がどのクラスに分類される可能性が最も高いかを予測します。モデルに「これらのキャプション(説明文)のどれがこの画像に最も一致するか」を尋ねると考えてください。

この投稿では、「CLIP」のパフォーマンスを自分の画像でテストする方法を紹介します。これにより、様々なユースケースで「CLIP」が実際にどの程度うまく機能するかがわかります。「CLIP」は、花の分類タスクに関して、カスタムトレーニングされたResNet分類モデルよりも優れていることがわかりました。また、カメラロールからの写真でキノコの種を特定したり、犬や猫の品種を特定したりするなど、よりあいまいでやりがいのある様々なタスクで、驚くほどうまく機能します。

◎ チュートリアルのリソース
Public flower classification dataset
CLIP benchmarking Colab notebook
CLIP repo
・Corresponding YouTube

3. データセットの準備

CLIP」を試すには、分類したい画像のデータセットを持ってきて、見たいクラスに分割する必要があります。

データセットをまだお持ちでない場合は、「Roboflow」の「パブリックコンピュータビジョンデータセット」をご覧ください。

この投稿では、公開されている「花の分類データセット」で「CLIP」のベンチマークを行います。 独自のデータを使用している場合、Roboflowへのデータのアップロードは簡単で無料です(最大1000枚の画像)。その後、このブログで同じフローをたどることができます。

画像2

この投稿で使用されている花の分類データセットの例。

データセットをアセンブルすると、CLIPベンチマークのColabノートブックに移ります。

4. CLIPの依存関係のインストール

自分のデータでCLIPを試すには、ドライブにノートブックのコピーを作成し、「ランタイム」で「GPU」が選択されていることを確認します(Google Colabは無料のGPUを使用できるようにします)。 次に、CLIPリポジトリのクローンを作成するとともに、いくつかのインストールを行います。

5. Colabへのデータセットのダウンロード

次のステップは、Colabに分類データセットをダウンロードすることです。

画像3

分類データをノートブックにダウンロード。

Roboflowでデータセットを作成した場合、これは、「Generate」を押すことで実現できます。これにより、すべてのテスト画像が、データセット内のクラスごとに画像の個別のサブディレクトリを持つtestフォルダに配置され、モデルのパフォーマンスを大幅に改善または低下させる可能性のある「プロンプトエンジニアリング」を試すことができる「_tokenization.txt」が提供されます。 

また、存在する境界ボックスからテキストによる説明を作成する物体検出データセット用のコンバーターも作成しました。実際に試してみるのは興味深いことです。

さらに、私たちのオープンソースデータセットをCLIP形式で無料でダウンロードできるようにしました。

6. CLIPを使用したクラスラベルの予測

最後のステップは、テスト画像のクラスラベルを予測することです。

「CLIP」は、「画像」と「クラスキャプションのリスト」を入力として受け取ります。「_tokenization.txt」に収まるように、「クラスキャプション」を定義してください。 アルファベット順にソートされた「class_names」と同じ順序になっていることを確認してください。

ノートブックには、テストセット内の各クラスフォルダを反復処理し、関連する画像を予測するコードが含まれています。

7. オントロジーの実験

分類タスクに「CLIP」を使用する場合、分類オントロジーの様々な「クラスキャプション」を試してみると便利です。また、「CLIP」は画像キャプションを区別するように学習されていることを忘れないでください。

花のデータセットで、次のオントロジーを試し、これらの結果を確認しました。

・"daisy" vs "dandelion" --> 46% accuracy (worse than guessing)
・"daisy flower" vs "dandelion flower" --> 64% accuracy
・"picture of a daisy flower" vs "picture of a dandelion flower" --> 97% accuracy

97%の精度は、このデータセットで学習した他の分類モデルよりも高くなっています。

この結果は、「CLIP」に適切なクラス記述を提供することの重要性を示しており、事前学習手順の豊かさを表現しています。これは、従来のバイナリ分類では完全に失われている機能です。OpenAIでは、このプロセスを「プロンプトエンジニアリング」と呼んでいます。

8. スクリプトの反転

「CLIP」には他にも、「クエリ文字列に対する画像のランク付け」や、「画像のユニークさによるソート」など、様々なユースケースが考えられます。

ノートブックには、「image_features」と「text_features」という2つの変数を定義するコードが記載されています。これらの特徴のペアのコサイン類似度は、その意味上の距離を表しており、これまでの経験では、驚くほど正確です。

9. おわりに

「CLIP」のパフォーマンスが期待したほど高くない場合は、教師ありカスタム画像分類モデルの学習を検討することをお勧めします。「CLIP」の詳細については、論文OpenAIのブログ投稿を参照してください。



この記事が気に入ったらサポートをしてみませんか?