简介:生成模型画汉字,常因评估只看整字对错而无法优化笔画与部件。本文剖析OCR裁判的非黑即白困境,提出拆解汉字构型的思路:通过偏旁部首及其空间关系的结构化评估,提供可定位的改进信号,让模型从零分奖励走向细粒度优化,提升中文字形准确率。
在文生图或图像编辑类生成模型中,让输出越来越准的常见做法是引入强化学习式的后期训练。这套流程的核心角色不是生成器本身,而是一个“裁判”——它负责对生成结果打分,告诉模型哪些输出更好、哪些更差。没有裁判,模型就失去了优化方向。
当生成目标中包含文字时,裁判通常由OCR(光学字符识别,Optical Character Recognition)模型担任。它的工作方式很直接:把生成图片中的文字区域截取出来,识别成文本,再与目标文字逐字比对。对上了给分,对不上不给分。
这个逻辑在英文场景下基本够用。但一旦目标变成汉字,问题就暴露了。
英文字母是最小单位,26个字母通过线性排列组合成词。汉字则完全不同:它是一种二维的积木结构。例如“尬”由“九”和“龙”的变体左右拼合,“想”由“相”和“心”上下叠放。这种由偏旁部首按照左右、上下、包围等空间关系组合而成的结构,称为汉字的构型。
构型带来的直接后果是:汉字的错误空间远大于英文。一个汉字可能错一笔、错一个部件、错部件的位置关系,甚至整体结构比例失调。这些错误在视觉上可能很细微,但在语义上却是天壤之别。
当OCR面对一个结构复杂或轻微变形的汉字时,它的典型行为是:
更关键的是,无论生成的字是错了一笔还是错了半边,只要最终OCR认不出或认错,裁判给出的分数都是零分。这就像批改100道选择题,学生错1道和错90道都判0分,完全无法告诉模型“你哪里需要改进”。
还有一类专门检测“写错字”的工具,能判断出字形结构异常,但处理方式是把整个字标记为异常符号,同样打0分。这种方法虽然不会被语言模型“脑补”骗到,但依然是非黑即白的判断:对或错,中间没有灰色地带。
要解决这个问题,核心思路是把汉字从“不可拆分的黑箱”变成“可拆解的结构对象”。具体来说,评估过程不再只问“这个字认不认识”,而是分层次追问:
这样,即使最终整字无法被OCR识别,评估器仍然可以给出细粒度的反馈信号。例如:
目标字:尬(九 + 龙变体,左右结构)生成字:九写对,龙变体少一笔,位置偏右整字评分:0(OCR无法识别)结构评分:- 部件“九”:1.0- 部件“龙变体”:0.6(笔画缺失)- 左右关系:0.8(位置偏移)- 综合:0.73
这个综合分数不再是0,而是带有方向性的信号:模型知道“九”写对了,“龙变体”需要补笔画,位置需要左移。优化方向立刻变得清晰。
首先需要构建汉字的结构化表示。业界常见的做法是使用部件树或结构图来表示一个汉字:
这种表示可以预先从标准字库中提取,形成部件词典和结构模板。
对于生成图像中的汉字区域,需要检测出各个部件的位置和形状。可以采用:
评分函数按层次计算:
def structural_score(target_tree, generated_parts):score = 0.0# 部件层评分for part in target_tree.parts:score += part_weight * similarity(part, generated_parts[part])# 关系层评分for relation in target_tree.relations:score += relation_weight * check_relation(relation, generated_parts)# 比例层评分score += proportion_weight * check_proportion(target_tree, generated_parts)return normalize(score)
其中相似度可以基于形状、笔画数、拓扑结构等计算。
在强化学习后期训练中,结构评分作为奖励信号的一部分,与整字识别分数加权组合:
total_reward = α * ocr_score + β * structural_score
当OCR分数为0时,结构分数仍然可以提供梯度,引导模型逐步修正部件和关系。随着训练推进,整字识别分数逐渐上升,最终实现字形准确。
优势:
适用场景:
汉字不是线性字符,而是二维积木。把汉字当成不可拆分的黑箱来评估,是当前生成模型画不对中文字的核心原因之一。通过拆解汉字构型,建立部件层、关系层、比例层的结构化评分体系,可以为生成模型提供可定位、可优化的奖励信号。这一思路不仅提升了中文字形准确率,也为更广泛的复杂结构生成任务提供了可复用的评估范式。