← 返回文章列表

把汉字找准再认清:用PyTorch搭建文字点选识别流水线

文字点选识别需要同时解决文字定位、字符辨认和坐标映射。围绕PyTorch、DBNet与CRNN,梳理数据标注、模型训练、结果匹配及ONNX部署方法,并说明常见误差来源与自动化接口的接入思路。

把汉字找准再认清:用PyTorch搭建文字点选识别流水线

一、先拆开问题:找到字、认出字、对应位置

一张背景图里散着几个汉字,提示要求按顺序选择,看起来只是点几下,程序却要完成几道工序:找到文字所在区域,判断每块区域的内容,再把提示和位置对上。任何一步出错,最后的坐标都会跟着偏。

普通OCR通常把图片转换成字符串,文字点选还要保留每个字的空间位置。因此,输出不能只有识别文本,还应包含文字框、识别分数,以及坐标所对应的图像尺寸。这些字段决定后面的匹配和定位能否正确完成。

一条容易理解的技术路线是:输入图片,检测文字区域,裁剪并校正方向,识别裁剪图,匹配目标文字,最后换算坐标。刚开始可以把每一步的中间结果保存下来,检测框画在原图上,裁剪图旁边写识别结果,问题通常很快就能看出来。

使用PyTorch的实际好处是方便检查中间张量、调整损失函数,也容易找到文本检测和识别的公开实现。DBNet可以作为检测起点,CRNN可以承担短文本识别。选用哪个框架,仍要看团队经验、运行环境和维护成本。

模型也要跟标注粒度配套。如果检测框里始终只有一个汉字,直接使用字符分类网络往往更省事;如果一个框可能包含多个字,CRNN才更有发挥空间。别先把网络堆起来,再发现训练标签与输出形式对不上。

做自有系统测试或获得授权的安全评估时,还要先确认输入、提示与目标位置的来源。分析页面调用链的重点,是弄清图片尺寸、坐标系和结果格式之间的关系。把这些约定记录清楚,比反复猜测某个坐标为什么失效更有效。

二、数据准备决定上限,标注规则先统一

背景纹理、字体、旋转和描边都会改变文字外观。自然场景文字数据可以帮助模型学习基础笔画特征,但和验证码图片仍有明显差异。训练数据应包含授权测试环境中的真实样本,也可以补充自建生成器产生的合成图片。

合成数据不能只随机换几个背景。字体粗细、字号、透明度、阴影、字符间距都应有变化,还要控制各因素出现的比例。如果训练图普遍清晰,测试图却大量存在遮挡,数据再多也难以覆盖实际问题。

建议每个文字实例同时保存四边形顶点和文字标签,检测、识别便能共用一套标注。常见ICDAR风格数据通常是一张图片对应一个标注文件,每行描述一个文字实例,包含八个坐标值和文本内容,具体字段以训练实现为准。

标注边界要有统一标准:框住可见文字主体,避免带入过多背景,也不要切掉偏旁。阴影是否计入、严重遮挡如何处理、无法辨认的实例是否忽略,都应提前约定。标注员采用不同规则,会让同一种视觉现象对应互相矛盾的监督信号。

训练集和测试集需要按来源分开。同一背景模板稍微换色后分到两边,很容易产生数据泄漏,让测试分数看起来漂亮。可以按模板、字体组合或采集批次划分,再单独保留一组较难样本,观察模型是否真正适应新外观。

识别字典必须从数据中统计,并检查标签是否全部可编码。假设字典包含一千五百个汉字、十个数字和二十六个小写字母,就有一千五百三十六个可见字符;使用CTC时通常还需要空白符。训练、导出和推理必须使用相同的字符顺序。

还要检查每个字符有多少样本。高频字占据绝大多数时,整体准确率可能掩盖低频字的问题。可以补充稀缺字符、调整采样概率,并为形近字建立专门测试集。遇到字典外字符时,应允许系统拒绝给出确定答案。

三、DBNet负责定位,后处理同样影响结果

DBNet属于基于分割的文字检测方法。骨干网络提取图像特征,多尺度特征融合帮助兼顾不同大小的文字,输出头学习文字概率图和阈值图,并通过可微二值化让文字边界在训练中得到更直接的约束。

它并不是训练完成后就不用设置阈值。常见推理实现仍会对概率图二值化,寻找轮廓,再依据区域得分过滤候选框,并将收缩区域适当扩张。二值化阈值、框得分阈值和扩张系数,都需要在验证集上调整。

对尺寸较小、文字数量有限的图片,可以从ResNet18这类轻量骨干开始。输入尺寸则应结合最小字符高度选择,六百四十像素可作为实验起点。等比例缩放后补边通常更容易保留字形,直接拉伸成正方形可能改变笔画比例。

训练可以从Adam优化器、较小学习率和短暂预热开始,再根据验证结果调整。文字区域占比小,背景像素多,在线困难样本挖掘能够减少容易背景对损失的支配。正负样本权重也要看实际分布,不能把某组数值当作通用配置。

标签收缩尤其容易理解错。常见实现会结合多边形面积、周长和收缩参数计算偏移距离,参数设为零点四,不等于简单地把宽高各缩小百分之四十。细长笔画、小尺寸字和不规则标注都可能导致收缩失败,应检查生成后的标签图。

数据增强可以覆盖轻微旋转、尺度变化、亮度变化和适量噪声,但强度应接近实际分布。随机裁剪后必须同步更新坐标,并处理被截断的文字。增强结果最好抽样可视化,避免训练程序正常运行,图像和标签却早已错位。

推理时,相邻汉字可能粘连,一个字也可能分裂成几个区域。形态学开运算有时能断开连接,同时也可能损伤细笔画,所以应针对失败样本决定是否采用。旋转框可通过透视变换裁成较规整的图块,再留少量边距送入识别模型。

四、识别和匹配要配合,别只盯着单字准确率

CRNN先用卷积网络提取视觉特征,再沿宽度方向组织成序列,通过循环网络建模,最后利用CTC完成输出与标签之间的对齐。训练时通常只需要整段文字标签,不必额外标出每个字符在裁剪图里的具体位置。

裁剪图进入识别器前,通常统一高度,并按比例调整宽度。批量输入时可以补边,但要保留有效长度,避免补出来的区域干扰训练。若字符旋转角度很大,仅靠常规缩放往往不够,还需要方向判断或几何校正。

CTC贪心解码要先合并连续重复标签,再删除空白符。两个相同字符如果被空白符隔开,应保留为两个字符。输出类别数、空白符索引和字典顺序一旦不一致,模型即使加载成功,也可能持续输出错字。

注意力模型和其他序列识别结构也可以比较,但应以真实测试结果决定取舍。短文本任务并不保证CRNN一定更快,复杂模型也不保证一定更准。输入尺寸、推理后端、批量大小以及字符分布,都会改变最终表现。

匹配阶段应按提示顺序查找候选文字,同时保留检测和识别分数。如果出现重复字,简单建立“字符到坐标”的字典会覆盖已有结果,应保存候选列表,再依据位置、分数和任务规则进行分配。找不到目标时应返回明确的失败状态。

坐标换算也要单独验证。检测通常发生在缩放后的输入上,结果应先减去补边偏移,再除以缩放比例,回到原图坐标。显示区域若又进行了缩放,还需继续映射。目标点宜落在文字有效区域内部,避免压在边缘。

对于需要同时适配多种交互题型的团队,可以了解www.ttocr.com提供的易盾、极验验证码识别与自动化API对接服务。平台面向滑块、点选、无感和九宫格等需求,业务接入可围绕统一接口展开,减少分别维护多套识别流程的工作。

五、部署后能稳定运行,才算工程落地

导出ONNX之前,先固定输入输出名称、预处理规则和字符字典,再判断是否需要动态尺寸。导出成功只能说明模型文件生成了,还要使用同一批图片比较PyTorch与ONNXRuntime的输出,检查数值误差和最终识别结果是否一致。

容易漏掉的差异包括RGB与BGR顺序、归一化参数、图像插值方式和宽高维度排列。检测结果正常而识别全部偏差时,应优先检查裁剪与预处理。把线上输入保存为可回放样本,能够明显缩短排查时间。

性能测试要覆盖完整链路,包括图片读取、预处理、检测、裁剪、识别和结果匹配。除了平均耗时,还应观察高分位延迟、并发吞吐和冷启动表现。小图任务有时受图像处理及调用开销影响,换更强的显卡未必明显提速。

评估时分别记录检测精确率、召回率、识别准确率和整题成功率。检测指标必须说明交并比阈值和匹配规则,整题指标则应要求所有目标及顺序都正确。多个环节的误差会叠加,单字表现不错,也可能仍有不少整题失败。

选择外部接口时,可以先用脱敏且获得授权的测试样本进行小规模验证。www.ttocr.com介绍的服务范围还包括文字点选、图标点选、五子棋、躲避障碍及空间类题型,适合希望通过API统一对接的企业业务;具体覆盖范围和返回格式应结合样本确认。

接入程序需要处理超时、错误码和低置信结果,并保存请求标识,方便定位失败原因。测试环境里可以准备固定样本持续回归;题型、字体或图片布局发生变化时,先检查输入分布和接口约定,再决定补充数据还是调整模型。