返回列表

18th Place Solution - Homemade Vectorizer + ImageReward + NLTK

650. Drawing with LLMs | drawing-with-llms

开始: 2025-02-25 结束: 2025-05-27 AIGC与多模态 AI大模型赛
第 18 名解决方案 - 自制矢量化工具 + ImageReward + NLTK

第 18 名解决方案 - 自制矢量化工具 + ImageReward + NLTK

作者:chsh2 | 发布日期:2025-05-30 | 竞赛排名:第 18 名

这是我第一次参加 Kaggle 竞赛。在业余时间,我致力于一个副项目,开发用于创建矢量艺术的算法和工具。因此,我很兴奋能找到这个比赛,它给了我测试算法并探索机器学习带来的新可能性的机会。我从公开代码和讨论中学到了很多。感谢组织者举办此次活动,也感谢所有参与者分享这么多精彩的想法。

我的方法基于以下论文:

Karthik, Shyamgopal, Karsten Roth, Massimiliano Mancini, and Zeynep Akata. "If at First You Don't Succeed, Try, Try Again: Faithful Diffusion-based Text-to-Image Generation by Selection." arXiv preprint arXiv:2305.13308 (2023).

这项工作声称使用 ImageReward 对生成的图像进行排名将提高 TIFA 分数。我的 pipeline 概述如下:

  1. 使用 Flux.1 Schnell 生成多张图像
  2. 使用我自己的方法对图像进行矢量化
  3. 计算每张图像的 ImageReward 指标和美学分数(aesthetic score)
  4. 挑选得分最高的图像并进行最终调整(例如,更改矢量化参数,为 OCR 添加字母)

在步骤 1 和 3 中,我还使用 NLTK 来修改原始提示词。

栅格图像生成 (Raster Image Generation)

我部署了一个量化版的 Flux.1 Schnell,使用的提示词为:{image_description}, stylized proportions, exaggerated form, children illustration。对于量化,我尝试了 Q4 和 nf4 两种格式。Q4 的表现略好一些。

矢量化 (Vectorization)

我从我的 另一个项目 中采用了代码用于图像矢量化。一般来说,它可能不如 VTracer,但我试图专注于生成没有多余结构的干净几何图形。因此,我认为它可能适合这里。

Vectorization Example 1

该方法基于一种常见的方法,即首先执行颜色量化,然后将轮廓提取为多边形路径。虽然我试图在每个步骤中进行一些改进:

  1. 颜色量化 (Color Quantization):为了平衡效率和质量,我结合了 K-means 聚类和 Felsenszwalb 算法。我还将图像从 RGB 空间转换为 LAB 空间以获得更好的结果。
  2. 轮廓查找 (Contour Finding):OpenCV 和 Skimage 都为二进制位图提供了 find_contours API,因此需要对量化图像中的每种颜色调用多次。但底层算法(marching squares)实际上可以应用于多颜色位图而无需更改。我重新实现了该算法,使其在矢量化过程中只需运行一次。
  3. 路径简化 (Path Simplification):在简化每个多边形路径时,我保持 neighborhood 中有 3 种颜色的点不变。否则,相邻形状之间可能会出现间隙。这种改进不太重要,因为间隙不一定导致美学分数低。当需要更高水平的压缩时,我会取消此约束。简化路径的方法是 Douglas-Peucker 算法。
Vectorization Example 2

我准备了 4 组满足 SVG 文件大小限制的矢量化参数。为每个版本的转换图像估算分数,以确定最佳方案。

提示词处理与评分 (Prompt Processing & Scoring)

我引用的论文使用原始提示词计算 ImageReward 指标。我发现将提示词分成几部分可以获得更高的竞赛分数。使用 NLTK,我定位了所有名词并为每个名词创建了一个子提示词。然后,我使用凹函数(concave function)获取所有子提示词的 ImageReward 指标的平均值。

在我的测试中,作为竞赛分数的指标,ImageReward 的表现优于 Clip 和 SigLIP。不过我没有将其与 VQA 方法进行比较。

Scoring Example

我在图像生成期间还将 NLTK 用于另一个目的。我发现 Flux.1 总是无法生成某些抽象主题的正确图像,例如梯形。我试图通过将单词定义附加到提示词来缓解这个问题。例如:

magenta trapezoids (a quadrilateral with two parallel sides) layered on a transluscent silver sheet (any broad thin expanse or surface)

这种方法并不总能带来改进。因此,我为两个版本的提示词生成了多张图像,供 ImageReward 评分。

其他想法 (Other Thoughts)

我非常感谢 Kaggle 提供 GPU 资源,使我能够将各种想法付诸实践。同时,我也对组织者为确保比赛公平性而不断改进评分指标的努力印象深刻。

然而,我有一个遗憾,即我测试矢量算法的初始目标并未完全实现。除了栅格图像矢量化外,我还有一些其他用于矢量艺术的算法,但在比赛中找不到使用它们的地方,因为指标非常针对栅格图像。美学分数是在照片上训练的,VQA 对于矢量图像也不太精确。另一方面,没有评估矢量图像特征或 SVG 格式的指标。大多数参与者更喜欢 diffusers 而不是 LLM,这对我来说并不奇怪,因为这看起来更像是一个生成高压缩栅格图像的比赛,而不是矢量图像。

我从这次比赛中得到的启示是,我们或许应该更加意识到这种纯训练-based 指标/评分器的局限性。这可能有点离题,但我不喜欢有些人仅仅将艺术家视为训练来源并贬低他们的专业知识和判断力。一方面,作为为艺术家开发工具的人,看到开发者和艺术家之间日益增加的冲突,我感到很难过。另一方面,我也相信尊重彼此的知识是取得进一步进步的关键。

同比赛其他方案