Skip to content

electronicsdiy/DALL-E_Python3_Script

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 

Repository files navigation

つくったもの

OpenAIから公開されたCLIPは、画像ファイルが、指定した(1つ以上の)単語に該当する確率を、指定した単語の数だけ、確率値で出力してくれるツールです。

あらかじめモデル学習させた単語でない未知の単語も扱えます。 これは、__One-shot learning__という技術が裏側で活躍しています。

CLIPに、画像ファイルと(1つ以上の)単語を与えて動かすとき、多くの行数のコードを打ち込む必要があります。そこで、今回は次の書式で、簡単に使えるようにしました。

Terminalで次の1行を入力して、エンターキーを押すと推論処理が走ります。結果は、Terminal(標準出力)に表示されます。

( ラベル名: 1つだけ指定 )

% python3 display_textlabelprob_on_image.py --image_file xxx.jpg 'cat'

( ラベル名: 複数指定 )

% python3 display_textlabelprob_on_image.py --image_file xxx.jpg 'cat' 'dog' 'egg'

使い方

GitHubから資源を取得

% 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 %

( 画像1 )

  • 画像は、取り扱いたい任意の画像ファイルを用意してください。
DALL-E_Python3_Script % ls doraemon.jpg                                                          
doraemon.jpg
DALL-E_Python3_Script % open doraemon.jpg 

( 画像2 )

  • 画像は、取り扱いたい任意の画像ファイルを用意してください。
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()

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages