超越图像偏好——文本到图像生成中的丰富人工反馈
引言
近期,从人类偏好中学习的成功,尤其是在大型语言模型(LLMs)领域,激发了在文本到图像生成模型中采用类似方法以推动其发展。虽然简单的偏好标注(指示两张图像中哪张更好)有价值,但它们常常缺乏更深入分析所需的信息。例如,偏好标注可能无法阐明标注者选择某张图像而非另一张的原因是其视觉风格吸引人、真实感更强,还是与文本提示的对齐度更高。为了弥补这一空白,我们利用 Google Research 的研究中提出的模态,呈现了一个捕获文本到图像生成详细人工反馈的数据集。
要点速览: 我们通过 Rapidata 的 Python API 从超过 15 万名独立用户那里收集了 150 万条标注,构建了一个用于文本到图像生成的详细人工反馈数据集。该数据集包含:
- 根据李克特量表对三项标准(风格、连贯性、提示对齐)中的每一项进行的图像评分。
- 标注:指示提示中哪些词最常被认为是错位或未被很好地表示的。
- 图像中高度错位或不连贯区域的热力图。
文末将介绍如何轻松收集您自己的丰富反馈标注。
标注设置
为了为文本到图像生成模型的训练和评估提供更丰富的反馈,我们的数据集采用了一种多维标注方法,该方法基于 Google Research 在其论文中描述的方法。我们的核心标注过程包括:
- 李克特量表评分 标注者根据以下三个标准,对图像进行 1-5 分的评分:
- 风格: 图像的视觉吸引力如何?它是否展现出令人愉悦的美感?5 分为最具吸引力,1 分为最不具吸引力。
- 连贯性: 图像是否合理?常见的“AI 伪影”有多突出,例如不合情理的元素或扭曲的物体/肢体?对于这一点,我们发现让标注者评估图像的错误程度能产生最佳结果,即 5 表示错误最多(非常不连贯),1 表示没有错误(完全连贯)。然而,为了与其他标准保持一致,此后会将评分转换为 5 表示高连贯性,1 表示低连贯性。
- 对齐: 图像与给定文本提示的匹配程度如何?5 分表示图像与提示匹配得非常好,1 分表示匹配度非常差。
- 错位词选择 为了解决图像未能完全反映提示的情况,标注者被要求从提示中选择图像中错位或缺失的词(如果有的话)。下图展示了标注者所看到的界面。
- 图像区域选择 对于连贯性或对齐度评分较低的图像,标注者会指出图像中的具体问题区域。每位标注者最多可以选择图像中的三个不同点。
- 对于连贯性,标注者会突出显示伪影、畸形物体或不合情理的元素。
- 对于对齐,标注者会突出显示图像中与文本提示不一致的部分。
通过结合这些模态,数据集不仅提供了关于图像是好是坏的洞察,还解释了它可能未能达到预期的原因。
输入图像
此数据集的所有 1.3 万张图像均使用最新的文本到图像生成模型生成。其中约一半图像最初是为我们的文本到图像模型基准测试生成的。简而言之,这包括根据 283 个选定提示使用以下模型生成的约 6500 张不同图像:
- Flux1.1-pro
- Flux1-pro
- DALL-E 2
- Stable Diffusion 3
- Imagen 3
- Midjourney 5.2
更多详情请查阅上方链接的数据集和我们关于基准测试的论文。
另一半图像是使用 Stable Diffusion 3.5-Large 生成的,其提示选自 DiffusionDB 中的约 3000 个提示。
我们特意将同一个提示至少包含两次,以便分析相同提示(甚至相同模型)的输出差异。
结果
该数据集基于来自全球 152,684 名不同标注者的 150 万条标注,确保了良好的多样性,以提供具有广泛代表性的结果并避免标注者偏见。
最终的风格、连贯性和对齐分数是标注者对每张图像所评分的平均值。每张图像至少被不同的标注者就每个标准评分了 20 次。分数的分布如下图所示。我们额外提供了一个介于 0 到 1 之间的归一化分数。
根据这些评分,对连贯性或对齐性得分低的图像进行了上述区域选择标注,并在此基础上创建了热图。热图是所有标注者对每张图像响应的平均值。对于每个标注,我们考虑一个以选定点为中心的高斯函数,其标准差等于最短边的 5%。示例热图如下所示。
同样,可以使用色图将错位词选择可视化,以显示哪些词被选中的频率更高。请注意,由于每张图像的标注者数量相对较多,因此结果可以解释为表示每个词错位程度的分布。例如,略微错位的词可能被一些标注者选中,但并非全部,而更明显错位的词将被更多的标注者选中。示例如下。
数据集可在下方预览,并可在Huggingface上免费获取。请注意,为了提高质量,我们提供的数据结果是根据我们基于标注者过往表现为其分配的信任分数进行加权的。这就是为什么,例如,选定词的“计数”不是整数的原因。
讨论与未来工作
正如 Google 研究人员也指出的那样,对齐热力图标注本身具有一定的歧义性。例如,在左侧的图像中,很明显图像中猫的数量少了一只,多了一只狗。然而,如何在图像中选择以表达这一点并不立即明确。在这种情况下,大多数标注者选择了前景中的狗。
以左边第二张图片为例,也可以认为目前使用的点标注方法可能存在一定的局限性。在这张图片中,可以说整个马桶(包括马桶座)都因为颜色不对而错位,但是用几个点来标记这一点是很困难的。未来,可以尝试让标注者自由绘制来突出错误区域。
我们希望这个数据集能有助于更深入、更细致地理解文本到图像模型及其局限性。通过揭示这些模型的优缺点,我们旨在激发进一步的创新并推动其发展。
如果该数据集受到积极反响,我们计划持续扩充新数据,以确保其作为社区的宝贵资源。
复现标注设置
对于有兴趣生成自己丰富偏好数据集的研究人员,您可以通过 Python 直接使用 Rapidata API。以下代码片段展示了如何复现数据集中使用的模态。更多信息可通过文档获取。
创建 Rapidata 客户端并下载数据集
首先安装 rapidata 软件包,然后创建 RapidataClient()
,这将用于创建并启动标注设置。
pip install rapidata
from rapidata import RapidataClient, LabelingSelection, ValidationSelection
client = RapidataClient()
作为示例数据,我们将只使用数据集中的图像。请务必设置 streaming=True
,因为下载整个数据集可能需要大量时间。
from datasets import load_dataset
ds = load_dataset("Rapidata/text-2-image-Rich-Human-Feedback", split="train", streaming=True)
ds = ds.select_columns(["image","prompt"])
由于我们使用流式传输,我们可以像这样提取提示并下载所需的图像
import os
tmp_folder = "demo_images"
# make folder if it doesn't exist
if not os.path.exists(tmp_folder):
os.makedirs(tmp_folder)
prompts = []
image_paths = []
for i, row in enumerate(ds.take(10)):
prompts.append(row["prompt"])
# save image to disk
save_path = os.path.join(tmp_folder, f"{i}.jpg")
row["image"].save(save_path)
image_paths.append(save_path)
李克特量表对齐分数
要启动李克特量表标注订单,我们使用分类标注模式。下面展示了对齐标准的设置。风格和连贯性的结构相同,但参数当然需要调整。例如,不同的指令、选项和验证集。# Alignment Example
instruction = "How well does the image match the description?"
answer_options = [
"1: Not at all",
"2: A little",
"3: Moderately",
"4: Very well",
"5: Perfectly"
]
order = client.order.create_classification_order(
name="Alignment Example",
instruction=instruction,
answer_options=answer_options,
datapoints=image_paths,
contexts=prompts, # for alignment, prompts are required as context for the annotators.
responses_per_datapoint=10,
selections=[ValidationSelection("676199a5ef7af86285630ea6"), LabelingSelection(1)] # here we use a pre-defined validation set. See https://docs.rapidata.ai/improve_order_quality/ for details
)
order.run() # This starts the order. Follow the printed link to see progress.
对齐热图
为了生成热图,我们使用了定位标注模式。下面是用于创建对齐热图的设置。# alignment heatmap
# Note that the selected images may not actually have severely misaligned elements, but this is just for demonstration purposes.
order = client.order.create_locate_order(
name="Alignment Heatmap Example",
instruction="What part of the image does not match with the description? Tap to select.",
datapoints=image_paths,
contexts=prompts, # for alignment, prompts are required as context for the annotators.
responses_per_datapoint=10,
selections=[ValidationSelection("67689e58026456ec851f51f8"), LabelingSelection(1)] # here we use a pre-defined validation set for alignment. See https://docs.rapidata.ai/improve_order_quality/ for details
)
order.run() # This starts the order. Follow the printed link to see progress.
选择错位词语
要启动选择错位词语的标注设置,我们使用了以下设置:# Select words example
from rapidata import LanguageFilter
select_words_prompts = [p + " [No_Mistake]" for p in prompts]
order = client.order.create_select_words_order(
name="Select Words Example",
instruction = "The image is based on the text below. Select mistakes, i.e., words that are not aligned with the image.",
datapoints=image_paths,
sentences=select_words_prompts,
responses_per_datapoint=10,
filters=[LanguageFilter(["en"])], # here we add a filter to ensure only english speaking annotators are selected
selections=[ValidationSelection("6761a86eef7af86285630ea8"), LabelingSelection(1)] # here we use a pre-defined validation set. See https://docs.rapidata.ai/improve_order_quality/ for details
)
order.run()