汎用画像分類モデルのOpenAI CLIPのインストール【Python】

汎用画像分類モデルのOpenAI CLIPのインストール【Python】 データ分析

OpenAI CLIPは、OpenAIが開発した汎用画像分類モデルです。
CLIPには、GPT-2やGPT-3で用いられている技術が応用されています。

そのことにより、未知の画像でも適切に分類・評価することが可能になります。
CLIPは、単なるパターンマッチングではないということです。

本記事の内容

  • OpenAI CLIPとは?
  • OpenAI CLIPのシステム要件
  • OpenAI CLIPのインストール
  • OpenAI CLIPの動作確認

それでは、上記に沿って解説していきます。

OpenAI CLIPとは?

公式ページ
https://openai.com/blog/clip/

CLIPは、汎用画像分類モデルです。
(※正確には、モデルを簡単に呼び出せるライブラリになります)
そのモデルの作成するために、画像と画像を説明するテキストのペア4億組を学習させています。

CLIPを使うと、ゼロショット画像分類が可能になります。
つまり、全く学習を行わずに画像分類ができるのです。

次の画像は、CLIPの仕組みを表しています。

通常の画像分類モデルは、大量のラベル付き画像を用意します。
そして、長時間にわたって学習を行います。

それに対して、CLIPでは画像とテキストの特徴を利用します。
このことにより、CLIPが自然言語処理的な画像処理と言われるのでしょう。

かなりざっくりまとめると、以下のようなイメージになります。

通常の画像分類モデル具体的パターンマッチング
CLIP抽象的予測

通常の画像分類モデルは、量で勝負するイメージです。
対して、CLIPは質で勝負するイメージとなります。

詳細は、CLIP公式ページの説明などをご覧ください。
ここでは、イメージできることを優先にしています。

とにかく、CLIPは汎用画像分類モデルだということです。
そして、汎用的であるからこそ、未知の画像にも対応できます。
抽象化していることの強みと言えるでしょう。

上の画像は、CLIPの汎用性を示したモノです。
ImageNetの画像で学習したIMAGENET RESNET101とCLIPを比較した結果です。

RESNET101は、ImageNet以外の画像は上手く評価できません。
しかし、CLIPはどんなタイプの画像セットでも適切に評価しています。
CLIPの本領発揮というところでしょう。

以上、OpenAI CLIPに関する説明でした。
次は、OpenAI CLIPのシステム要件を確認しましょう。

OpenAI CLIPのシステム要件

現時点(2021年8月)でのOpenAI CLIPの最新バージョンは、1.0となります。
このバージョンは、2021年1月5日にリリースされています。
それ以降は、目立った動きがありません。

サポートOSに関しては、明確に記載はありません。
少なくとも、記載を見つけることができませんでした。

ただ、以下を含むクロスプラットフォーム対応のはずです。

  • Windows
  • macOS
  • Linux

WindowsとUbuntuは、実際に動作確認が取れました。
Ubuntu(Linux)で動いて、macOSで動かない理由もありません。

また、Pythonのバージョンに関しても情報がありません。
ただ、リリースされたのが今年です。
それであれば、Python 3.6以降と考えた方がよいでしょう。

あとは、PyTorhですね。
公式(GitHub上のページ)では、PyTorch 1.7.1が指定されています。

しかし、PyTorch 1.7.1である必要はありません。
現時点(2021年8月時点)で最新版となるPyTorch 1.9.0でも問題なく動きます。

PyTorchのインストールについては、次の記事で説明しています。

以上、OpenAI CLIPのシステム要件を説明しました。
次は、OpenAI CLIPをインストールしていきます。

OpenAI CLIPのインストール

OpenAI CLIPのGitHubページ
https://github.com/openai/CLIP

上記ページでは、以下の手順が記載されています。

$ conda install --yes -c pytorch pytorch=1.7.1 torchvision cudatoolkit=11.0 
$ pip install ftfy regex tqdm 
$ pip install git+https://github.com/openai/CLIP.git

Anaconda(conndaコマンド)前提です。
でも、Anacondaもconndaコマンドも使う必要はありません。

pipコマンドだけで、OpenAI CLIPをインストールできます。
インストールを実行する前に、現状のインストール済みパッケージを確認しておきます。

>pip list 
Package           Version 
----------------- ------------ 
pip               21.2.4 
setuptools        57.4.0 

次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip setuptools

では、OpenAI CLIPのインストールを行いましょう。
実際に私が利用したコマンドは、以下。
(※PyTorchはGPU版をインストールしています)

pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio===0.9.0 -f https://download.pytorch.org/whl/torch_stable.html 
pip install ftfy regex tqdm
pip install git+https://github.com/openai/CLIP.git

なお、gitコマンドを利用できない場合はインストールしましょう。
gitコマンドは何かと便利です。
WindowsへのGitのインストールは、次の記事で説明しています。

インストールが完了したら、パッケージを確認しておきましょう。

>pip list 
Package           Version 
----------------- ------------ 
clip              1.0 
colorama          0.4.4 
ftfy              6.0.3 
numpy             1.21.2 
Pillow            8.3.1 
pip               21.2.4 
regex             2021.8.21 
setuptools        57.4.0 
torch             1.9.0+cu111 
torchaudio        0.9.0 
torchvision       0.10.0+cu111 
tqdm              4.62.1 
typing-extensions 3.10.0.0 
wcwidth           0.2.5

以上、OpenAI CLIPのインストールについて説明しました。
最後は、OpenAI CLIPの動作確認を行います。

OpenAI CLIPの動作確認

OpenAI CLIPの動作確認は、次のコードで行います。

import torch 
import clip 
from PIL import Image 
# 画像 
IMG_PATH = "dog.jpg" 
# テキスト 
TEXT_LIST = ["wolf", "dog", "cat"] 
# 利用デバイスの設定 
device = "cuda" if torch.cuda.is_available() else "cpu" 
# モデルの読み込み 
model, preprocess = clip.load("ViT-B/32", device=device) 
# 画像の読み込み、テキストの用意 
image = preprocess(Image.open(IMG_PATH)).unsqueeze(0).to(device) 
text = clip.tokenize(TEXT_LIST).to(device) 
with torch.no_grad(): 
    # 画像、テキストのエンコード 
    image_features = model.encode_image(image) 
    text_features = model.encode_text(text) 
    # 推論 
    logits_per_image, logits_per_text = model(image, text) 
    probs = logits_per_image.softmax(dim=-1).cpu().numpy() 
# 類似率の出力(テキスト毎に類似率を表示) 
for i in range(len(TEXT_LIST)): 
    rate = probs[0][i] 
    print(TEXT_LIST[i] + "---" + str(rate))

プログラムで行う処理を確認します。
事前に、次の画像(dog.jpg)を用意しています。

そして、この画像とテキストとの類似率(一致率)を取得して終わります。
テキストは、リスト形式で設定します。

# テキスト 
TEXT_LIST = ["wolf", "dog", "cat"]

コードを実行した結果は、以下。

wolf---0.001431 
dog---0.998 
cat---0.0005693

「dog」である確率はかなり高いようです。
そして、「cat」よりは「wolf」の方が類似率は高くなっています。

以上、OpenAI CLIPの動作確認を説明しました。

タイトルとURLをコピーしました