返回列表

26th Place Solution: SDXL Flash + Optimized img2svg + TIFA QA Generation

650. Drawing with LLMs | drawing-with-llms

开始: 2025-02-25 结束: 2025-05-27 AIGC与多模态 AI大模型赛
第 26 名解决方案:SDXL Flash + 优化的 img2svg + TIFA 问答生成
作者: Kawchar Husain (MASTER)
竞赛排名: 第 26 名
发布时间: 2025-05-28

第 26 名解决方案:SDXL Flash + 优化的 img2svg + TIFA 问答生成

Sample output

我想向组织者致以诚挚的感谢,感谢他们的辛勤工作和 dedication,使这次比赛既引人入胜又富有意义。我也感谢所有分享有益想法的人——这种社区支持产生了巨大的影响。我的自定义图像到 SVG pipeline 受到了 @richolson 工作的启发,我特别感谢他的贡献。

我是这个领域的新手,经验和知识有限,所以欢迎任何反馈和建议!

太长不看版 (TL;DR)

  • 微调了 SmolLM2-1.7B-Instruct 来为每个描述生成四个 TIFA 风格的问题。
  • 使用 SDXL Flash 进行快速且高质量的图像生成。
  • 使用两种方法将图像转换为 SVG:自定义多边形/路径 pipeline 和带有二分搜索大小优化的 VTracer。
  • 在每个 SVG 中注入一个小的 "L" 水印 以减轻 OCR 幻觉。
  • 使用 PaliGemma-3B(比 10B 版本快约 3 倍)基于我生成的 TIFA 问题,根据竞赛分数评估并选择最佳 SVG。
  • 实施了动态时间管理策略,以最大化利用每个提示的时间预算。
  • 这里是 推理 notebook

TIFA 问题生成

为了生成高质量的评估问题,我使用 Gemini 和 Claude 创建了大约 10,000 个结构化示例的数据集。每组遵循严格的 4 问题 TIFA 格式:

  • Q1: 与描述相矛盾的 Yes/No 问题(答案:"no")
  • Q2: 使用描述中确切单词的多项选择题
  • Q3: 使用另一个确切单词的多项选择题
  • Q4: 肯定描述中存在的某事的 Yes/No 问题(答案:"yes")

我在这个数据集上微调了 SmolLM2-1.7B-Instruct。模型表现良好,显著提高了我的竞赛分数。在大约 2% 的情况下,Q2 和 Q3 是重复的——这可能是由于训练数据中的 minor inconsistencies 或小模型的能力有限。为了处理此类边缘情况,我添加了 fallback 逻辑,当生成的唯一问题少于四个时注入虚拟问题。

推理速度极快,平均每个提示约 3 秒

图像生成

由于速度 - 质量的权衡,我使用了 SDXL Flash。提示词是使用一致的模板构建的:

flat vector illustration of {description}, minimalist design, solid colors, flat color blocks
({description} 的扁平矢量插图,极简设计,纯色,扁平色块)

每个提示默认获得 4 次尝试,使用之前预测的剩余时间动态扩展。

图像到 SVG 转换

每个生成的图像首先从 768×768 调整大小到 384×384 以降低 SVG 复杂度。然后使用 LAB 色彩空间中的 MiniBatchKMeans 将图像量化为 16 种颜色。量化后,我应用 并查集 (DSU) 算法合并具有相似颜色的相邻区域。处理后的图像然后 passed 到两个 SVG 转换 pipelines:

自定义多边形/路径简化

此方法分配总点数预算(例如 2000 点),并根据结合面积、形状复杂度和距图像中心接近度的重要性指标将其分配给轮廓。对于每个轮廓,我执行 二分搜索 以找到最佳 epsilon 值,使用 cv2.approxPolyDP 将轮廓简化为目标点数。

每个简化的形状然后被编码为多边形或路径,取决于哪种表示在字节上更短。这在保持文件大小受控的同时产生了视觉准确的 SVG。

VTracer + 二分搜索压缩

作为替代方案,我还使用 VTracer 将图像转换为分层 SVG 路径。跟踪后,使用 cv2.approxPolyDP 对路径元素应用 二分搜索 简化 pass,以进一步减小文件大小并确保最终 SVG 保持在 10KB 限制以下。

对于每个生成的图像,我生成两个 SVG——一个使用自定义多边形/路径 pipeline,另一个使用带有二分搜索的 VTracer。

OCR 幻觉防御

竞赛的评分模型经常幻觉 SVG 中存在文本, negatively impacting OCR 分数和整体性能。为了 counter 这个,我在每个 SVG 内的固定位置注入一个小的 "L" 形水印。

此水印的颜色是动态选择的——黑色或白色——基于区域的局部亮度,以确保它自然地融入图像,同时仍然可检测。这个简单但有效的技巧显著减少了 OCR 评估中的 false positives。

最佳 SVG 选择

为了选择最佳 SVG,我使用 PaliGemma-3B,它比 10B 版本快约 3 倍,准确性损失最小。

时间管理策略

每个描述分配了 64 秒的固定时间预算。如果样本提前完成,未使用的时间会累积并结转。

保存的时间然后被复用以允许未来描述进行额外的图像生成尝试,计算如下:
attempts = int(base_num_attempts + saved_time / per_attempt_time)

提交选择

为了指导提交选择,我创建了一个包含 100 个描述的验证数据集,涵盖 11 个不同类别(自然、抽象、时尚、动物、家居、食物、城市、技术、交通、运动/娱乐、医疗/保健),全部使用 Gemini 生成。

你可以在 这里 找到数据集。

我运行了多个推理 notebooks 并跟踪了 CV 和榜单性能:

Notebook 公共榜单 (Public LB) CV 分数 私有榜单 (Private LB) 最终提交
1 0.699 0.724 0.690
2 0.696 0.730 0.699
3 0.690 0.752 0.686
4 0.689 0.763 0.693

Notebook 3 和 Notebook 4 基于强大的交叉验证性能被选为最终提交。不幸的是,我错过了选择 Notebook 2——它实际上有着稍高的私有榜单分数。

我尝试过的其他方法

  • 结合 Qwen2.5-14B-Instruct-AWQ 与 SDXL Hyper,但这个设置导致整体分数较低。
  • 在 SD、SDXL 和 SDXL Flash 模型上实验了 LoRA 微调,但这一致地降低了性能。
  • 微调 SmolLM2-1.7B-Instruct 用于 SVG 友好风格的提示词增强。这没有提高公共榜单分数(实际上降低到了 0.682),但有趣的是实现了稍好的私有分数 0.694(相比之下我的选定提交为 0.693)。
  • 尝试了各种扩散模型,发现 SDXL Flash、Flux Schnell、Hyper SDXL、Juggernaut XL V9 和 Playground 1K Aesthetic 往往表现更好。
  • 尝试根据图像复杂度动态计算 SVG 简化的总点数预算,而不是使用固定的 2000 点预算。然而,这增加了开销而没有显著改善结果。

我犯的错误

回顾过去,有几个关键领域我可以改进:

  • 我没有做任何 focused attempts 来优化美学分数,这本可以提高我的整体竞赛指标。
  • 我太依赖单一数据集进行交叉验证和最终提交决定,这可能导致我 overlooked 表现更好的解决方案(例如 Notebook 2)。
  • 我避免探索更多非常规或 "hacky" 的技术,像那些 top-ranking 团队使用的技术。
同比赛其他方案