目標
- ローカル環境でvenvのpython実行環境を用意する、
- clipにて画像を処理する。
環境
- Mac Apple M1 13.3(22E252)
- python3.9.10
- pythonやhomebrewは入っているものとする
手順及び途中で発生したエラーの解決
-
仮想環境を作成する
- python3.9 -m venv myenv
- source myenv/bin/activate
以降はvenv環境内
-
pyTorchとCLIPをインストールする
- `pip install torch torchvision torchaudio
-
pip install clip
注釈: pythonバージョンは3.9を推奨する。3.6, 3.7, 3.8, 3.9に対応。3.10での動作は公式には明示されていないため
-
pythonコードやサンプル画像データの配置
- venv環境の直下にプロジェクトフォルダを任意に作成し、その中にコードを配置する
- ファイル用に、そこにimageフォルダを作成
- ファイルは、コード上では親環境(mac)の絶対パスを教える
image_path = '/環境の絶対パス/myenv/myProject/image/test_image_data.png'
// これでファイルを読み込める
image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)
- pythonを実行する
エラーが発生した場合
- 実行時に次のエラー
AttributeError: module 'clip' has no attribute 'load'
raceback (most recent call last):
File "//myenv/myProject/cliptest.py", line 12, in <module>
model, preprocess = clip.load("ViT-B/32", device=device)
AttributeError: module 'clip' has no attribute 'load'
以下のurlに従い対処
https://github.com/openai/CLIP/issues/329
pip install git+https://github.com/openai/CLIP.git
実行時にSSLエラー
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)
次のurlを参考に対処
https://tektektech.com/python-ssl-certification-verify-failed/
- Macintosh HD > Application > Python 3.9 以下にある
Install Certificates.command
を実行すると自動設定される
実行と出力結果の期待値
(myenv) $ python cliptest.py
100%|███████████████████████████████████████| 338M/338M [00:59<00:00, 5.94MiB/s]
tensor([[1.]])
サンプルコード
import torch
import clip
from PIL import Image
image_path = '/venvを置いてある絶対パス/myenv/myProject/image/test_image_data.png'
# デバイスの指定
device = "cuda" if torch.cuda.is_available() else "cpu"
# CLIPモデルの読み込み
model, preprocess = clip.load("ViT-B/32", device=device)
# 画像の読み込みと前処理
image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)
# テキストの読み込みと前処理
text = clip.tokenize(["a cat on a table"]).to(device)
# 画像とテキストの類似度を計算
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text)
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)
print(similarity)