返回列表

1st Place Solution

650. Drawing with LLMs | drawing-with-llms

开始: 2025-02-25 结束: 2025-05-27 AIGC与多模态 AI大模型赛
新队名 - 第一名解决方案

新队名 - 第一名解决方案

作者: conor (Grandmaster)

队友: @huanligong, @kenyeungtech

发布时间: 2025-05-28

竞赛排名: 第 1 名

祝贺所有其他获奖者,并感谢 Kaggle 举办如此独特的比赛——参与过程非常有趣!同时也感谢我的队友 @huanligong@kenyeungtech

简要总结 (TL;DR)

我们得分最高的提交 notebook 可以在 这里 找到。

  1. 使用 Segmind 的 SSD-1B 模型生成 64 张基线图像。
  2. 将每张图像转换为 SVG。
  3. 向每个 SVG 添加 OCR 诱饵、提示文本以及许多其他美学伪影。
  4. 将 SVG 转换回图像,应用图像处理管道,并计算它们的美学分数。
  5. 选择美学分数最高的 SVG 进行提交。

OCR 技巧

避免幻觉

我们在每个 SVG 的左上角嵌入三个可见字符,以避免 OCR 幻觉。通过对三个字母组合的搜索发现,"ZOK" 在不影响 VQA 分数的情况下产生了最高的平均美学分数。

隐藏额外文本

提高 VQA 分数最轻量且可靠的方法是直接在图像中包含与提示相关的文本。然而,简单地嵌入提示文本会导致得分为零,因为指标会应用 OCR 惩罚。为了避免这些惩罚,我们使用以下重复的、类似噪声的模式隐藏任何嵌入的文本:

<defs>
    <pattern id="a" x="0" y="0" width="10" height="10" patternUnits="userSpaceOnUse">
        <g opacity=".1">
            <path fill="#fff" d="M1 1h1v1H1z"/>
            <path fill="#ff0" d="M4 2h1v1H4z"/>
            <path fill="#0f0" d="M6 8h1v1H6z"/>
            <path fill="#00f" d="M9 5h1v1H9z"/>
        </g>
    </pattern>
</defs>
<rect width="100%" height="100%" fill="url(#a)"/>

这导致文本在原始图像和部分处理的图像(用于 OCR)中都是隐藏的。完全处理的图像(用于计算美学和 VQA 分数)会显示隐藏的文本:

隐藏文本示例

图像生成与转换

扩散模型

我们使用 SegmindSSD-1B 模型为给定的目标 SVG 描述生成 64 张图像。

为了提高效率,我们对基础模型应用了以下修改:

  1. 将默认 VAE 替换为 madebyollinTiny AutoEncoder for Stable Diffusion (XL),
  2. 使用带有 12 个推理步骤的 DPM-Solver 多步调度器,
  3. 启用 DeepCache,设置 cache_interval=2cache_branch_id=0,
  4. 在两个 T4 GPU 上并行运行图像生成,每个 GPU 生成 32 张图像。

每张图像的生成分辨率为 384×384,指导尺度 (guidance scale) 为 8。我们使用以下提示词:

提示词 (Prompt)
flat vector illustration, flat color blocks, hard color boundaries, solid fills, clipart style, \
no shading, no blending, minimalist, simple design, saturated colors, extremely simplistic and minimal, \
style: vector clip art, small color palette prompt: vector art of {SVG_DESCRIPTION}
负向提示词 (Negative Prompt)
photorealistic, realistic, detailed, 3D, complex shading, gradients, soft edges, text, signature, \
watermark, texture, painting, blurry, pixelated, thin lines, dots, cropped border, picture frame

使用多线程时,64 个样本的图像生成需要约 15 秒。然而,由于 Kaggle 包中目前存在多线程 bug,我们选择使用单线程以获得更可靠的提交,导致生成时间约为 30 秒。

转换为 SVG

每张图像被下采样并量化为六种颜色。对于这六种颜色中的每一种,我们使用 OpenCV 提取轮廓并将它们简化为多边形。然后我们将多边形缩放回原始大小并转换为压缩的 SVG 路径。我们按大小、中心性和简单性对每个提取的路径进行排名,然后 continuously 将它们添加到 SVG 中,直到达到 6000 字节的 size 限制。此过程对于 64 张图像的批次需要约 2.5 秒。

生成图像和转换后的 SVG 示例

生成图像和转换后的 SVG 示例

构建 SVG

我们将要从生成图像中提取的 SVG 缩放至原始大小的 40%,并将其放置在最终 SVG 的顶部中心。然后我们在左上角添加 anti-OCR 幻觉文本,从 SVG 描述中移除所有停用词,并将文本嵌入到图像正下方。文本使用 SVG 路径嵌入,我们也对其进行了 heavily 压缩。

最后,我们向 SVG 添加了许多其他伪影,旨在提高美学分数而不会对 VQA 分数产生负面影响:

  1. 5×4 的彩色方块补丁(我们为每个生成的图像测试了四种不同变体),
  2. 拼写 "KUZ" 的绿色文本,
  3. 拼写 "3Q3" 的绿色文本,
  4. 拼写 "SSQ" 的灰色文本,
  5. 拼写 "FRANCE XK ARTS" 的绿色文本(如果在 SVG 描述文本后有足够空间)。

这些伪影中的每一个都是通过遗传算法、爬山搜索或偶尔的手动猜测检查方法找到的。

完全构建的 SVG 示例(处理前后)

完全构建的 SVG 示例

备用 SVG (Fallback SVGs)

以防超时或异常,我们还准备了一个简单的仅文本 SVG,其中包括 anti-OCR 幻觉文本、来自 SVG 描述的文本以及一个简单的后缀 ("AMAZING EUROPE OIL ART EUROPE") 和一些上述美学伪影。

在比赛的后期阶段,我们没有花太多时间完善这些备用 SVG,因为我们得分最高的提交并没有使用它们。

备用 SVG 示例

最终 SVG 选择

我们将每个 SVG 转换回图像并对它们应用图像处理管道。我们使用了来自指标的图像处理器的自定义实现,该实现效率更高且产生几乎相同的结果。然后我们计算每个图像的美学分数,并简单地返回得分最高的 SVG。在我们得分最高的提交中,我们在验证数据集上运行的选定 SVG 的平均美学分数约为 0.563,VQA 分数约为 0.88。

无效的方法

我们尝试了许多不同的技术和上述方法的变体,但没有导致分数提高:

  1. 将 CLIP 分数、VQA 分数等纳入我们用于选择最终提交 SVG 的方程中。
  2. 生成超过 64 张图像(尽管在私有 leaderboard 上这似乎效果很好)。
  3. 计算每个 SVG 在多次应用图像处理管道后的平均美学分数。
  4. 彩色方块美学补丁的不同放置位置(沿边框、图像左侧等)。

Bonus:旧指标解决方案

对于旧指标,我们使用了一种可微分的方法来找到一组 237 个小方块,这些方块产生了最高的美学分数,并带有一些旨在最大化 VQA 分数的小文本。以下图像得分为 1.014,美学分数 >1.2:

旧指标解决方案示例
同比赛其他方案