Aesthetic Score Predictor: 画像美的評価モデル比較
RooCodeとSonnet3.5にまとめた画像評価モデルのメモ
1. Aesthetic Shadow
Aesthetic Shadowは、アニメ画像の美的評価に特化したモデルであり、生成AIとの連携やデータセットの品質管理に広く活用されています。
Aesthetic Shadow v1
| 項目 | 詳細 |
|---|---|
| 開発者 | shadowlilac |
| プラットフォーム | Hugging Face |
| パラメータ数 | 約11億(1.1B) |
| アーキテクチャ | Vision Transformer (ViT-B/16) |
| 入力画像サイズ | 1024×1024ピクセル |
| 処理速度 | NVIDIA A100で約200ms/枚 |
特徴:
- アニメ特有のスタイルを考慮した美的評価
- 高い評価精度を実現
- 現在も公開中で広く利用可能
使用例
from PIL import Image from transformers import ViTImageProcessor, pipeline # モデルの初期化 processor = ViTImageProcessor.from_pretrained("shadowlilac/aesthetic-shadow") classifier = pipeline( "image-classification", model="shadowlilac/aesthetic-shadow", feature_extractor=None, # 明示的にNoneを設定 image_processor=processor, # 新しいプロセッサーを使用 device="cuda", ) # 単一画像の評価 image = Image.open(r"tests/resources/img/1_img/file01.webp") result = classifier(image) hq_score = next(p["score"] for p in result if p["label"] == "hq") print(f"High Quality Score: {hq_score:.2f}")
Aesthetic Shadow v1 バッチ処理の使用例
from PIL import Image from transformers import ViTImageProcessor, pipeline # モデルの初期化 processor = ViTImageProcessor.from_pretrained("shadowlilac/aesthetic-shadow") classifier = pipeline( "image-classification", model="shadowlilac/aesthetic-shadow", feature_extractor=None, # 明示的にNoneを設定 image_processor=processor, # 新しいプロセッサーを使用 device="cuda", ) # バッチ処理 images = [ Image.open(f) for f in [ r"tests/resources/img/1_img/file02.webp", r"tests/resources/img/1_img/file03.webp", r"tests/resources/img/1_img/file04.webp", ] ] results = classifier(images, batch_size=8) for result in results: hq_score = next(p["score"] for p in result if p["label"] == "hq") print(f"High Quality Score: {hq_score:.2f}")
特徴: - バッチサイズの指定が可能(デフォルト: 8) - GPUメモリに応じてバッチサイズを調整可能 - 処理速度が単一画像処理と比べて大幅に向上
Aesthetic Shadow V1 モデルの出力仕様
モデルは2つのラベル("hq"と"lq")のスコアを出力:
[
{'label': 'lq', 'score': 0.903651237487793},
{'label': 'hq', 'score': 0.4742427170276642}
]
特徴: - "hq"(高品質)スコアが高いほど画像の美的評価が高いことを示します - score は浮動小数点数で出力されます
Aesthetic Shadow v2
| 項目 | 詳細 |
|---|---|
| 開発者 | shadowlilac |
| プラットフォーム | Hugging Face(公開停止) |
| パラメータ数 | 約11億 |
| アーキテクチャ | Vision Transformer (ViT-H/14) |
| 入力画像サイズ | 1024×1024ピクセル |
| 処理速度 | NVIDIA A100で約120ms/枚 |
| 評価基準 | Animagine-XLベースの4段階評価 |
| 代替配布元 | NEXTAltair/cache_aestheic-shadow-v2(ミラー) |
特徴:
- アニメ特有のデフォルメ表現を適切に評価
- 陰影の自然さや色彩バランスを数値化
- Stable Diffusionなどの生成AIとの連携に最適
- 4段階評価(very aesthetic/aesthetic/displeasing/very displeasing)を採用
- 2024年末、公式リポジトリでの公開停止
使用例
from PIL import Image from transformers import ViTImageProcessor, pipeline # モデルの初期化 processor = ViTImageProcessor.from_pretrained("NEXTAltair/cache_aestheic-shadow-v2") classifier = pipeline( "image-classification", model="NEXTAltair/cache_aestheic-shadow-v2", feature_extractor=None, # 明示的にNoneを設定 image_processor=processor, # 新しいプロセッサーを使用 device="cuda", ) # 単一画像の評価 image = Image.open(r"tests/resources/img/1_img/file01.webp") result = classifier(image) hq_score = None for p in result: if p["label"] == "hq": hq_score = p["score"] break # スコアに基づく評価カテゴリの判定 # この出力を基に、Animagen XLの学習時には以下のような品質カテゴリに分類された: categories = { 0.71: "very aesthetic", 0.45: "aesthetic", 0.27: "displeasing", float("-inf"): "very displeasing", } print("単一画像の評価結果:") for threshold, category in categories.items(): if hq_score > threshold: print(f"評価: {category} (スコア: {hq_score:.2f})") break # バッチ処理 images = [ Image.open(f) for f in [ r"tests/resources/img/1_img/file02.webp", r"tests/resources/img/1_img/file03.webp", r"tests/resources/img/1_img/file04.webp", ] ] results = classifier(images, batch_size=8) print("/nバッチ処理の評価結果:") for i, result in enumerate(results, 2): # ファイル名Printのためのインデックス hq_score = None for p in result: if p["label"] == "hq": hq_score = p["score"] break print(f"file0{i}.webp - ", end="") # ファイル名を出力 for ( threshold, category, ) in categories.items(): # カテゴリ判定ループをバッチ処理ループ内へ移動 if hq_score > threshold: print(f"評価: {category} (スコア: {hq_score:.2f})") break
2. Cafe Aesthetic
Cafe Aestheticは、汎用的な美的評価を目的としたモデルで、特に実写画像にも適用可能です。
| 項目 | 詳細 |
|---|---|
| 開発者 | cafeai |
| ベースモデル | ViT-Base (microsoft/beit-base-patch16-384) |
| パラメータ数 | 約8600万 |
| 入力画像サイズ | 384×384ピクセル |
| 処理速度 | バッチサイズ32で約150ms/枚 |
| 評価スケール | 0-10(スコアを10倍して整数化) |
特徴:
- アニメ・実写両方の評価が可能
- マンガ形式の画像や低品質な線画を自動識別
- Waifu Diffusionのデータセット選別に活用
- バッチ処理による高速な評価が可能
使用例
import math from transformers import ViTImageProcessor, pipeline processor = ViTImageProcessor.from_pretrained("cafeai/cafe_aesthetic") classifier = pipeline( "image-classification", model="cafeai/cafe_aesthetic", feature_extractor=None, image_processor=processor, device="cuda", ) # 単一画像の処理 result = classifier(r"tests/resources/img/1_img/file01.webp", top_k=2) print(result) """ [ {'label': 'aesthetic', 'score': 0.677460789680481}, {'label': 'not_aesthetic', 'score': 0.0665491595864296} ] """ # スコアの取得と変換(0-10スケール) aesthetic_score = result[0]["score"] scaled_score = math.floor(aesthetic_score * 10) print(f"評価スコア: {scaled_score}/10") # 評価スコア: 6/10 # バッチ処理 image_paths = [ r"tests/resources/img/1_img/file02.webp", r"tests/resources/img/1_img/file03.webp", r"tests/resources/img/1_img/file04.webp", ] results = classifier(image_paths, batch_size=8) print(results) """ [ [ {'label': 'aesthetic', 'score': 0.7848548293113708}, {'label': 'not_aesthetic', 'score': 0.03180974721908569} ], [ {'label': 'aesthetic', 'score': 0.7964854836463928}, {'label': 'not_aesthetic', 'score': 0.03119194507598877} ], [ {'label': 'aesthetic', 'score': 0.8149158358573914}, {'label': 'not_aesthetic', 'score': 0.024759441614151} ] ] """ print("/nバッチ処理の結果:") for i, result in enumerate(results, 2): aesthetic_score = result[0]["score"] scaled_score = math.floor(aesthetic_score * 10) print(f"file0{i}.webp - スコア: {scaled_score}/10")
3. CLIP+MLP Aesthetic Score Predictor
このモデルは、CLIPのエンベディングを活用し、シンプルなMLP(多層パーセプトロン)で画像の美的評価を行います。 更新に年以上前のモデルで今更要らなく無いか?
| 項目 | 詳細 |
|---|---|
| 開発者 | Christopher Schuhmann |
| ベースモデル | CLIP (OpenAI) |
| パラメータ数 | 約5000万 |
| 評価スケール | 1〜10 |
特徴:
- シンプルな構造で高速な推論
- LAION 5Bデータセットを基に学習
- 実写・アニメ問わず幅広い画像を評価可能
使用例
動作確認はしない
4. Waifu-Diffusion Aesthetic Model
Waifu-Diffusionプロジェクト向けに開発されたアニメ画像専用の美的評価モデル 手動でモデルをダウンロードしないとだめな系の面倒なモデル サポートしない候補
| 項目 | 詳細 |
|---|---|
| 開発者 | Waifu Diffusionチーム |
| ベースモデル | CLIP (openai/clip-vit-base-patch32) |
| 入力画像サイズ | 224×224ピクセル |
| 評価スケール | 0〜10(スコアを10倍して整数化) |
| モデル構造 | 3層ニューラルネットワーク(512→256→128→1) |
特徴:
- アニメ調画像に特化した評価モデル
- CLIPエンベディングを活用し、シンプルな分類器を使用
- Waifu Diffusion 1.5の生成画像フィルタリングに最適
- 3層のMLPによる効率的な特徴抽出
使用例
import torch from PIL import Image from transformers import CLIPModel, CLIPProcessor # モデルとプロセッサのロード CLIP_REPOS = "openai/clip-vit-base-patch32" clip_processor = CLIPProcessor.from_pretrained(CLIP_REPOS) clip_model = CLIPModel.from_pretrained(CLIP_REPOS) # 分類器の定義 class Classifier(torch.nn.Module): def __init__(self): super().__init__() self.fc1 = torch.nn.Linear(512, 256) self.fc2 = torch.nn.Linear(256, 128) self.fc3 = torch.nn.Linear(128, 1) self.relu = torch.nn.ReLU() self.sigmoid = torch.nn.Sigmoid() def forward(self, x): x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.sigmoid(self.fc3(x)) return x # 分類器のロードと推論 classifier = Classifier() classifier.load_state_dict(torch.load("aes-B32-v0.pth", weights_only=True)) def predict(image_path): image = Image.open(image_path) inputs = clip_processor(images=image, return_tensors="pt") image_features = clip_model.get_image_features(**inputs) normalized_features = image_features / torch.norm( image_features, dim=1, keepdim=True ) score = classifier(normalized_features) # tensor([[0.9906]], grad_fn=<SigmoidBackward0>) return int(score.item() * 10) # 0-10のスケールに変換 score = predict("tests/resources/img/1_img/file01.webp") print(f"評価スコア: {score}/10")
5. VisionReward
VisionRewardは、清華大学が開発した最新の画像・動画評価モデルで、従来のスコアリングモデルとは異なり、複数の評価軸を用いた多次元的な評価を行います。 | 項目 | 詳細 | | ------------ | --------------------------------------- | | 開発者 | THUDM(清華大学) | | 公開時期 | 2024年初頭 | | 対応コンテンツ | 画像および動画 | | 評価方式 | マルチディメンショナル(複数の評価軸) | | ライセンス | Apache-2.0 | | 論文 | 近日公開予定(arXiv) | | データセット | 近日公開予定(HuggingFace Datasets) |
特徴:
多次元評価システム
- コンテンツの豊かさ(Rich content)
- 細部の現実性(Details realistic)
- 構図のバランス
- 色彩の調和 など、複数の観点から総合的に評価
チェックリストベースの評価
- 具体的な判断基準をチェックリスト化
- Yes/No形式の質問による客観的評価
- 評価の一貫性と再現性を確保
- カスタマイズ可能な評価基準
判断学習(Judgment Learning)機能
- 人間の評価基準を学習
- 質問形式での評価プロセス
- 線形重み付けによる最終スコア算出
- 解釈可能な評価結果の提供
- ファインチューニング可能な評価基準
動画特有の評価機能
- フレーム間の一貫性
- 動きの自然さ
- 時間的な連続性
- 動的特徴の体系的分析
- VideoScoreと比較して17.2%の性能向上
判断基準の透明性
- 各評価軸のスコアが個別に確認可能
- 重み付け方式による解釈可能な最終スコア
- チェックリスト形式の評価基準
- 評価プロセスの可視化機能
Windowsでのインストール方法
# 1. 必要な環境の準備 # Python 3.8以上、CUDA 11.3以上が必要 # 2. GitリポジトリのクローンとPython環境の設定 git clone https://github.com/THUDM/VisionReward cd VisionReward python -m venv venv ./venv/Scripts/activate # 3. 依存パッケージのインストール pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt
基本的な使用例
from vision_reward import VisionReward from PIL import Image import torch # モデルの初期化 model = VisionReward() model.to('cuda' if torch.cuda.is_available() else 'cpu') # 画像の評価 image = Image.open("path/to/image.jpg") scores = model.rate_image(image) # 各次元のスコアを表示 for dimension, score in scores.items(): print(f"{dimension}: {score:.2f}") # チェックリストベースの評価結果を取得 checklist_results = model.get_checklist_evaluation(image) for question, answer in checklist_results.items(): print(f"Q: {question}") print(f"A: {'Yes' if answer else 'No'}") # 動画の評価 video_path = "path/to/video.mp4" video_scores = model.rate_video(video_path) print(f"総合スコア: {video_scores['overall']:.2f}") print(f"フレーム一貫性: {video_scores['consistency']:.2f}") print(f"動きの自然さ: {video_scores['motion_naturalness']:.2f}")
高度な使用例
- カスタムチェックリストの定義と使用
# カスタムチェックリストの定義 custom_checklist = { "composition": [ "画像の主要素は適切に配置されていますか?", "背景と被写体のバランスは取れていますか?", "視線の流れを妨げる要素はありませんか?" ], "color": [ "色彩の調和は取れていますか?", "意図した色調は適切に表現されていますか?", "コントラストは効果的に使用されていますか?" ], "technical": [ "解像度は十分ですか?", "ノイズは許容範囲内ですか?", "シャープネスは適切ですか?" ] } # カスタムチェックリストでの評価 results = model.evaluate_with_custom_checklist(image, custom_checklist)
- バッチ処理と評価レポート生成
# 複数画像の一括評価 image_paths = ["image1.jpg", "image2.jpg", "image3.jpg"] images = [Image.open(path) for path in image_paths] batch_scores = model.rate_images_batch(images) # 詳細な評価レポートの生成 report = model.generate_evaluation_report(image) report.save_as_pdf("evaluation_report.pdf")
- 動画評価のカスタマイズ
# 動画評価の詳細設定 video_config = { 'frame_interval': 5, # フレーム間隔 'temporal_window': 30, # 時間窓 'motion_threshold': 0.5, # 動き検出閾値 } # 詳細設定を使用した動画評価 detailed_scores = model.rate_video( video_path, config=video_config, generate_visualization=True # 評価過程の可視化 )
- 判断学習のファインチューニング
# カスタムデータセットでの学習 training_data = { 'images': [...], # 画像のリスト 'annotations': [...], # アノテーションのリスト } # モデルのファインチューニング model.fine_tune( training_data, epochs=10, learning_rate=1e-5, validation_split=0.2 )
評価結果の解釈とカスタマイズ
# スコアの重み付けカスタマイズ例 custom_weights = { 'richness': 0.3, # コンテンツの豊かさ 'realism': 0.3, # 現実性 'composition': 0.2, # 構図 'color_harmony': 0.2 # 色彩の調和 } # カスタム重みを適用した評価 weighted_score = model.rate_image(image, weights=custom_weights) # 動画評価のカスタマイズ video_weights = { 'frame_quality': 0.4, # フレーム品質 'consistency': 0.3, # 一貫性 'motion': 0.3 # 動きの品質 } video_score = model.rate_video(video_path, weights=video_weights)
8. ImageReward
ImageRewardは、テキストから画像生成における人間の好みを学習・評価するための革新的なモデルです。NeurIPS 2023で発表され、137K以上の専門家による評価データを用いた学習により、人間の好みに近い評価を実現しています。特に、CLIPより38.6%、Aestheticより39.6%、BLIPより31.6%高い精度を達成しています。
| 項目 | 詳細 |
|---|---|
| 開発者 | THUDM(清華大学) |
| 公開時期 | 2023年 |
| 論文 | NeurIPS 2023, arXiv:2304.05977 |
| データセット | ImageRewardDB (137K+ エキスパート評価) |
| ライセンス | Apache-2.0 |
| 主な用途 | テキストから画像生成の評価 |
| 評価データ | 専門家による画像比較評価 |
| アーキテクチャ | BLIP + MLPベース |
主要な特徴と機能
評価システムの特徴
- BLIPベースの視覚エンコーダーによる画像特徴抽出
- クロスアテンションによるテキストと画像の特徴融合
- 5層MLPによる最終的なスコア予測(入力:768次元 → 1024 → 128 → 64 → 16 → 1)
- スコアは標準正規分布に従う(平均:0.167, 標準偏差:1.033)
- 人間の評価との高い相関性(約80%の一致率)
- 画像の美的品質とプロンプトの一致度を同時に評価
ReFL (Reward Feedback Learning) の機能
- Stable Diffusionなどの生成モデルを直接最適化
- 40ステップの段階的なノイズ除去プロセス
- 勾配スケーリングによる安定した学習(デフォルト:1e-3)
- バッチ処理による効率的な学習(デフォルトバッチサイズ:2)
- 人間評価で未調整版に対して58.4%の勝率を達成
- 生成モデルの品質向上に直接寄与
評価機能
- 単一画像のスコアリング
- 複数画像の一括評価と順位付け
- プロンプトと生成画像の一致度評価
- 体系的なアノテーションパイプライン
- 人間の評価との高い相関性
- マルチモーダル評価(画像品質+テキスト一致度)
実装の内部構造
class ImageReward(nn.Module): def __init__(self): self.blip = BLIP_Pretrain(image_size=224) # 視覚エンコーダー self.mlp = MLP(768) # スコア予測器 def score(self, prompt, image): # 1. 画像の前処理 image = self.preprocess(image) # 2. BLIPによる特徴抽出 image_embeds = self.blip.visual_encoder(image) # 3. テキストとのクロスアテンション text_output = self.blip.text_encoder( prompt_ids, encoder_hidden_states=image_embeds ) # 4. MLPによるスコア予測 rewards = self.mlp(text_output) # 5. スコアの正規化 return (rewards - self.mean) / self.std
使用例
- 基本的な画像評価
import torch import ImageReward as RM # モデルの初期化 model = RM.load_score("Aesthetic") device = "cuda" if torch.cuda.is_available() else "cpu" model.to(device) # 画像の評価 (プロンプトなし) image_path = "tests/resources/img/1_img/file01.webp" # Image path score = model.score(None, image_path) # Pass image_path to model.score print(score) print(f"評価スコア: {score:.2f}") # 複数画像の評価 (プロンプトなし) image_path1 = "tests/resources/img/1_img/file01.webp" # Image path image_path2 = "tests/resources/img/1_img/file02.webp" # Image path image_paths = [image_path1, image_path2] # List of image paths rewards = [] for img_path in image_paths: score = model.score(None, img_path) # Pass image path to model.score rewards.append(score) scores = rewards print(scores) print(f"画像1のスコア: {scores[0]:.2f}") print(f"画像2のスコア: {scores[1]:.2f}")
- プロンプトベースの評価
import torch import ImageReward as RM # モデルの初期化 model = RM.load("ImageReward-v1.0") device = "cuda" if torch.cuda.is_available() else "cpu" model.to(device) # プロンプトと画像の評価 prompt = "a beautiful anime girl with blue hair" image_path = "tests/resources/img/1_img/file01.webp" score = model.score(prompt, image_path) print(f"プロンプトに対する評価スコア: {score:.2f}") # 複数画像の評価とランキング images = [ "tests/resources/img/1_img/file01.webp", "tests/resources/img/1_img/file02.webp", "tests/resources/img/1_img/file03.webp" ] ranking, rewards = model.inference_rank(prompt, images) print("\n画像のランキング結果:") for i, (rank, reward) in enumerate(zip(ranking, rewards)): print(f"画像{i+1}: ランク {rank}, スコア {reward:.2f}")
高度な使用例
- バッチ処理による評価
from ImageReward import ReFL # トレーナーの初期化 trainer = ReFL.Trainer( "CompVis/stable-diffusion-v1-4", "data/refl_data.json", args=ReFL.parse_args() ) # モデルの最適化 trainer.train( num_train_epochs=100, gradient_accumulation_steps=4, learning_rate=1e-5 )
主な用途と応用例
生成AIモデルの最適化
- Stable Diffusionのファインチューニング
- 生成パラメータの調整
- モデルの性能評価
- 学習過程でのリアルタイムフィードバック
- カスタムデータセットへの適応
画像品質評価
- プロンプトと生成画像の一致度評価
- 複数画像の相対的な品質比較
- データセットのキュレーション
- バッチ処理による大規模評価
- 自動品質フィルタリング
研究・開発支援
- 新しい生成モデルの評価
- ユーザー体験の定量化
- 生成プロセスの最適化
- アブレーション研究
- ベンチマーク比較
制限事項と注意点
計算リソース要件
- 推奨GPU: NVIDIA A100/4090 (16GB以上のVRAM)
- バッチサイズによるメモリ使用量の増加
- 評価速度は比較的遅い(高精度評価のため)
- 大規模データセット処理時の最適化が必要
評価の特性
- プロンプトの言語による評価精度の差
- 特定のドメインやスタイルへの偏り
- 学習データの影響を受けやすい
- コンテキストに依存する評価結果
実装上の制約
- 入力画像サイズは224×224に固定
- テキストの最大長は35トークンまで
- バッチ処理時のメモリ効率に注意が必要
- 特定のフレームワークへの依存性
最新の発展: VisionReward
2024年初頭に発表されたVisionRewardは、ImageRewardの後継モデルとして以下の改善を提供:
- より細かい粒度の評価基準
- 多次元的な報酬モデル
- Text-to-Video生成の評価にも対応
- より解釈可能な評価結果
- 動的コンテンツへの対応強化
- マルチモーダル評価の拡張
研究コミュニティでの評価
ベンチマーク性能
- LAION-Aestheticsデータセットで最高性能を達成
- 人間の評価者との一致率が80%以上
- クロスドメインでの汎化性能が高い
- 処理速度とメモリ効率のバランスが良好
実用性評価
- 産業界での採用事例が増加
- オープンソースコミュニティでの活発な開発
- 継続的な改善と拡張
- 豊富な使用事例とドキュメント
今後の展望
- マルチモーダル評価の強化
- 計算効率の改善
- より細かい評価基準の導入
- コミュニティ主導の拡張開発
6. まとめ
各モデルの特徴と用途に応じた選択指針:
- アニメ画像評価なら → Aesthetic Shadow v1 / Waifu-Diffusion Aesthetic
- 実写とアニメの両方を評価するなら → Cafe Aesthetic
- 汎用的な評価や高速処理が必要なら → CLIP+MLP
- バッチ処理による高速評価が必要なら → Cafe Aesthetic(BATCH_SIZE=32対応)
- 詳細な多次元評価や動画評価が必要なら → VisionReward
注意点: - Aesthetic Shadow v2は公式配布が停止しているため、必要な場合はミラーリポジトリの使用が必要 - 各モデルで評価スケールが異なるため、スコアの解釈に注意が必要 - バッチ処理対応の有無やメモリ使用量を考慮してモデルを選択することを推奨 - VisionRewardは最新のモデルであり、より詳細な評価が可能だが、計算コストが比較的高い