diffusers 扩散模型评估指南:定性人工评测与 CLIP 分数、CLIP 方向相似度、FID 定量指标实战
【免费下载链接】diffusers🤗 Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers
生成式模型的评估本质上具有主观性:同一张图像,不同观察者的构图、图文对齐、空间关系感知各不相同。作为开发者和研究者,面对 GANs、Diffusion 等不同生成模型时,我们既不能完全依赖定性观察(容易产生偏差,导致错误结论),也不能迷信单一定量指标(未必准确反映图像质量)。因此,结合定性与定量评估是获得可靠模型选择依据的关键路径。
本篇指南以 🤗 Diffusers 开源仓库为依托,系统讲解扩散模型的评估方法论:首先介绍基于 PartiPrompts 的人工定性评估基准,然后演示如何用diffusers结合torchmetrics与transformers实现三大定量指标——CLIP 分数、CLIP 方向相似度与 FID(Fréchet Inception Distance),覆盖文本引导图像生成、图像条件式编辑生成与类别条件生成三类典型管线。读完本文,你将掌握一套可直接复制运行的模型评估脚本,以及每个指标的适用场景与固有局限。
[!TIP] 鉴于当前已出现针对图像生成 Diffusion 模型的成熟评估框架(如 HEIM、T2I-Compbench、GenEval),本文档部分内容已过时,但仍可作为理解评估指标底层原理与动手实践的入门参考。
评估场景
本文档涵盖以下 Diffusion 模型管线的评估:
- 文本引导图像生成:如
StableDiffusionPipeline,输入纯文本提示词生成图像; - 基于文本和输入图像的引导生成:如
StableDiffusionImg2ImgPipeline与StableDiffusionInstructPix2PixPipeline,输入编辑指令与待编辑图像; - 类别条件图像生成:如
DiTPipeline,输入 ImageNet 类别标签。
文档所示方法同样适用于评估不同噪声调度器(scheduler)在固定生成模型下的表现差异。
定性评估:以 PartiPrompts 为基准的人工评测
定性评估通常涉及对生成图像的人工评判,评估维度包括构图质量、图文对齐度和空间关系等。标准化的提示词能为这些主观指标提供统一基准。DrawBench 和 PartiPrompts 是常用的定性评估提示词数据集,分别由 Imagen 和 Parti 团队提出。
根据 Parti 官方网站说明:
PartiPrompts (P2) 是我们发布的包含 1600 多个英文提示词的丰富集合,可用于测量模型在不同类别和挑战维度上的能力。
PartiPrompts 包含以下字段:
- Prompt(提示词)
- Category(类别,如"抽象"、"世界知识"等)
- Challenge(难度等级,如"基础"、"复杂"、"文字与符号"等)
这些基准测试支持对不同图像生成模型进行并排人工对比评估。为此,🧨 Diffusers 团队构建了Open Parti Prompts——一个基于 Parti Prompts 的社区驱动型定性评估基准,用于比较顶尖开源 diffusion 模型,包括展示 10 个 parti 提示词对应 4 张生成图像、由用户选择最符合提示图片的游戏应用,以及对比当前最优开源 diffusion 模型的排行榜。
用 diffusers 生成 PartiPrompts 采样图像
为进行手动图像对比,可以使用diffusers处理部分 PartiPrompts 提示词。以下是从不同挑战维度(基础、复杂、语言结构、想象力、文字与符号)采样的提示词示例(使用nateraw/parti-prompts数据集):
from datasets import load_dataset # prompts = load_dataset("nateraw/parti-prompts", split="train") # prompts = prompts.shuffle() # sample_prompts = [prompts[i]["Prompt"] for i in range(5)] # Fixing these sample prompts in the interest of reproducibility. sample_prompts = [ "a corgi", "a hot air balloon with a yin-yang symbol, with the moon visible in the daytime sky", "a car with no windows", "a cube made of porcupine", 'The saying "BE EXCELLENT TO EACH OTHER" written on a red brick wall with a graffiti image of a green alien wearing a tuxedo. A yellow fire hydrant is on a sidewalk in the foreground.', ]固定提示词的目的是保证结果可复现,便于不同模型之间进行公平并排对比。接下来使用 Stable Diffusion v1-4 checkpoint 生成这些提示词对应的图像:
import torch seed = 0 generator = torch.manual_seed(seed) images = sd_pipeline(sample_prompts, num_images_per_prompt=1, generator=generator).images通过设置num_images_per_prompt参数可以比较同一提示词生成的多张图像。使用不同检查点(如 v1-5)运行相同流程后,即可对两个检查点在相同提示词下的输出进行直观对比。
当使用多个待评估模型为所有提示词生成若干图像后,这些结果将提交给人类评估员进行打分。有关 DrawBench 和 PartiPrompts 基准测试的更多细节,请参阅各自的论文。
[!TIP] 在模型训练过程中查看推理样本有助于评估训练进度。仓库中的训练脚本支持此功能,并额外提供 TensorBoard 和 Weights & Biases 日志记录功能。
定量评估
本节将指导你评估三种不同的扩散流程,使用以下指标:
- CLIP 分数:衡量图像与文本提示的匹配程度;
- CLIP 方向相似度:衡量编辑前后图像变化与描述变化的一致性;
- FID(Fréchet Inception Distance):衡量真实图像与生成图像两个数据集分布的距离。
文本引导图像生成:CLIP 分数
CLIP 分数用于衡量图像-标题对的匹配程度。CLIP 分数越高表明匹配度越高。该分数是对"匹配度"这一定性概念的量化测量,也可以理解为图像与标题之间的语义相似度。研究发现 CLIP 分数与人类判断具有高度相关性。
首先加载StableDiffusionPipeline:
from diffusers import StableDiffusionPipeline import torch model_ckpt = "CompVis/stable-diffusion-v1-4" sd_pipeline = StableDiffusionPipeline.from_pretrained(model_ckpt, dtype=torch.float16).to("cuda")使用多个提示词生成图像:
prompts = [ "a photo of an astronaut riding a horse on mars", "A high tech solarpunk utopia in the Amazon rainforest", "A pikachu fine dining with a view to the Eiffel Tower", "A mecha robot in a favela in expressionist style", "an insect robot preparing a delicious meal", "A small cabin on top of a snowy mountain in the style of Disney, artstation", ] images = sd_pipeline(prompts, num_images_per_prompt=1, output_type="np").images print(images.shape) # (6, 512, 512, 3)注意这里设置了output_type="np",直接以 NumPy 数组形式返回图像(形状为(6, 512, 512, 3)),省去了 PIL 到数组的转换步骤,方便后续指标计算。
然后计算 CLIP 分数:
from torchmetrics.functional.multimodal import clip_score from functools import partial clip_score_fn = partial(clip_score, model_name_or_path="openai/clip-vit-base-patch16") def calculate_clip_score(images, prompts): images_int = (images * 255).astype("uint8") clip_score = clip_score_fn(torch.from_numpy(images_int).permute(0, 3, 1, 2), prompts).detach() return round(float(clip_score), 4) sd_clip_score = calculate_clip_score(images, prompts) print(f"CLIP分数: {sd_clip_score}") # CLIP分数: 35.7038代码中的关键细节:
- 由于 pipeline 以
output_type="np"输出[0, 1]区间的浮点数组,需要先乘以 255 并转为uint8; torchmetrics的clip_score期望输入为(N, C, H, W)的 CHW 张量,因此对数组执行permute(0, 3, 1, 2)将 NHWC 转置为 NCHW;- 默认使用
openai/clip-vit-base-patch16作为评分模型。
上述示例中,我们为每个提示生成一张图像。如果为每个提示生成多张图像,则需要计算每个提示生成图像的平均分数。
用固定种子公平比较两个检查点
当需要比较两个兼容StableDiffusionPipeline的检查点时,应在调用管道时传入生成器以消除采样随机性。首先使用 v1-4 检查点以固定种子生成图像:
seed = 0 generator = torch.manual_seed(seed) images = sd_pipeline(prompts, num_images_per_prompt=1, generator=generator, output_type="np").images然后加载 v1-5 检查点生成图像:
model_ckpt_1_5 = "stable-diffusion-v1-5/stable-diffusion-v1-5" sd_pipeline_1_5 = StableDiffusionPipeline.from_pretrained(model_ckpt_1_5, dtype=torch.float16).to("cuda") images_1_5 = sd_pipeline_1_5(prompts, num_images_per_prompt=1, generator=generator, output_type="np").images最后比较两者的 CLIP 分数:
sd_clip_score_1_4 = calculate_clip_score(images, prompts) print(f"v-1-4版本的CLIP分数: {sd_clip_score_1_4}") # v-1-4版本的CLIP分数: 34.9102 sd_clip_score_1_5 = calculate_clip_score(images_1_5, prompts) print(f"v-1-5版本的CLIP分数: {sd_clip_score_1_5}") # v-1-5版本的CLIP分数: 36.2137结果表明 v1-5 检查点性能优于前代(36.2137 > 34.9102)。但需注意,我们用于计算 CLIP 分数的提示词数量较少,实际评估时应使用更多样化且数量更大的提示词集。
[!WARNING] 该分数存在固有局限性:训练数据中的标题是从网络爬取,并提取自图片关联的
alt等标签。这些描述未必符合人类描述图像的方式,因此我们需要人工"设计"部分提示词。
图像条件式文本生成图像:CLIP 方向相似度
这种情况下,生成管道同时接受输入图像和文本提示作为条件。以StableDiffusionInstructPix2PixPipeline为例,该管道接收编辑指令作为输入提示,并接受待编辑的输入图像。
评估此类模型的策略之一是测量两幅图像间变化的连贯性:通过 CLIP 定义的两个图像之间的变化与两个图像描述之间的变化的一致性(如论文《CLIP-Guided Domain Adaptation of Image Generators》所示)。这被称为"CLIP 方向相似度":
- 描述 1对应输入图像(图像 1),即待编辑的图像;
- 描述 2对应编辑后的图像(图像 2),应反映编辑指令。
准备评估数据集
仓库文档准备了一个小型数据集sayakpaul/instructpix2pix-demo来实现该指标。首先加载数据集:
from datasets import load_dataset dataset = load_dataset("sayakpaul/instructpix2pix-demo", split="train") dataset.features{'input': Value(dtype='string', id=None), 'edit': Value(dtype='string', id=None), 'output': Value(dtype='string', id=None), 'image': Image(decode=True, id=None)}数据字段说明:
input:与image对应的原始描述;edit:编辑指令;output:反映edit指令的修改后描述。
查看一个样本:
idx = 0 print(f"Original caption: {dataset[idx]['input']}") print(f"Edit instruction: {dataset[idx]['edit']}") print(f"Modified caption: {dataset[idx]['output']}")Original caption: 2. FAROE ISLANDS: An archipelago of 18 mountainous isles in the North Atlantic Ocean between Norway and Iceland, the Faroe Islands has 'everything you could hope for', according to Big 7 Travel. It boasts 'crystal clear waterfalls, rocky cliffs that seem to jut out of nowhere and velvety green hills' Edit instruction: make the isles all white marble Modified caption: 2. WHITE MARBLE ISLANDS: An archipelago of 18 mountainous white marble isles in the North Atlantic Ocean between Norway and Iceland, the White Marble Islands has 'everything you could hope for', according to Big 7 Travel. It boasts 'crystal clear waterfalls, rocky cliffs that seem to jut out of nowhere and velvety green hills'可见output是在input基础上应用edit指令得到的修改后描述。我们将根据编辑指令修改数据集中的图像,并计算方向相似度。
用 InstructPix2Pix 执行编辑
首先加载StableDiffusionInstructPix2PixPipeline:
from diffusers import StableDiffusionInstructPix2PixPipeline instruct_pix2pix_pipeline = StableDiffusionInstructPix2PixPipeline.from_pretrained( "timbrooks/instruct-pix2pix", dtype=torch.float16 ).to("cuda")执行编辑操作:
import numpy as np def edit_image(input_image, instruction): image = instruct_pix2pix_pipeline( instruction, image=input_image, output_type="np", generator=generator, ).images[0] return image input_images = [] original_captions = [] modified_captions = [] edited_images = [] for idx in range(len(dataset)): input_image = dataset[idx]["image"] edit_instruction = dataset[idx]["edit"] edited_image = edit_image(input_image, edit_instruction) input_images.append(np.array(input_image)) original_captions.append(dataset[idx]["input"]) modified_captions.append(dataset[idx]["output"]) edited_images.append(edited_image)加载 CLIP 图像与文本编码器
为测量方向相似度,我们首先加载 CLIP 的图像和文本编码器。注意这里使用的是openai/clip-vit-large-patch14这一特定 CLIP 检查点,因为 Stable Diffusion 预训练正是基于此 CLIP 变体:
from transformers import ( CLIPTokenizer, CLIPTextModelWithProjection, CLIPVisionModelWithProjection, CLIPImageProcessor, ) clip_id = "openai/clip-vit-large-patch14" tokenizer = CLIPTokenizer.from_pretrained(clip_id) text_encoder = CLIPTextModelWithProjection.from_pretrained(clip_id).to("cuda") image_processor = CLIPImageProcessor.from_pretrained(clip_id) image_encoder = CLIPVisionModelWithProjection.from_pretrained(clip_id).to("cuda")需要投影头(WithProjection变体)的原因是:方向相似度要求把图像与文本映射到同一联合嵌入空间,再计算向量差方向上的余弦相似度,这正是投影头输出的text_embeds与image_embeds的作用。
实现 DirectionalSimilarity 模块
接着准备计算方向相似度的 PyTorchnn.Module:
import torch.nn as nn import torch.nn.functional as F class DirectionalSimilarity(nn.Module): def __init__(self, tokenizer, text_encoder, image_processor, image_encoder): super().__init__() self.tokenizer = tokenizer self.text_encoder = text_encoder self.image_processor = image_processor self.image_encoder = image_encoder def preprocess_image(self, image): image = self.image_processor(image, return_tensors="pt")["pixel_values"] return {"pixel_values": image.to("cuda")} def tokenize_text(self, text): inputs = self.tokenizer( text, max_length=self.tokenizer.model_max_length, padding="max_length", truncation=True, return_tensors="pt", ) return {"input_ids": inputs.input_ids.to("cuda")} def encode_image(self, image): preprocessed_image = self.preprocess_image(image) image_features = self.image_encoder(**preprocessed_image).image_embeds image_features = image_features / image_features.norm(dim=1, keepdim=True) return image_features def encode_text(self, text): tokenized_text = self.tokenize_text(text) text_features = self.text_encoder(**tokenized_text).text_embeds text_features = text_features / text_features.norm(dim=1, keepdim=True) return text_features def compute_directional_similarity(self, img_feat_one, img_feat_two, text_feat_one, text_feat_two): sim_direction = F.cosine_similarity(img_feat_two - img_feat_one, text_feat_two - text_feat_one) return sim_direction def forward(self, image_one, image_two, caption_one, caption_two): img_feat_one = self.encode_image(image_one) img_feat_two = self.encode_image(image_two) text_feat_one = self.encode_text(caption_one) text_feat_two = self.encode_text(caption_two) directional_similarity = self.compute_directional_similarity( img_feat_one, img_feat_two, text_feat_one, text_feat_two ) return directional_similarity实现要点:
- 归一化:图像与文本特征都除以自身 L2 范数(
features / features.norm(dim=1, keepdim=True)),使余弦相似度直接等价于内积; - 核心公式:
F.cosine_similarity(img_feat_two - img_feat_one, text_feat_two - text_feat_one)——计算"图像编辑方向"(编辑前后图像特征之差)与"文本描述方向"(修改前后描述特征之差)之间的余弦相似度,衡量编辑行为是否与指令语义一致; - 文本预处理:采用
max_length填充 + 截断,与 CLIP 训练时的处理方式一致。
现在使用DirectionalSimilarity模块:
dir_similarity = DirectionalSimilarity(tokenizer, text_encoder, image_processor, image_encoder) scores = [] for i in range(len(input_images)): original_image = input_images[i] original_caption = original_captions[i] edited_image = edited_images[i] modified_caption = modified_captions[i] similarity_score = dir_similarity(original_image, edited_image, original_caption, modified_caption) scores.append(float(similarity_score.detach().cpu())) print(f"CLIP方向相似度: {np.mean(scores)}") # CLIP方向相似度: 0.0797976553440094与 CLIP 分数类似,CLIP 方向相似度数值越高越好。
调节 InstructPix2Pix 的两个引导参数
需要注意的是,StableDiffusionInstructPix2PixPipeline提供了两个控制参数来调节最终编辑图像的质量。从源码可见其默认值:
guidance_scale: float = 7.5:文本引导强度,值越高生成图像与文本提示越贴近,但可能牺牲图像质量;image_guidance_scale: float = 1.5:图像引导强度,值越高生成图像越贴近原始输入图像,同样可能牺牲图像质量;该管道要求此值至少为 1。
在源码的采样循环中(pipeline_stable_diffusion_instruct_pix2pix.py),噪声预测通过如下组合实现双重引导:
noise_pred = noise_pred_uncond \ + self.guidance_scale * (noise_pred_text - noise_pred_image) \ + self.image_guidance_scale * (noise_pred_image - noise_pred_uncond)即"无条件预测 + 文本方向修正 + 图像方向修正",两个缩放系数直接决定最终编辑结果偏向文本指令还是保留原图结构。建议尝试调整这两个参数,观察它们对方向相似度的影响。
指标扩展与注意事项
我们可以扩展这个度量标准来评估原始图像与编辑版本的相似度,只需计算F.cosine_similarity(img_feat_two, img_feat_one)。对于这类编辑任务,我们仍希望尽可能保留图像的主要语义特征(即保持较高的相似度分数)。
该度量方法同样适用于类似流程,例如StableDiffusionPix2PixZeroPipeline。
[!TIP] CLIP 分数和 CLIP 方向相似度都依赖 CLIP 模型,可能导致评估结果存在偏差。
另外需要说明的是,扩展 IS、FID 或 KID 等指标存在困难,当被评估模型是在大型图文数据集(如 LAION-5B 数据集)上预训练时。因为这些指标的底层都使用了在 ImageNet-1k 数据集上预训练的 InceptionNet 来提取图像特征。Stable Diffusion 的预训练数据集与 InceptionNet 的预训练数据集可能重叠有限,因此不适合作为特征提取器。
上述指标更适合评估类别条件模型,例如 DiT。该模型是在 ImageNet-1k 类别条件下预训练的。因此下一节以 DiT 为例演示 FID 计算。
基于类别的图像生成:FID
基于类别的生成模型通常是在带有类别标签的数据集(如 ImageNet-1k)上进行预训练的。评估这些模型的常用指标包括Fréchet Inception Distance(FID)、Kernel Inception Distance(KID)和 Inception Score(IS)。本文档重点介绍 FID(Heusel 等人),并展示如何使用DiTPipeline计算该指标,该管道底层使用了 DiT 模型。
FID 旨在衡量两组图像数据集的相似程度:
Fréchet Inception Distance 是衡量两组图像数据集相似度的指标。研究表明其与人类对视觉质量的主观判断高度相关,因此最常用于评估生成对抗网络(GAN)生成样本的质量。FID 通过计算 Inception 网络特征表示所拟合的两个高斯分布之间的 Fréchet 距离来实现。
这两个数据集本质上是真实图像数据集和生成图像数据集(本例中为人工生成的图像)。FID 通常基于两个大型数据集计算,但本文档将使用两个小型数据集进行演示。
准备真实图像样本
首先下载 ImageNet-1k 训练集中的部分图像:
from zipfile import ZipFile import requests def download(url, local_filepath): r = requests.get(url) with open(local_filepath, "wb") as f: f.write(r.content) return local_filepath dummy_dataset_url = "https://hf.co/datasets/sayakpaul/sample-datasets/resolve/main/sample-imagenet-images.zip" local_filepath = download(dummy_dataset_url, dummy_dataset_url.split("/")[-1]) with ZipFile(local_filepath, "r") as zipper: zipper.extractall(".")from PIL import Image import os import numpy as np dataset_path = "sample-imagenet-images" image_paths = sorted([os.path.join(dataset_path, x) for x in os.listdir(dataset_path)]) real_images = [np.array(Image.open(path).convert("RGB")) for path in image_paths]这些是来自以下 ImageNet-1k 类别的 10 张图像:"cassette_player"、"chain_saw"(2 张)、"church"、"gas_pump"(3 张)、"parachute"(2 张)和"tench"。
加载图像后,对其进行轻量级预处理以便用于 FID 计算:
from torchvision.transforms import functional as F import torch def preprocess_image(image): image = torch.tensor(image).unsqueeze(0) image = image.permute(0, 3, 1, 2) / 255.0 return F.center_crop(image, (256, 256)) real_images = torch.stack([dit_pipeline.preprocess_image(image) for image in real_images]) print(real_images.shape) # torch.Size([10, 3, 256, 256])用 DiTPipeline 生成类别条件图像
现在加载DiTPipeline来生成基于上述类别的条件图像:
from diffusers import DiTPipeline, DPMSolverMultistepScheduler dit_pipeline = DiTPipeline.from_pretrained("facebook/DiT-XL-2-256", dtype=torch.float16) dit_pipeline.scheduler = DPMSolverMultistepScheduler.from_config(dit_pipeline.scheduler.config) dit_pipeline = dit_pipeline.to("cuda") seed = 0 generator = torch.manual_seed(seed) words = [ "cassette player", "chainsaw", "chainsaw", "church", "gas pump", "gas pump", "gas pump", "parachute", "parachute", "tench", ] class_ids = dit_pipeline.get_label_ids(words) output = dit_pipeline(class_labels=class_ids, generator=generator, output_type="np") fake_images = output.images fake_images = torch.tensor(fake_images) fake_images = fake_images.permute(0, 3, 1, 2) print(fake_images.shape) # torch.Size([10, 3, 256, 256])从源码可以看出DiTPipeline的两个关键设计:
- 类别标签映射:pipeline 初始化时根据
id2label构建labels字典(将 ImageNet 的id2label中逗号分隔的多个同义词都映射到同一类 id),get_label_ids()负责把"chainsaw"、"church"这样的可读标签字符串映射为模型需要的整数类 id,若标签不存在会抛出ValueError提示可选标签; - 替换调度器:将默认的 DDIM 调度器替换为
DPMSolverMultistepScheduler是 DiT 官方仓库的推荐做法,可在少量步数内获得更优的生成质量;DPMSolverMultistepScheduler.from_config(dit_pipeline.scheduler.config)从现有调度器配置直接转换,无需手动填写参数。
仓库的集成测试也验证了同样的调用模式(tests/pipelines/dit/test_dit.py):使用facebook/DiT-XL-2-256,固定torch.manual_seed(0),对["vase", "umbrella", "white shark", "white wolf"]调用get_label_ids后执行生成,并与参考 numpy 输出逐像素比对。
计算 FID 分数
现在,可以使用torchmetrics计算 FID 分数:
from torchmetrics.image.fid import FrechetInceptionDistance fid = FrechetInceptionDistance(normalize=True) fid.update(real_images, real=True) fid.update(fake_images, real=False) print(f"FID分数: {float(fid.compute())}") # FID分数: 177.7147216796875FID 分数越低越好。normalize=True表示输入图像已归一化到[0, 1]区间(与前面permute / 255.0的预处理保持一致)。update(real_images, real=True)与update(fake_images, real=False)分别累积真实与生成图像的 Inception 特征统计量,最后compute()计算两个高斯分布之间的 Fréchet 距离。
以下因素会影响 FID 结果:
- 图像数量(包括真实图像和生成图像)
- 扩散过程中引入的随机性
- 扩散过程的推理步数
- 扩散过程中使用的调度器
对于最后两点,最佳实践是使用不同的随机种子和推理步数进行多次评估,然后报告平均结果。
[!WARNING] FID 结果往往具有脆弱性,因为它依赖于许多因素:
- 计算过程中使用的特定 Inception 模型
- 计算实现的准确性
- 图像格式(PNG 和 JPG 的起点不同)
需要注意的是,FID 通常在比较相似实验时最有用,但除非作者仔细公开 FID 测量代码,否则很难复现论文结果。
这些注意事项同样适用于其他相关指标,如 KID 和 IS。
最后,可以可视化检查这些fake_images,直观确认生成图像的类别正确性与视觉质量,将定量分数与定性观察相互印证。
总结与选型建议
综合本文,可以提炼出如下评估实践建议:
| 评估场景 | 推荐指标 | 方向 | 适用管线 |
|---|---|---|---|
| 文本引导图像生成 | CLIP 分数 | 越高越好 | StableDiffusionPipeline等 |
| 图像条件式编辑生成 | CLIP 方向相似度(可搭配原图相似度) | 越高越好 | StableDiffusionInstructPix2PixPipeline、StableDiffusionPix2PixZeroPipeline等 |
| 类别条件图像生成 | FID / KID / IS | FID 越低越好 | DiTPipeline等 |
三个核心原则贯穿始终:
- 定性与定量结合:人工评估捕捉构图、美学等难以量化的维度,定量指标提供可复现、可排序的依据,二者互补;
- 固定随机种子保证公平性:比较不同检查点或调度器时,务必传入相同的
generator,排除采样随机性干扰; - 警惕指标的不适用范围:CLIP 系指标依赖 CLIP 模型可能存在偏差;FID/IS/KID 依赖 ImageNet 预训练的 InceptionNet,更适合评估 ImageNet 类别的条件模型(如 DiT),对 LAION 等大规模图文数据上预训练的模型(如 Stable Diffusion)需谨慎使用,且 FID 结果对实现细节高度敏感。
掌握这些方法后,你可以用同一套流程为候选模型、检查点版本或调度器配置生成可量化的评估结论,为模型选型提供坚实依据。
【免费下载链接】diffusers🤗 Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考