kawaimasa/kawai-aesthetic-scorer-convnextv2
463
Kawai Aesthetic Scorer (ConvNeXtV2, 768px)
これは「一般的な美的評価モデル」ではなく、作者の主観的な好み(主にアニメ/2Dイラスト系)に合わせて、 大量画像から学習用データを効率的に選別するためのスコアラー(5クラス分類)です。
目的 / 背景
既存の美的評価モデルには以下の課題がありました:
- モノクロ画像・デフォルメ画像などが不当に低く評価されやすい
- 過激/刺激の強い作品に対して「品質」としての評価が適切に機能しないケースがある
- 作者の好みではない(例:過度にリアル、特定の西洋風)スタイルを高評価しがち
- 一般にクオリティタグの基準として用いられるdanbooru等のユーザ投票scoreベース評価は、漫画や吹き出し・ミーム・二次創作などのナラティブ要素に強く反応し、AI生成用のデータセットのクオリティ評価としては不適格な側面がある
このモデルは上記問題を解消し、アニメ、イラスト系データセットを作者の主観的な好みを反映しつつ美的評価することを目的として作成されました。
できること
- 画像を 5段階(SS/S/A/B/C相当) に分類し、確率(softmax)を出力します
- 任意で、確率から スカラーの加重スコアに変換して使用します(後述)
できないこと / 注意
- 一般的な画質・美しさ・審美性の評価モデルではありません
- 写真・実写・3D・西洋絵画調・リアル寄りなどでは期待通りに動かない可能性があります
- NSFW判定器・安全フィルタではありません(別途フィルタを併用してください)
ラベル定義(モデル出力クラス)
モデルは 5クラス分類です。model.config.id2label にも格納されています。
既定の対応(例):
0:SS_tier1:S_tier2:A_tier3:B_tier4:C_tier
※ README上では便宜的に SS/S/A/B/C と書きますが、実際のラベル名は id2label を確認してください。学習データの概要(Ground Truth)
- 手動で評価・分類した 約6万枚の画像データセット
- 5段階 Tier(SS/S/A/B/C)
学習時の前処理(重要:推論も同じにしてください)
このモデルは 学習時に以下の前処理で学習しています。 推論時も 同じ前処理にしないと、構図や余白の扱いが変わり 分類/スコアがズレる可能性が高いです。
前処理フロー
RGBへ変換- アスペクト比を維持したまま、長辺が
image_size(例:768)になるようにリサイズ - 余白を 黒でパディングして
image_size x image_sizeの正方形にする(レターボックス) ToTensor()Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225])
推論(最小例)
Requirements
# pip install torch torchvision transformers pillow
import torch
import torch.nn.functional as F
from PIL import Image
import torchvision.transforms as T
from transformers import AutoModelForImageClassification
# === 学習時の前処理に合わせる: アスペクト比維持リサイズ → 黒パディングで正方形化 → Normalize ===
class PadResizeProcessor:
def __init__(self, size: int = 768):
self.size = size
self.normalize = T.Compose([
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
def __call__(self, image: Image.Image) -> torch.Tensor:
image = image.convert("RGB")
w, h = image.size
# アスペクト比維持で長辺を size に合わせる
scale = self.size / max(w, h)
nw, nh = int(w * scale), int(h * scale)
image = image.resize((nw, nh), Image.Resampling.LANCZOS)
# 黒パディングで正方形に
canvas = Image.new("RGB", (self.size, self.size), (0, 0, 0))
canvas.paste(image, ((self.size - nw) // 2, (self.size - nh) // 2))
return self.normalize(canvas)
repo_id = "kawaimasa/kawai-aesthetic-scorer-convnextv2"
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForImageClassification.from_pretrained(repo_id).to(device).eval()
proc = PadResizeProcessor(size=768)
img = Image.open("path_your_image.png")
pixel_values = proc(img).unsqueeze(0).to(device)
with torch.no_grad():
logits = model(pixel_values=pixel_values).logits
probs = F.softmax(logits, dim=-1)[0] # shape: [5]
pred_id = int(torch.argmax(probs).item())
pred_label = model.config.id2label.get(pred_id, str(pred_id))
print("pred:", pred_label)
print("probs:", probs.detach().cpu().tolist())加重スコア(任意)
確率 probs = [SS,S,A,B,C] を 1つのスカラーに潰したい場合の例です。
- 重み:
[1.0, 0.9, 0.5, -0.5, -1.0] weighted_score = sum(probs[i] * weight[i])
weights = torch.tensor([1.0, 0.9, 0.5, -0.5, -1.0], device=device)
weighted_score = (probs * weights).sum().item()
print("weighted_score:", weighted_score)※この重みは「作者の好み」に合わせた例です。用途に応じて変更してください。
学習の概要(簡易)
- ベースモデル:ConvNeXtV2 Large(22k/384)
- 学習方法:Progressive Resizing(384 → 512 → 768 の3段階) ---
Intended Use(想定用途)
- アニメ/2Dイラスト系データセットから、「作者の嗜好に合う」画像をスクリーニングする
- 個人の美的基準でのランキング、フィルタリング
Out-of-Scope Use(想定しない用途)
- 一般的な美的評価・客観的な画質指標としての利用
- NSFW/安全判定・コンテンツモデレーション
- 公平性・多様性評価など高い説明責任が求められる用途
免責
本モデルの出力は作者の主観に強く依存します。結果の解釈と利用は自己責任でお願いします。
