UniSVG 论文笔记:A Unified Dataset for Vector Graphic Understanding and Generation with Multimodal Large Language Models
1. 背景与动机
SVG 是基于 XML 代码的矢量图格式,通过代码精准控制笛卡尔坐标平面图形的形状、大小、路径、颜色和文本等属性,支持无限缩放而不损失图像质量。因其高质量渲染、文件体积小以及动态可编辑性而受到青睐。
近年来,MLLMs 的迅速发展,展现出了复杂的跨模态处理任务的能力,在 SVG 理解与生成任务上有这巨大的潜力,目前研究人员主要设计了三种相关任务:
-
标量图到SVG代码转换(Image2SVG)
-
描述文本到SVG代码转换(Text2SVG)
-
SVG相关理解任务(SVG Understanding)
但这些任务仅仅是用来进行评估,而缺乏相关的训练数据或者聚焦于一两个特定的SVG任务。
基于上述原因,本文构建了一个以 SVG 为核心的综合性数据集(UniSVG),一个包含 52800 个用于训练 MLLMs的多模态数据项。
经过严格的清洗和去重,获得大量适合用于 MLLM 训练的高质量 SVG 样本,基于这些 SVG 代码生成了图片、撰写了详细的描述,以及利用 GPT-4V 构建了相关的 SVG 问答对。
2. 核心贡献
-
本文提出了首个大规模、多任务且开源的以SVG为核心的数据集(UniSVG),用于统一生成与理解,支持多模态大模型的训练与评估。
-
提出了 UniSVG 基准测试,包含多种评估指标,旨在评估模型的 SVG 生成与理解能力。
3. 方法论
3.1 数据采集
SVG 在互联网上存在着大量资源,本文从 Kaggle 的 SVG Icons 数据集以及 HuggingFace 的 svgen-500k-instruct 数据集中收集了 52.6 万条 SVG 代码。
3.2 数据预处理
主要分为以下几个步骤:
-
Simple SVG 代码清理:将其转换成 PNG 格式图片,任何无法转换成功的都从数据集中进行移除
-
Deep SVG 代码清理:删除头部的 DOCTYPE 和 XML 声明、注释,去除冗余的
<g>标签以及多余的空格,优化了代码。 -
SVG 代码去重:使用感知哈希(pHash)对由 SVG 生成的 PNG 格式图片进行编码,将其投影到一个表示空间中,然后进行 SVG 去除,直到每对 SVG 之间的距离低于指定阈值(计算两两之间的汉明距离)。
-
去除含有过多贝塞尔曲线的SVG文件:本文检查数据集的时候发现一些数据包含了过多的贝塞尔曲线,超出了模型的建模能力,为了保证模型训练稳定性,去除掉超过100个贝塞尔曲线的SVG。
具体流程如下:

3.3 数据集构建

如 图 2 所示,UniSVG 包含了 2 个主要组件:SVG生成(SVGEN)和 SVG理解(SVGUN),两者均由(图像,文本,代码)三种模态组成。
在构建过程中,使用了渲染技术 和 GPT-4V,通过 Prompt 生成 SVG 的详细描述(命名为 SVGDES),包含:**整体描述、颜色、类别以及潜在的现实生活中的用途。**基于这些描述,使用预定义规则提取的详细信息来构建数据集。(这里我觉得这样做,一是降低模型输出难度,模型输出结构化数据的能力有限,二也是方便校验,比如模糊字段或者缺失很容易就能发现,三是方便随时调整数据集格式)

此外,在确定各自子数据集的比例时,作者考虑了 SVG 相关任务的不同难度级别,提高了 SVGEN 数据的比例,SVGEN :SVGUN 的比例调整为了约 6 :1,各个任务具体数量如 表2 所示,作者附录中做了相关的消融实验。
3.3.1 图像到SVG生成(ISVGEN)
基于 36 万条清洗后到 SVG 数据构建,目的是教会模型从标量图形生成格式化的 SVG 向量图形。 将这些 SVG 数据渲染后得到了 36 万组**(位图-SVG)图像对**。
为了避免固定的 Prompt 导致模型过拟合该生成指令,作者构建了 20 个核心意图相同但表述不同的 Prompt,给每一张位图随机分配其中的一个问题。
最后形成了 36 万条(位图-问题-SVG)三元组。
3.3.2 文本到SVG生成(TSVGEN)
作者从清洗后的数据集中随机挑选了 91k 个文本-SVG对(应该是GPT-4V成本太高了),专门设计用于帮助模型从描述性文本生成格式化的SVG向量图形,每个数据对由 SVGDES(SVG图像描述文本)+ 对应的 SVG 代码组成。
同样,为了避免过拟合问题,也构建了 20 个生成指令,给每条数据随机分配一个生成指令。
3.3.3 SVG理解(SVGUN)
为了测试 MLLMs 对 SVG 的理解能力,作者将 SVGUN 分成了三个难度等级:简单、中等和困难。
-
简单级别:包含 4 项任务,从 SVG 代码中提取原始 size、从SVG 图像中提取颜色、统计 SVG 代码中使用的不同形状的数量,以及统计 SVG 代码中
<path>里用了多少次变换的数量。 -
中等级别:包含 3 项任务,提取 SVG 图像的类别(图标、几何、装饰等等)、描述 SVG 代码中的矩形,以及描述 SVG 代码中的圆形。
-
困难级别:包含 2 项主要任务,对整个 SVG 图像进行整体描述,以及推测该 SVG 图像在生活中可能的用途。
SVGUN 包含两个按参考模态划分的子任务:基于图像的 SVG 理解(ISVGUN)和 机遇代码的 SVG 理解(CSVGUN),两者的区别在于输入格式,CSVGUN 使用 SVG 代码和问题进行输入,而 ISVGUN 使用图像和问题作为输入。
此外,因为 SVGDES 是由 GPT-4V 生成的,所以为了公平,这些数据条目不能用于测试,被提出了测试基准中。
补充:
-
<path>标签:是 SVG 中用来绘制复杂自定义图形的核心标签(比如心形、不规则图标、自定义曲线等)。 -
transform属性:是给<path>中的图形增加几何变换指令(比如图形平移、旋转、缩放等),本质是不修改<path>原始坐标,直接对整个图形做位置/形态调整。 -
变换次数:指 SVG 代码中,
<path>标签的transform属性里包含的独立编号操作的数量(多个变换用空格分隔)。
此外,读到这里可能会有一个疑问:ISVGUN 还有必要测吗?普通 MLLMs 不是应该已经做的很好了吗?实际上不一定,「识别图片里红色圆形、蓝色矩形」这类通用视觉任务确实能做的很好,但 ISVGUN 的核心不是看图认形状,而是从 SVG 渲染图中推断代码层面的细节。
普通的 MLLMs 模型只能做通用图形理解,无法从 SVG 渲染图中推断代码层面的细节,这也是 UniSVG 基准设计这个字任务的目的。
4.实验
作者从 UniSVG 数据集中挑选了 2850 个数据项构建了 UniSVG 测试基准,采用了多样且多维度的评估指标,对各个模型在各类任务中进行了严格评估。
4.1 SVGEN 的评估指标
比较生成的 SVG 代码渲染出的图像与 对应真实 SVG 代码渲染出的图像之间的相似度,一方面采用**结构相似性系数(SSIM)和感知图像块相似度(LPIPS)**作为评估指标,这两者侧重于局部区域以捕捉低级视觉特征,另外还采用了 CLIP 相似度作为评估指标,它利用预训练的视觉-语言模型来捕捉语义相似性,提供对图像内容的语义感知和高级理解。
4.2 SVGUN的评估指标
对于较简单的任务,可以使用准确率来比较模型输出与真实答案,对于更具有挑战性的任务,以及模型自由生成的输出,本文使用两种流行的基于模型的指标: BERTScore 和 Setence-BERT,来评估模型生成的 response 与真实句子之间的相似度。
4.3 分数的加权
为了在排行榜上对模型进行排序,需要计算所有评估指标的加权来得到最终得分。在 UniSVG-bench 评分系统中,作者为 ISVGEN 和 TSVGEN 各分配了 45%(因为相比于 SVGUN这两者更难也更重要),SVGUN 占总得分的 10%。
从更细节的角度看,在 SVGEN 中,CLIP 相似度具有更重要的意义,所以为其分配了更高的权重,CLIP 相似度在 ISVGEN 和 TSVGEN 中各占 60%,而 SSIM 和 LPIPS 各占 20% 。
SVGUN 内部的指标权重也进行了相应调整,其中简单准确率、困难准确率、BERT 和 SBERT 的比例分别为 1:2:3.5:3.5。
5. 消融实验
5.1 微调范式的消融
作者在 LLaVA 和 LLaVA-LLaMA 模型上进行了各种微调实验,以确定最佳的微调范式,如 表 5 所示:

因为 LLaVA 与大多数多模态模型一样,采用两阶段训练范式:预训练(第一阶段:对齐视觉与语言)和 SFT(第二阶段:训练投影器和 MLLM 以遵循指令)。
上表中是三种不同的策略,根据仓库的开源代码可以得到:
-
策略 1 是直接未做 Stage1 和 Stage2 的模型原始 CheckPoint 直接在 UniSVG 上进行微调。
-
策略 2 是拿做过 Stage1 的模型 CheckPoint 在 UniSVG 上进行微调。
-
策略 3 是拿同时做过 Stage1 和 Stage2 的模型 CheckPoint 在 UniSVG 上进行微调,目的是测试 Stage2 对 SVG 任务是不是多余甚至有害的。
上表中表明,在 UniSVG 数据集上微调第一阶段的模型,能够在所有与 SVG 相关的指标上取得更优表现,而第二轮微调可能对 SVG 后续训练产生不利影响。(我猜想一个可能的原因是,这里SFT阶段的数据可能偏日常对话,而对代码类问题没有帮助,可能反而有害)
5.2 SVG 的 MLLM 训练效率消融

SVG 格式中,包含了大量冗余的逗号和小数点,显著降低了训练效率,作者在 ISVGEN 任务上进行了消融实验,如 表 6 所示,实验表明,去除这些冗余符号可以使训练 token 降低 35%,训练时间约缩短了40%,但这个优化轻微降低了生成质量。(我猜想一个可能原因是,基础语言模型预训练见过的数据很多都是冗余的,这里去除之后破坏了部分的预训练先验知识)
作者认为这个消融实验非常有价值,它为未来如何平衡计算成本与模型性能提供了一个参考方向。
6. 结论

为了验证 UniSVG 数据集再提升 MLLMs 处理相关 SVG 任务的有效性,作者选择了多种开源模型在 UniSVG 数据集上进行了3 轮微调,如 表 4 所示,在微调后,多个 MLLMs 的性能已经达到甚至超过了当前最优的闭源模型。
可以看到:
-
Qwen2.5 VL 微调后取得了整体的最佳性能,Claude 3.7 在所有闭源 SOTA 模型中表现最佳。
-
Claude 3.7 的 CLIP 相似度在所有模型中最高,但与微调后的模型对比,生成的 SVG 图像其像素级的评估指标相当差,这说明 Claude 3.7 生成的 SVG 图像在语义上与目标图像高度相似,但在视觉细节和结构准确性方面存在不足。
-
使用
LLaMA 3.1作为其 LLM 的LLaVA-LLaMA模型和使用Vicuna 1.5作为其 LLM 的LLaVA 1.5的模型,表现出显著更优的性能,这说明,在相同的多模态大模型框架内,集成一个更先进的大模型,尤其是擅长代码生成的大模型,能有效提升以 SVG 为核心的任务表现。
7. 不足之处
-
同一个矢量图,可能有不同的实现方式(SVG代码)文中没有考虑相关情况。
-
使用的感知哈希算法去重存在:
-
细粒度的区分能力严重不足,无法区分「完全重复」和「同源衍生但内容有本质差异」的情况,会被误判为相同图片。
-
感知哈希丢弃了色彩信息,也会导致图像相同但色彩不同的被误判为重复图片。
-
降维空间的大小、以及汉明距离阈值需要调整,文中并没有提到相关信息。
-
-
文中的 benchmark 没有排除掉数据泄露的风险。
-
数据过滤过于暴力,直接去除了超过 100 条贝塞尔曲线的数据文件,无法代表真实世界中复杂、高质量的矢量图形。
-
所有标注完全依赖 GPT-4V,存在幻觉的风险。
-
缺乏代码质量本身的评估,两个视觉上极其相似的 PNG,实现过的 SVG 代码可能完全不一样(一个优化的非常好,一个存在大量冗余),缺乏对代码结构相似度的评估。
-
对比方式也不是很公平,Baseline 中没有去对比专门处理 SVG 的领域 SOTA 模型,且闭源模型是 zero-shot 的,得出的结论也不是很可靠。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!