简介:在文本生成图像的评估链路中,OCR常被当作“裁判”来打分,但传统OCR对汉字构型缺乏细粒度感知,导致奖励信号粗糙甚至失真。本文从汉字二维构型出发,分析OCR评分失效的根因,并拆解一种更合理的结构化评判思路,帮助开发者在训练与评估中建立更稳定的反馈机制。
在文本生成图像、手写体合成、字体迁移等任务中,为了让模型生成的画面更准确,业界普遍采用强化学习做后期训练。强化学习的关键在于奖励信号:模型每生成一张图,就需要一个“裁判”来判断结果好不好。这个裁判通常由OCR模型担任。
OCR,全称Optical Character Recognition,即光学字符识别。它的任务是把图片中的文字区域识别成计算机可处理的文本序列。用OCR做裁判的逻辑看起来非常自然:将生成图片中的文字区域裁剪出来,送到OCR模型里识别一遍,再把识别结果与目标文字做比对。如果完全一致,就给一个正向奖励;如果不一致,就给零分或负向奖励。
这个逻辑对英文等线性文字体系来说,问题不大。英文字母数量有限,26个字母组合成单词,OCR识别粒度与任务目标基本对齐。错误类型也比较清晰:字母识别错、字母顺序错、漏字母或多字母。即便一个单词只错一个字母,OCR也能给出“接近但不完全对”的信息,因为整词识别结果仍然保留了大量可区分的局部特征。
但把同样的思路搬到中文场景,问题就变得棘手起来。
理解这个问题之前,需要先明确汉字与英文在结构上的本质差异。
英文单词是一维线性序列。单词“hello”由h、e、l、l、o五个字母按固定顺序排列,识别过程可以理解为从左到右逐字符扫描,局部错误和整体错误之间存在连续梯度。
汉字则完全不同。汉字是一种二维的积木式结构。一个汉字往往不是最小的不可再分单元,而是由多个偏旁、部首或构字部件按照特定空间关系组合而成。
以“尬”字为例,它并不是一个孤立的符号,而是由“九”和“龙”的变体两个部件左右排布而成。再比如“想”字,上部是“相”,下部是“心”,呈上下叠放关系。更复杂的汉字还会出现包围结构,如“围”“国”“问”,以及左中右、上中下、品字形等多种空间布局。
这种由偏旁部首按照左右、上下、内外、包围等空间关系组合而成的结构,在文字学中称为汉字的构型。构型信息是汉字的重要特征,它不仅决定了一个字的视觉形态,也承载了字义和字音的线索。
正是因为这种二维构型,汉字的识别难度远高于简单线性文字。同一个部件出现在不同位置、与不同部件组合,会形成完全不同的字。“木”可以出现在左侧成为“林”的一部分,也可以出现在上方成为“杏”的一部分,还可以作为底部支撑“桌”字。部件相对位置稍有变化,整字含义就可能截然不同。
当OCR模型面对这类复杂结构时,往往出现两种典型失效模式。
第一种是把整个字直接判断为一个不认识的东西。OCR模型如果对某个汉字的构型组合缺乏足够的训练样本,或者该字的结构过于复杂,模型可能无法将其映射到任何已知字符上。此时它要么瞎猜一个形近字,要么直接放弃输出空结果。
第二种是“整体失分”。无论AI生成的字是只错了一笔,还是整个半边都写错了,只要OCR最终无法正确识别,裁判给出的分数都可能是零分。这种情况下,奖励信号失去了区分度。
打个比方:你在批改一份一百道选择题的试卷,但不管学生是错一道题还是错九十道题,最终给出的分数都一样,统统是零分。学生无法从这个分数中知道自己到底哪里做得还可以,哪里需要改进。强化学习模型同样如此。当奖励信号完全没有梯度时,模型无法判断自己的生成结果是“差一点就对了”还是“错得离谱”,训练过程就会变得低效甚至不稳定。
这个问题的本质在于:传统OCR模型的输出层设计目标是“整字识别”,而不是“构型评估”。它的输出是一个完整的字符ID或字符序列,中间过程对构型部件的感知并没有被显式暴露出来。因此,当它被拿来做奖励函数时,就天然丢失了汉字的细粒度结构信息。
要解决这个问题,一个自然的技术方向是:不再把汉字当成不可拆分的黑箱,而是让评判系统显式地理解汉字的构型。
具体来说,可以从以下几个层面拆解。
将每个汉字拆成若干个基础部件。以“想”字为例,可以拆解为“相”和“心”两个一级部件,其中“相”又可以进一步拆解为“木”和“目”。这种拆解形成了一棵层级树,树的叶子节点是最小的不可再分笔画或部首单元。
在评估阶段,可以分别检查每个部件是否被正确生成、位置是否准确。这样,即便整字识别失败,系统仍然能够指出“左半边是对的,右半边出了问题”,从而给出一个介于零分和满分之间的连续奖励值。
光拆出部件还不够。汉字的构型不仅包括“有哪些部件”,还包括“这些部件怎么摆放”。同样两个部件,左右摆放是“明”,上下摆放就是“萌”的一部分。因此,评估系统需要对部件之间的空间关系进行建模。
空间关系可以抽象为几种基本类型:左右结构、上下结构、左中右结构、上中下结构、半包围结构、全包围结构、品字形结构等。对于每一种结构,可以定义对应的参考模板。评估时,将生成图中的部件布局与参考模板进行比对,得到空间关系层面的相似度。
在部件级之上做进一步细化,还可以引入笔画级的比对。一个部件是否书写正确,可以通过比对笔画数、笔画走向、交叉点数量、端点位置等特征来判断。这种方法更接近人类对书写的评价方式:一个字写得对不对,首先看结构的架设是否合理,其次看每个笔画是否规范。
笔画级比对的好处是,它可以捕捉到“只差一笔”这种极其细微的错误。对于强化学习训练来说,这种细粒度差异形成的梯度信号非常珍贵。
有了上述拆解能力之后,就可以重新设计奖励函数。
一种可行的做法是将奖励分为多个层次,逐层加权求和。比如:
total_reward = alpha * stroke_score+ beta * component_score+ gamma * layout_score+ delta * whole_char_score
其中:
这种分层评分机制的核心优势在于,即使整字识别失败,模型仍然可以从 stroke_score、component_score 和 layout_score 中获得有效的梯度信息,从而知道自己的生成结果在哪些维度上接近目标,在哪些维度上偏离较大。
对于训练早期,模型生成质量较差,整字识别率低,此时细粒度得分占主导;随着训练推进,生成质量逐步提升,整字识别率上升,此时可以适当提高 whole_char_score 的权重,让模型把注意力转向全局正确性。
实现这类结构化评判系统,需要构建相应的数据与特征工程能力。
需要一个覆盖常用汉字的构型拆解库,记录每个字的部件组成、空间结构类型以及层级关系。这个知识库可以由语言学规则驱动,也可以结合大规模标注数据构建。对于生僻字或结构存疑的字,可以采用人工审核的方式保障准确性。
要对生成图中的汉字进行细粒度评估,首先需要在图像层面定位各个部件的位置。这里可以借用目标检测的思路,训练一个部件定位模型。该模型的输入是文字图像,输出是各部件的位置框、类别以及置信度。
在获得部件位置之后,还需要判断这些部件的空间关系是否符合该字的构型模板。比如对于左右结构,判断两个部件的相对位置是否满足左右关系;对于上下结构,判断上下边界是否基本对齐。空间关系推理可以由规则引擎完成,也可以由一个小型分类模型完成。
在实际工程落地中,可以走一个渐进式路径。
第一阶段,先基于整字OCR打分运行基础训练。此时模型能快速学会生成一些简单字,但对于复杂构型字的生成能力有限。
第二阶段,引入部件级辅助评分。利用汉字拆解知识库,将训练目标中出现的复杂字拆解为部件序列,结合部件检测模型给出部件层面的准确性反馈。此时奖励函数可以写成整字分数与部件分数的加权和。
第三阶段,再叠加空间关系评分。对部件的相对位置进行校验,特别关注包围结构、上下结构等容易出现位置偏差的类别。
第四阶段,在以上基础上做强化学习的策略优化。由于奖励信号从稀疏的零一信号变成了多层次的连续信号,训练稳定性与收敛速度都会得到改善。
这个思路虽然清晰,但在实际应用中还有几个问题需要关注。
第一,拆解粒度需要与业务需求匹配。如果应用场景对字级精度要求极高,比如书法生成、碑文字体复刻,笔画级拆解就非常必要;如果只是普通场景的文字清晰度保障,部件级拆解加整字识别可能已经足够。
第二,细粒度评分的计算成本不能忽视。笔画级比对、部件级检测都会带来额外的推理开销。如果训练数据规模很大,这部分开销可能成为瓶颈。可以考虑将细粒度评判做成离线批处理流程,或者只在训练的关键阶段启用。
第三,评分模型本身也需要评估和迭代。如果部件检测模型本身准确率不高,它提供的细粒度奖励信号可能反而引入噪声。因此,在接入训练链路之前,需要对评分模块进行独立的准确率验证和误差分析。
把汉字拆开看结构,本质上是在纠正一个长期被忽视的问题:OCR识别适合做最终验收,但不一定适合做训练过程中的唯一裁判。对于中文文本生成图像这类任务,单一维度的零一打分无法提供足够的训练信号,而基于汉字构型的结构化拆解,则为奖励函数设计提供了一条更细腻、更合理的路径。
这种思路的延伸价值也不限于文本生成图像。在字体风格迁移、古籍文字修复、手写体合成、中文场景下的OCR鲁棒性评测等方向,构型感知的评判机制都有可能带来新的质量提升空间。与其让模型在黑箱里试错,不如先拆开汉字的结构,把反馈信号做得更清楚一些。