見出し画像

AI生成画像の美しさをAIに評価させてみた

 最近、次々と新しい画像生成モデルが登場してくるので、どのモデルが高品質な画像を生成できるのか評価する方法はないかと頭を悩ませていたところ、画像の美しさを評価するAIがあると聞いたので調べてみました。

 すると、Stable DiffusionやGoogleのImagenに画像データセットを提供しているドイツの非営利団体のLAIONAesthetics Predictorという画像の美しさを評価するAIを公開していることが分かりました。

 そこで、今回、いろいろな画像生成モデルで生成した画像をこのAIに評価させてみることにしました。

LAION-Aesthetics (Aesthetics Predictorによって抽出された高品質画像)

1.LAION Aesthetics Predictor

LAION (Large-scale Artificial Intelligence Open Network)は、大規模な機械学習モデル、データセット及び関連コードを一般に公開することを目的としたドイツの非営利団体です。
 LAIONは、Webからスクレイピングした画像とキャプションの大規模なデータセットを公開しており、画像生成AIのStable DiffusionImagenもこのデータセットをモデルの学習に利用していることで有名です。

 このLAIONが大規模な画像データセットから高品質の画像を抽出するために開発した、生成画像が人間の美的感覚にどの程度マッチしているかを予測するAIがAesthetics Predictorです。

 まず、最初のAesthetics Predictor V1では、Stable Diffusionなどが生成した画像とプロンプトのデータセット(SACデータセット)中の評価済みの5,000ペアを使用した線形モデルの学習から始め、なかなか良い結果が認められました。
 そこで、次に1から10までのスコアで評価済みの17.6万ペアのSACデータセット、1.5万枚のロゴ画像とテキストのペア及び25万枚の写真を使用して、様々な多層パーセプトロン(MLP)の学習を行いました。その結果、CLIP ViT/14の一番上に単純な線形モデルを乗せる手法が最も良い結果を生むということが分かり、このモデルをAesthetics Predictor V2と名付けました。
 なお、Stable Diffuaion V1は、58億枚の画像やテキストからなるLAION-5B中のスコアが5以上のサブセットを使用してモデルを学習しました。


2.Aesthetics Predictor V2の実行コードと使用方法

 Aesthetics Predictor V2を使用するためのコードは以下のとおりです。

!pip install git+https://github.com/openai/CLIP.git
from pathlib import Path
state_name = "sac+logos+ava1-l14-linearMSE.pth"
if not Path(state_name).exists():
    url = f"https://github.com/christophschuhmann/improved-aesthetic-predictor/blob/main/{state_name}?raw=true"
    import requests
    r = requests.get(url)
    with open(state_name, "wb"as f:
        f.write(r.content)

import torch
import torch.nn as nn
import torch.nn.functional as F
class AestheticPredictor(nn.Module):
    def __init__(self, input_size):
        super().__init__()
        self.input_size = input_size
        self.layers = nn.Sequential(
            nn.Linear(self.input_size, 1024),
            nn.Dropout(0.2),
            nn.Linear(1024128),
            nn.Dropout(0.2),
            nn.Linear(12864),
            nn.Dropout(0.1),
            nn.Linear(6416),
            nn.Linear(161)
        )
    def forward(self, x):
        return self.layers(x)
device = "cuda" if torch.cuda.is_available() else "cpu"
pt_state = torch.load(state_name)
predictor = AestheticPredictor(768)
predictor.load_state_dict(pt_state)
predictor.to(device)
predictor.eval()

import clip
clip_model, clip_preprocess = clip.load("ViT-L/14", device=device)
import numpy as np
from PIL import Image
def get_image_features(image, device=device, model=clip_model, preprocess=clip_preprocess):
    image = preprocess(image).unsqueeze(0).to(device)
    with torch.no_grad():
        image_features = model.encode_image(image)
        image_features /= image_features.norm(dim=-1, keepdim=True)
    image_features = image_features.cpu().detach().numpy()
    return image_features
def get_score(image):
    image_features = get_image_features(image)
    score = predictor(torch.from_numpy(image_features).to(device).float())
    return score.item()

 このコードをColabノートにコピーし、GPUを選択してセルを実行してください。40秒くらいで実行が終了します。
 次に、左端のフォルダーを開き、contentフォルダーに評価したい画像ファイルをすべてアップロードしてください。

contentフォルダー横のドロップダウンリストを開き、アップロードをクリック。

 最後に、以下のコードをColabノートにコピーし、"評価する画像ファイル名"を実際に評価する画像ファイル名に書き換えてセルを実行してください。

import matplotlib.pyplot as plt
pil_image = Image.open("評価する画像ファイル名")
plt.imshow(pil_image)
get_score(pil_image)

 実行した結果は以下のように表示されます。
 画像の上の数字「6.165292263031006」がこの画像のスコアになります。

画像ファイル「sample.png」の美しさを評価するコードの実行結果

 なお、このコードは以下のウェブサイトのリンクに掲載されているnotebookを参考にしました。


3.画像生成モデルの比較

 今回は、アニメイラストに特化したStable Diffusionの派生モデルを中心に、以下の6つのモデルが生成した画像を評価します。

  1. Stable Diffusion v1.5 (SD)

  2. Waifu Diffusion v1.3 (Waifu)

  3. Anything V3 (Anything)

  4. Eimis Anime Diffusion 1.0v (Eimis)

  5. 8528 Diffusion (8528)

  6. Cool Japan Diffusion 2.1.0 (CJD)

 評価に用いる画像生成のためのプロンプトは、一部のモデル用に偏ったものにならないようにするため、ChatGPTに「アニメイラスト用の英語のプロンプトの例を挙げてください。」と頼んで、以下のとおり作成してもらいました。
① A beautiful girl with long, black hair and blue eyes standing against a summer sky.
② A playful, pink-haired girl with a bubbly personality.
③ A fantasy-like girl with silver hair and an otherworldly aura.
④ A regal girl with gold hair and an elegant presence.
⑤ A fluffy white kitten with big, curious eyes and a pink nose.
⑥ A vibrant garden with a variety of colorful flowers, buzzing bees, and fluttering butterflies.

 なお、モデルの性能を引き出し、アニメイラストっぽい画像にするために、最初に「masterpiece, anime」のプロンプトを追加しました。
 また、Negative promptに「inaccurate limb , lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, blurry」と入力しています。
 設定は、Steps: 40, Sampler: Euler a, CFG scale: 7, Size: 512x512とし、失敗画像で評価が決まってしまうのを避けるため、各モデルごとに、シード値はランダムにして4枚同時に生成し、評価スコア(1~10)の最も高い画像を採用します。
 評価スコアは、小数点第4位以下を切り捨てます。

① A beautiful girl with long, black hair and blue eyes standing against a summer sky.

 ①の評価結果は、最高スコアがCJDの6.623点、最低スコアがSDの5.843点でした。CJDは背景の鮮やかさとコントラストなどが評価されたのでしょうか。

② A playful, pink-haired girl with a bubbly personality.

 ②の評価結果は、最高スコアが8528の6.540点、最低スコアがCJDの6.056点でした。Eimisのように顔が途中で切れている画像でも評価が高くなるのは問題です。

③ A fantasy-like girl with silver hair and an otherworldly aura.

 ③の評価結果は、最高スコアが8528の6.808点、最低スコアがEimisの6.289点でした。今回残らなかった画像の中にも、かなりよいと思われる画像があったのですが、必ずしも人間の評価とは合っていないように感じました。

④ A regal girl with gold hair and an elegant presence.

 ④の評価結果は、最高スコアがSDの6.753点、最低スコアがWaifuの6.259点でした。Eimisは、完全に顔が切れて見えないのに高い評価が付きました。Waifuは、それほど悪くないように見えますが、枠が付いていることが低く評価されたのでしょうか。

⑤ A fluffy white kitten with big, curious eyes and a pink nose.

 ⑤の評価結果は、最高スコアがCJDの6.557点、最低スコアがWaifuの6.118点でした。想定通りに猫のアニメイラストになったのはCJDだけで、Anything、Eimis、8528は少女のイラスト、SDとWaifuは実写風の画像になってしまいました。

⑥ A vibrant garden with a variety of colorful flowers, buzzing bees, and fluttering butterflies.

 ⑥の評価結果は、最高スコアがEimisの6.819点、最低スコアがSDの6.126点でした。このEimisの画像は、全体での最高スコアになります。風景のみのイラストを描かせようとしたのですが、Eimisと8528は少女の画像が入ってしまいました。


4.まとめ

(1) 全体の集計結果

 全体の集計結果は以下のとおりです。

赤字が各プロンプトにおける最高スコア青字最低スコアを示します。

 今回の評価で最も高いスコアを記録したのは以下の画像になります。

Eimis Anime Diffusion 1.0v (6.819点) Prompt: masterpiece, anime, A vibrant garden with a variety of colorful flowers, buzzing bees, and fluttering butterflies.

 これよりももっと素敵だなと思える画像もあったのですが、個人の感想とAIの評価は必ずしも一致しないようです。

 また、今回、各モデルが生成した画像は、ほとんどが6点以上となっています。Stable Diffusion V1が学習用データとして、5点以上の画像を採用したことを考えれば、どのモデルも一定以上の高いレベルに達していることが分かります。
 但し、美少女イラストに最適化され過ぎているモデルが多く、動物や風景の画像を描くように指示しても、美少女の画像を生成してしまうのは問題です。

 画像生成モデルごとの平均スコアでは、1位8528、2位Anything、3位Eimis、4位CJD、5位Waifu、6位SDとなりました。
 この順位についても、8528 Diffusionが全体的に作画レベルが高く、失敗作が少ないこと、アニメイラスト中心の評価では、SDが不利になることについては納得できますが、全体の順位については、まだ、Aesthetics Predictorの評価性能を十分に信頼することはできず、その意味で、あまり参考になるものではありません。

(2) 美しさの評価について

 Aesthetics Predictorは、ネットから集めた大量の画像を学習用に使えるデータと使えないデータに分類する目的で作られたものであり、画像の品質を大雑把に評価することはできても、一定レベル以上に達した画像の優劣を評価するには能力が足りないように感じました。
 そういうハイレベルの画像を評価するには、より精緻な新しい基準が必要になりそうです。全体の構図、歪みの少なさ、顔立ちの整い方、色合いなど複数の項目に分けた評価基準が必要かもしれません。

 ところで、美しさの評価と言っても、芸術的な美しさについて基準を作ることは無理です。伝統的な宗教画、ルネサンス時代の写実的な絵画、印象派の絵画、抽象画やポストモダンの現代美術を一つの基準で評価することはできません。特に現代美術は、美しさとは何かを問いかけること自体が芸術になっています。
 ちなみに、歴史的な名画をAesthetics Predictorで評価しても、必ずしも高いスコアにはなりません。

Aesthetics Predictorによる名画の評価

 人工知能によるイラストの美しさの評価は、むしろ、大規模言語モデルなどで課題とされているアライメント(価値観の整合性)の問題です。つまり、いかに人間が好ましいと感じるイラストを生成できるかという問題であって、真の美しさの探求とは異なります。
 これは、カラオケの採点マシーンを思い浮かべるとよいと思います。採点マシーンは素人の歌の上手さを採点することができますが、芸術性まで評価できているとは言えません。
 このあたりに、人間の画家と画像生成AIの棲み分けのヒントが隠れているような気がします。

 今後は、画像生成AIによる画像生成スピードがこれまでよりも格段に速くなっていくはずです。例えば、1分間に何百枚も画像を生成できるようになるでしょう。そうなると、大量に画像を生成して、そこから高品質の画像を選別していく作業が必要ですが、ここで画像の美しさを評価するAIが大活躍します。早急に、このような画像評価AIのレベルアップが必要だと思います。

 また、優れた画像評価AIを作ることができれば、これをChatGPTなどで採用された人間フィードバックからの強化学習(RLHF)の報酬モデルとして利用することにより、人間の作成したイラストを大量に学習データに使わなくても、AIによる強化学習だけで生成画像の品質を上げていくことができます。
 そうすれば、現在大きな課題となっている画像生成AIによるイラストの無断使用の問題も解消するのではないかと期待しています。

※RLHFの報酬モデル:以下の図のStep2、Step3で使用されている、人手でランク付けしたデータで学習した報酬モデル。好ましいアウトプットを生成するほど高い得点を与えることによって、生成AIの性能がアップするように誘導する。

ChatGPTで採用された人間フィードバックからの強化学習(RLHF)


この記事が気に入ったらサポートをしてみませんか?