简介:针对文生图模型常写错汉字的问题,本文剖析传统OCR评估“非对即错”的根本缺陷:将汉字视为不可拆分的黑箱,导致错误程度无法区分、模型难以定向优化。文章提出以构型分析为核心的细粒度评估思路,拆解偏旁部首与空间关系,给出可落地的评分维度与训练反馈机制,帮助开发者提升中文文字生成质量。
让文生图模型生成一张带中文文字的海报,结果往往呈现出一种高度一致的模式:远看整体布局合理、字形轮廓依稀可辨,凑近细看则问题丛生——某个字多了一撇,某个偏旁被压缩成难以辨认的形状,左右结构被挤成上下堆叠,笔画交叠处粘连成一团。这类失败并非个别模型的偶发缺陷,而是当前文生图能力在面对笔画复杂、结构密集的汉字时的普遍表现。
值得追问的是:为什么模型“知道”这里应该有个字,却“画不对”这个字?除了模型自身的表征能力限制之外,一个长期被忽视的环节是评估方式本身。训练后期常采用强化学习对生成结果进行优化,而优化的方向完全由“裁判”的打分决定。如果裁判看不清楚问题在哪,模型自然也就学不到该往哪里改。
常见的做法是引入光学字符识别(OCR)模型作为奖励信号来源:从生成图像中裁剪出文字区域,送入OCR识别,将识别结果与目标文字做字符串比对,一致则给予正向奖励,不一致则奖励为零。
这套逻辑在处理英文时基本可用。英文的最小单位是26个字母,单词由字母线性排列构成,识别错误通常表现为字母级别的替换,比对结果尚能反映部分正确性。但汉字完全不同。
汉字的最小结构单位不是“字”,而是偏旁部首及其空间组合关系。例如左右结构的字由两个部件横向排布,上下结构的字由部件纵向叠放,还有包围、半包围等复合关系。这种由部件按照特定空间关系组合而成的整体结构,通常称为汉字的构型。
OCR模型在面对构型复杂的汉字时,常见的行为有三种:
前两种情况下,无论生成结果是错一笔还是错半边,只要最终识别不通过,得分统统为零。这就好比批改一份 hundred 题的试卷,学生错一道和错九十道得到相同的零分,反馈信号完全无法指示“错在哪里、错了多少”。
更棘手的是假阳性问题。当使用具备语言先验的多模态模型作为裁判时,模型可能依据上下文语境“推断”出正确的字,从而给出正向奖励,但图像上的字形实际上是错的。这类奖励信号会直接误导训练方向,让模型学会“只要语境对,字形可以糊弄”。
而专门的文字错误检测工具虽然能判断结构异常,但处理方式通常是将异常字符整体标记为特殊符号并判零分,本质上仍是非黑即白的二值判断。汉字的错误本来就有程度之分:缺一笔、多一笔、部件位置颠倒、部件比例失调、笔画粘连,这些错误的严重性和修正难度各不相同,但现有评估体系无法区分。
要解决上述问题,评估信号必须从“整字级二值判断”下沉到“部件级与关系级的结构分析”。核心思路可以概括为三个层次。
将目标汉字拆解为部件序列,逐一检查每个部件是否在生成图像中完整出现。例如左右结构的字,需要确认左侧部件与右侧部件均存在,且各自的关键笔画没有缺失或多余。
这一层输出的是部件级的召回情况:哪些部件被正确生成,哪些部件缺失,哪些部件出现了笔画增删。
部件齐全不等于结构正确。两个部件都存在,但左右排布被画成上下叠放,或者包围结构的内部部件跑到了外面,字形依然是错的。因此需要在部件检测的基础上,判断部件之间的相对位置关系是否符合目标构型。
可用一个简化的关系判定表示:
def structure_score(parts_detected, target_layout):# parts_detected: {部件名: 边界框}# target_layout: 期望的空间关系,如 ("左", "右") / ("上", "下") / ("外", "内")score = 0.0for (a, b), relation in target_layout:if a not in parts_detected or b not in parts_detected:continueactual = infer_relation(parts_detected[a], parts_detected[b])score += 1.0 if actual == relation else 0.0return score / len(target_layout)
这类关系判定不依赖整字识别,因此不会因为整体字形“不像任何合法汉字”而失效。
在部件与关系都正确的前提下,进一步度量笔画层面的偏差,包括笔画数量差异、关键笔画的位置偏移、笔画间的粘连程度等。这一层可以使用图像层面的距离度量或笔画骨架比对来实现,输出的不再是0/1,而是连续的打分。
三层组合后,评估结果从单一标量变为一个结构化向量:部件召回率、关系正确率、笔画偏差度。这个向量既能作为强化学习的奖励信号(通过加权组合为连续奖励),也能作为诊断信息告诉开发者——当前模型主要错在部件缺失,还是错在空间关系混乱。
将细粒度评估接入训练流程时,有几个工程上需要注意的问题。
奖励塑形(reward shaping)。直接将三层分数加权求和作为奖励,需要谨慎设计权重,避免模型为追求部件齐全而牺牲整体协调性。建议保留一个整字可读性的兜底项,但降低其在总奖励中的占比,让梯度更多来自结构层面的差异。
评估器的一致性。部件检测与关系判定本身也可能出错,需要保证评估器在不同分辨率、不同字体风格下的判定稳定性。可通过在评估器训练数据中覆盖多字体、多字号、多背景的样本提升鲁棒性。
与人工抽检结合。细粒度分数便于自动化,但不能完全替代人工判断。建议在训练早期以人工标注校准评估器的打分分布,避免奖励信号系统性偏置。
评估成本控制。三层评估的计算开销高于单次OCR识别,可在训练中采用采样策略:对高置信度样本使用快速通道,对低分或边界样本启用完整的三层分析。
汉字生成的难点不仅在生成侧,也在评估侧。将汉字视为不可拆分的黑箱,用整字识别的对错作为唯一奖励,等于放弃了错误程度这一关键信息。把评估拆解到部件完整性、空间关系正确性与笔画偏差三个层次,既能提供更平滑的奖励信号,也能为模型优化指明具体方向。对于从事中文文字生成相关工作的开发者而言,评估方案的设计应当与模型结构设计获得同等重视——毕竟,裁判看不清的地方,选手也很难练对。