画像からテキストを生成してみた
画像からテキストを生成してみた
さて、今回は画像からテキストを生成してみようと思います。画像には CC0 のものとそうでないものが混在したため、ここに貼付けせず、リンクで表記しています。
モチベーション
この作業を行ったモチベーションは Stable Diffusion で遊ぶのは良いが、逆生成(img to prompt)はできないものかと思い実行しました。結果は散々なものです。ここには画像ありませんが、気になった方は読み進めてもらえると嬉しいです。
img2text の中身
ほぼ Hugging Face にあったコードを利用させていただいています。Link
修正したところは import の部分です。いくつか定義されていないライブラリがあったので、そちらを修正しました。
モデルの中身としては言語関連は gpt2 をベースに作られているようです。
from transformers import VisionEncoderDecoderModel, ViTFeatureExtractor, AutoTokenizer
import torch # Add
from PIL import Image # Add
model = VisionEncoderDecoderModel.from_pretrained("nlpconnect/vit-gpt2-image-captioning")
feature_extractor = ViTFeatureExtractor.from_pretrained("nlpconnect/vit-gpt2-image-captioning")
tokenizer = AutoTokenizer.from_pretrained("nlpconnect/vit-gpt2-image-captioning")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
max_length = 16
num_beams = 4
gen_kwargs = {"max_length": max_length, "num_beams": num_beams}
def predict_step(image_paths):
images = []
for image_path in image_paths:
i_image = Image.open(image_path)
if i_image.mode != "RGB":
i_image = i_image.convert(mode="RGB")
images.append(i_image)
pixel_values = feature_extractor(images=images, return_tensors="pt").pixel_values
pixel_values = pixel_values.to(device)
output_ids = model.generate(pixel_values, **gen_kwargs)
preds = tokenizer.batch_decode(output_ids, skip_special_tokens=True)
preds = [pred.strip() for pred in preds]
return preds
predict_step(["your/image/path.jpg", "your/image/path.png","etc."]) # change
img2text トライアル -- 動物編 --
猫の画像
A: 'a cat sitting in the grass with a flower in its mouth'
イメージとほぼ同じでした。
A: 'a brown and white striped animal is swimming in the water'
猫じゃなくてごめんなさい。でもトラとは言ってくれないのね。動物が水の中を泳いでいるというという認識はしているようです。
A: 'a small white cat standing on top of a rug'
完璧です。惜しいのはしっぽが黒いことが抜けている点でしょうか。あと、細かい説明などは端折る傾向にありますね。
A: 'a white cat laying on top of a white blanket'
いい感じですが、顔を洗っているとは書いてくれない。行動についてはあまり明言できないのかもしれません。
A: 'a cat laying on the ground next to a wall'
そんな感じです。寝ているのですが、上記と同じく行動を言語化できていません。
犬の画像
A: 'a brown and white dog laying in the grass'
おおよそ合っています。色の表現が絶妙ですね。
A: 'a large group of dogs standing together in a field'
たくさんの犬が写っていても問題なさそうです。
狐の画像
犬と間違えないかな?と思ってやってみました。
A: 'a brown and white dog standing on top of a lush green field'
やっぱり間違えていますね。人間でも間違えることがあるかもしれません。
うさぎの画像
特徴があまりない難しいものと簡単なもので試してみます。
A: 'a cat laying in the grass next to a stuffed animal'
耳が短いので間違えますね。
A: 'a brown and white dog sitting in a grassy field'
耳がしっかりとあって、うさぎっぽいと思っていましたが、犬と間違えていました。
動物のまとめ
犬や猫は判別ができるようですが、他の動物は難しいですね。
img2text トライアル -- 2D-image 編 --
さて、ここからは 2D の世界です。おもに Pixiv で公開されている画像に対して実行しています。著者の好み全開ですので、あしからず。
銀髪の女性
A: 'a woman in a red dress with an apple in her mouth'
銀髪かどうかは判定外、服装も青いので間違えている。りんご飴は百歩譲って合格点といったところか。精度はあまり良くない様子。
バイオリンを奏でる女性
A: 'a woman sitting on top of a wooden bench'
シチュエーションは正しいです。ただ、それ以外の情報が欠如しています。
うさみみの女の子
A: 'a woman sitting on a bed with a lot of makeup on her face'
少なくともベッドではなさそうです。コスメに囲まれているのは正しいのですが、彼女の顔に対してではないと思うのです。
2D-image まとめ
思ったよりも精度出ないですね。チューニングや必要な追加学習があるのだと思うのですが、少し残念でした。
まとめ
ここの総評は nlpconnect/vit-gpt2-image-captioning をそのまま使用した場合に付いて記載しており、そこから派生するものについては議論の対象外としています。
img2text で何をさせたいのか、それ次第ではチューニングや追加学習といった作業をせずともうまく動くと思います。しかし、画像から Stable Diffusion の Prompt を生成させるといった作業には使えません。少なくとも、何かしらの追加作業が必要でしょう。
いいねで励ましていただければ他のモデルもチャレンジしてみます。
Discussion