OpenAIから公開されたCLIPは、画像ファイルが、指定した(1つ以上の)単語に該当する確率を、指定した単語の数だけ、確率値で出力してくれるツールです。
あらかじめモデル学習させた単語でない未知の単語も扱えます。 これは、__One-shot learning__という技術が裏側で活躍しています。
CLIPに、画像ファイルと(1つ以上の)単語を与えて動かすとき、多くの行数のコードを打ち込む必要があります。そこで、今回は次の書式で、簡単に使えるようにしました。
Terminalで次の1行を入力して、エンターキーを押すと推論処理が走ります。結果は、Terminal(標準出力)に表示されます。
% python3 display_textlabelprob_on_image.py --image_file xxx.jpg 'cat'
% python3 display_textlabelprob_on_image.py --image_file xxx.jpg 'cat' 'dog' 'egg'
% git clone
% cd DALL-E_Python3_Script
DALL-E_Python3_Script % ls
README.md display_textlabelprob_on_image.py
DALL-E_Python3_Script %
DALL-E_Python3_Script % ls
README.md doraemon.jpg
display_textlabelprob_on_image.py nozomi.jpg
DALL-E_Python3_Script %
- 画像は、取り扱いたい任意の画像ファイルを用意してください。
DALL-E_Python3_Script % ls doraemon.jpg
doraemon.jpg
DALL-E_Python3_Script % open doraemon.jpg
- 画像は、取り扱いたい任意の画像ファイルを用意してください。
DALL-E_Python3_Script % open nozomi.jpg
DALL-E_Python3_Script %
- コマンドライン引数:第1引数に、画像ファイルを相対パスで渡す
- コマンドライン引数:第2引数以降に、1つ以上のラベルを文字列で与える
DALL-E_Python3_Script % python3 display_textlabelprob_on_image.py --image_file doraemon.jpg 'cat' 'dog'
次の画像を解析します。: doraemon.jpg
次のラベルの該当確率を推定します。 : ['cat', 'dog']
ラベル名: cat 該当確率: 91.0%
ラベル名: dog 該当確率: 9.0%
DALL-E_Python3_Script %
DALL-E_Python3_Script % python3 display_textlabelprob_on_image.py --image_file doraemon.jpg 'cat' 'dog' 'human' 'pig' '
raccoon dog' 'house' 'robot' 'sky'
次の画像を解析します。: doraemon.jpg
次のラベルの該当確率を推定します。 : ['cat', 'dog', 'human', 'pig', '\nraccoon dog', 'house', 'robot', 'sky']
ラベル名: cat 該当確率: 52.0%
ラベル名: dog 該当確率: 5.0%
ラベル名: human 該当確率: 14.000000000000002%
ラベル名: pig 該当確率: 3.0%
ラベル名:
raccoon dog 該当確率: 1.0%
ラベル名: house 該当確率: 1.0%
ラベル名: robot 該当確率: 18.0%
DALL-E_Python3_Script %
DALL-E_Python3_Script % python3 display_textlabelprob_on_image.py --image_file nozomi.jpg 'cat' 'dog' 'human' 'woman' 'girl'
次の画像を解析します。: nozomi.jpg
次のラベルの該当確率を推定します。 : ['cat', 'dog', 'human', 'woman', 'girl']
ラベル名: cat 該当確率: 0.0%
ラベル名: dog 該当確率: 0.0%
ラベル名: human 該当確率: 4.0%
ラベル名: woman 該当確率: 48.0%
ラベル名: girl 該当確率: 48.0%
DALL-E_Python3_Script %
DALL-E_Python3_Script % python3 display_textlabelprob_on_image.py --image_file nozomi.jpg 'cute' 'beautiful' 'elegant' 'awful' 'boyish' 'big' 'small'
次の画像を解析します。: nozomi.jpg
次のラベルの該当確率を推定します。 : ['cute', 'beautiful', 'elegant', 'awful', 'boyish', 'big', 'small']
ラベル名: cute 該当確率: 15.0%
ラベル名: beautiful 該当確率: 19.0%
ラベル名: elegant 該当確率: 61.0%
ラベル名: awful 該当確率: 0.0%
ラベル名: boyish 該当確率: 1.0%
ラベル名: big 該当確率: 1.0%
ラベル名: small 該当確率: 4.0%
DALL-E_Python3_Script %
DALL-E_Python3_Script %python3 display_textlabelprob_on_image.py --image_file nozomi.jpg 'cute' 'awful' 'boyish' 'big' 'small'
次の画像を解析します。: nozomi.jpg
次のラベルの該当確率を推定します。 : ['cute', 'awful', 'boyish', 'big', 'small']
ラベル名: cute 該当確率: 72.0%
ラベル名: awful 該当確率: 1.0%
ラベル名: boyish 該当確率: 6.0%
ラベル名: big 該当確率: 3.0%
ラベル名: small 該当確率: 18.0%
DALL-E_Python3_Script %
import argparse
from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPModel
from pprint import pprint
parser = argparse.ArgumentParser(description='') #
parser.add_argument('--image_file')
parser.add_argument('args', nargs=argparse.REMAINDER)
args = parser.parse_args()
image_file = args.image_file
token_list = args.args
def get_textlabel_prob_on_image(text_label_list, image_file):
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
image = Image.open(image_file)
inputs = processor(text=text_label_list, images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1)
return probs
def main():
prob_list = get_textlabel_prob_on_image(token_list , image_file)
#prob_list = get_textlabel_prob_on_image(["cat", "dog"], "doraemon.jpg")
print("次の画像を解析します。: ", image_file)
print("次のラベルの該当確率を推定します。 : ", token_list)
#print(prob_list.tolist())
tmp_double_list = prob_list.tolist() # 結果は二重リスト
probability_list = tmp_double_list[0]
probability_list = [round(prob, 2) for prob in probability_list]
#print(probability_list)
output_list = ["ラベル名: {label} 該当確率: {prob}".format(label=label, prob=str(prob*100)+"%") for label, prob in zip(token_list, probability_list)]
for label_prob_str in output_list:
print(label_prob_str)
if __name__ == "__main__":
main()
