NTTドコモR&Dの技術ブログです。

Stable Diffusion を使って社内でAIお絵描きクイズをしたら,大喜利大会になってしまった話

今年もこんにちは。ドコモの澤山です。 本記事は,ドコモアドベントカレンダー2日目の記事になります。 本記事では,テキストからの画像生成を用い,画像を当てるクイズとその採点をおこないます。

※記事は 2022/11 時点の内容です。

テキストからの画像生成の流行

今年の8月にテキストから画像を生成する技術の一つである, Stable Diffusion が公開され,研究者から一般人に至るまで,美しい画像を生成するために"呪文"を唱えるようになりました。 3ヶ月が経過した今でも,それらのモデルの亜種やアプリケーションが続々と登場しています。 Stable Diffusion で用いられているであろう技術は,ざっくり言うと,「入力されたテキストと画像がどの程度意味的に類似ているかを計算でき,ベクトルを生成するモデル」と,「画像を表現するベクトル空間上で,ノイズまみれの画像から綺麗な画像のある座標までたどり着く過程(ノイズを除去する過程)を学習する拡散モデル」から成り立っています。

AIお絵描きクイズをつくろう

多くの方は,この技術を自分の生み出したい理想の絵を生成させるために利用されているかと思います。 一方,僕はこう思いました。お絵描きクイズのAI版として使ったら面白そう,と。 お絵描きクイズとは,あるお題について,人が描いた絵が何の絵なのかを当てるゲームです。 ということで,お題を考えてAIに画像を出力させ,描かせた画像を人に見せて,それがなんの画像かを当てる"AIお絵描きクイズ"を作ってみました。

AIお絵描きクイズのアーキテクチャ

AIお絵描きクイズの採点の流れ

お題から生成された画像を人間に見せて,入力したお題の文を予想して(回答して)もらい,お題と回答文の類似度から,回答文を採点しました。手順は以下です。

  • 手順1 テキスト(お題)からの画像生成
  • 手順2 生成された画像について回答(人間)
  • 手順3 回答の採点

実現にあたって利用したライブラリ・環境

  • 画像生成は,Hugging Face の Diffusers ライブラリ を利用しました。
  • スコア採点は,BERTScore を利用しました。
  • Google Colab 上で実行しており,こちらの記事を参考にさせていただきました。 ありがとうございます!

事前準備

# Hugginface アカウントの作成
(省略)

# 必要パッケージのインストール
pip install diffusers transformers bert-score

# 日本語モデル利用に必要なライブラリのインストール
pip install git+https://github.com/rinnakk/japanese-stable-diffusion

# huggingface-cli のログイン
作成したHuggingface アカウントで生成したトークン認証が必要

テキスト(お題)からの画像生成

import torch
import accelerate # 追加
from torch import autocast
from diffusers import LMSDiscreteScheduler
from japanese_stable_diffusion import JapaneseStableDiffusionPipeline

model_id = "rinna/japanese-stable-diffusion"
device = "cuda"
# Use the K-LMS scheduler here instead
scheduler = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", num_train_timesteps=1000)
pipe = JapaneseStableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, use_auth_token=True) # huggingface-cli login してない場合は,トークンを入力する
pipe = pipe.to(device)

prompt = "お題"
with autocast("cuda"):
    image = pipe(prompt, guidance_scale=7.5)["images"][0] # サンプルコードだと "sample" になっています。こちらを "images" に修正しました。

image.save("{}".png".format(prompt)) # 変更

生成された画像について回答(人間)

  • 生成された画像が,どんなお題から生成されたか,回答を募集しました。

回答の採点

  • BERTScore を用いて文と文の類似度を計算し,スコアを10点満点に正規化して利用しました。
  • 日本語専用のモデルは対応していないため,今回はマルチリンガルモデルを利用しています。
from bert_score import score
prompts = ["お題"] # お題(ユーザ回答の数だけ必要)
answers = ["回答"] # ユーザ回答

pred, recall, f_score = score(prompts, answers, lang="others", verbose=True) # 日本語モデルは対応していないため,lang="other"(bert-base-multilingual-cased) を設定

# ユーザ回答を10点満点で採点
for answer, score in zip(answers, f_score):
  print("回答:{}, 点数:{}/10".format(answer, round(score.item(), 2)*10)

遊んでみた

今回は,僕が考えたお題を,まわりの人たちに出題し,得られた回答を採点してみました。 以下の画像はどんなお題から生成された画像でしょうか。みなさんも予想してみてください!

この画像,なーんだ?(その1)

チームメンバーの回答と採点結果

回答 点数(10点満点)
「こっちを向いてよ!と言って振り向いてくれたのはだた一羽お前だけだった」 5.6
iParrot 6.3
ポインコ、お前だったのか……。いつもdポイントをくれたのはー。 6.3
地鶏が自撮りしてみた 6.4
飼い主の真似をして顔認証が拒否され困っているインコ 6.4
自我を持ってスマホから飛び出したTwitter 6.4
dポイントクラブTwitterアカウントの中の人(鳥) 6.5
インコが電話したい 6.6
リアルポインコ 6.7
ポインコスマホスタンド 6.7
スマホ依存症インコ 6.8
顔認証をするポインコ 6.8
インコのネットサーフィン 7.1
スマホを巣にしたポインコ 7.1
スマホで電話するポインコ 7.1
スマホでテレワーク中のインコ 7.3
スマホで遊ぶインコ 7.4
スマホとインコ 7.5
スマートフォンで遊んでいるところを見つかったインコ 7.8
スマホ乗りの黄色いインコ 8.1
スマートフォンの上からこちらを見つめる黄色いインコ 8.2

お題
スマートフォンと黄色いインコ

この画像,なーんだ?(その2)

チームメンバーの回答と採点結果

回答 点数(10点満点)
「江戸にもステンドグラスがあるのかって?あ、もしかして江戸舐めてる??」 6.4
絵戸(絵画+江戸) 6.5
フィンセント・ファン・ゴッホ「山王パークタワー / Sanno Park Tower」(1889年ごろ) 6.7
後先考えずに建築した観光スポット 6.8
江戸時代の紅葉が色づく夜に城下町の料亭の側を歩く人々の油絵 6.8
絵画「秋の長屋」 6.8
秋のオフィス帰り 6.8
11月は寒くて風邪ひいた「ゴッホン」 7.0
寂しい町 7.1
ゴッホ、浮世絵、代表作 7.3
ゴッホ 江戸時代 7.5
ゴッホ 京都 7.7
紅葉にゴッホを添えて 7.9
紅葉(ゴッホ風の作画) 8.0
ゴッホの書いた東海道五十三次 8.1
ゴッホが小三の時に書いた絵 8.4
ゴッホが描いた川沿いの長屋 8.8

お題
ゴッホが描いた紅葉

この画像,なーんだ?(その3)

チームメンバーの回答と採点結果

回答 点数(10点満点)
冬が来た。春はまだ遠いだろうか。 6.4
全人類が引きこもった日 6.6
「12月25日の朝にホテルから外を眺めてみた」 6.6
main street coverd with snow, tokyo, landscape 6.7
高層ビルから見下ろす積雪した都会の通り 6.8
札幌テレビ塔目線 6.8
さっぽろ雪まつり,雪少なめ 7.0
札幌風過疎通り 7.1
「冬の中目黒駅もどき」 7.3
冬の都市部を見下ろしてみた 7.3
雪の街と赤珊瑚のコラボin東京 7.3
雪不足の時の札幌 7.4
札幌大通公園 7.4
大通公園の秋から冬への移り変わり 7.5
溜池山王の初雪 7.6
秋の東京に大雪が降った 7.7
日本最北の街の朝 7.8
札幌の初雪 8.1
冬の街 8.1
札幌 冬景色 8.7

お題
東京の冬景色

採点してみた感想

  • 回答にバラエティがあって,出題側も楽しませてもらいました。
  • 今回の採点では,BERTScoreのために用いたモデルが,bert-base-multilingual-cased  だったためか,比較する文が日本語であるだけで少し高い点数になっているようにみえます。
  • 改良するとしたら,日本語文でのモデルのファインチューニングか,日本語のBERTモデルを用いて,BERTScore を計算するなどになるかと思います。

まとめ

  • AIでお絵描きクイズをしました。
  • 何度か画像生成を試してみましたが,期待するお題の画像を生成するには,入力文に"コツ"が必要だとわかり,プロンプト指定の難しさを実感できる,いい機会になりました。
  • 回答を募集した結果,大喜利大会になってしまいました…笑

参考文献・引用