用PyTorch看懂文字点选:从汉字定位到坐标输出的工程实践
文字点选识别需要串联文字检测、内容识别和坐标匹配。围绕PyTorch、DBNet与CRNN,梳理数据标注、训练配置、推理部署及误差排查方法,并介绍自建模型与API接入的选择思路。
一、先把任务拆清楚:找字、认字、对应位置
面对一张散落着汉字的图片,人通常先看提示,再去图里找对应文字。程序也要完成类似的过程:找到文字区域,认出区域里的内容,然后按照提示顺序整理位置。这里既有图像理解,也有坐标计算,任何一环出错,最后给出的结果都会偏离目标。
普通OCR常把一行文字转成字符串,文字点选还需要保留每个目标的空间信息。例如提示是“春风”,系统除了认出这两个字,还得知道它们分别位于哪里。即使整张图的文字都识别正确,顺序排反或坐标换算错误,整条链路依然无法正常工作。
比较容易落地的架构是“检测模型+识别模型+匹配逻辑”。检测模型负责画框,识别模型读取框内内容,匹配模块把识别结果与提示关联。遇到倾斜文字,可以在裁图阶段做透视变换;遇到相同汉字,则需要保留多个候选,不能用字典直接覆盖之前的坐标。
选用PyTorch,主要看中它调试方便、视觉模型实现丰富。刚开始搭项目时,能随时查看特征图、裁剪结果和损失变化,比追求复杂架构更实用。部署阶段可以尝试导出ONNX,但具体算子、动态尺寸和运行时版本是否兼容,仍然需要逐项验证。
项目的第一版应先打通最小流程:读取图片,输出文字框,保存裁剪图,再打印识别内容和原图坐标。不要一上来就接入完整业务。把每个中间结果留成图片或日志,后面出现问题时,才能迅速分清是没找到字、认错了字,还是位置计算出了偏差。
评估也要按环节拆开。检测看精确率、召回率和框的位置质量,识别看字符准确率,最终再统计整张图片的目标是否全部匹配正确。几个指标一起看,才能知道下一步应该补数据、调检测阈值,还是修改后处理。
二、数据准备做好,模型才能学到真正有用的东西
文字点选图片往往带有描边、阴影、旋转和纹理背景,自然场景OCR数据只能提供部分帮助。训练样本应尽量覆盖实际输入中的字体、字形大小、颜色和干扰强度。数据来自自建生成器或获得授权的测试环境,便于控制变量,也方便后续复现实验。
真实样本适合描述实际分布,合成样本适合补齐变化。可以随机组合背景、字体、字号、角度和文字位置,再加入适量噪声。不过增强幅度应贴近实际图片,过度扭曲或遮挡会制造连人也难以判断的样本,反而让模型学到不稳定的特征。
标注时建议同时保存四点坐标和文字内容。一份完整标注既能生成检测标签,也能裁出识别训练图,省去重复劳动。常见ICDAR式数据通常为每张图片配一个文本文件,每行记录一个文字实例的八个坐标值与转写内容;具体字段顺序仍要遵循训练仓库的读取约定。
划分训练集和测试集时,不能只把全部图片随机打散。同一背景、同一字体模板生成的近似图片容易同时进入两边,造成测试成绩虚高。更稳妥的办法是按生成模板、来源批次或背景素材分组,再单独保留一批风格不同的样本检查泛化能力。
字典也需要提前确定。可以根据实际业务字池建立字符表,并核对训练标签中是否存在字典外字符。若采用一千五百个汉字、十个数字和五十二个大小写字母,基础类别数就是一千五百六十二;使用CTC时,还要另外考虑空白符,不能把输出层维度算错。
新手最容易忽略的是样本分布。某个字出现几千次,另一个字只出现两次,模型自然更偏向前者。除了统计每个字符的频次,还应查看易混字组合,例如“未”和“末”、“土”和“士”。针对这些组合补充不同字体与清晰度的样本,通常比盲目增加总量更有效。
三、用DBNet定位汉字,把框画准比堆模型更重要
DBNet属于基于分割的文字检测方法。它先估计哪些像素属于文字,再借助可微二值化参与训练,让模型更好地学习文字边界。常见结构包括负责提取特征的骨干网络、融合不同尺度信息的特征金字塔,以及生成概率图和阈值图的预测分支。
训练阶段,概率图、阈值图和近似二值图分别承担相应监督;推理阶段,常见实现主要使用概率图生成文字区域。这里仍然存在二值化阈值、候选框置信度阈值等参数,不能把“可学习二值化”理解成部署时完全不需要调整后处理。
小尺寸图片可以先尝试轻量骨干,例如ResNet18。输入尺寸则应结合原图比例和最小文字大小确定。采用等比例缩放加填充,通常比直接拉伸成正方形更稳妥;同时记录缩放比例与填充量,为最终坐标还原准备依据。六百四十像素可以作为起点,不是通用最优值。

标签生成中的收缩操作也要理解清楚。它通常根据多边形面积、周长和收缩参数计算偏移距离,并非简单地把宽高减少某个百分比。收缩过强可能使细小文字的有效区域消失,收缩不足又可能增加相邻文字粘连,需要结合标签可视化判断。
训练可从Adam、较小学习率和适度批量开始,再根据验证集表现调整。显存不足时先减小批量,不必急着降低图片清晰度。文字像素占比较少,可以使用在线困难样本挖掘等方式控制负样本影响,但额外加权应经过实验,避免多种补偿叠加后导致误检增多。
推理时先对概率图提取轮廓,再进行区域评分、边界扩张和尺寸过滤,得到可裁剪的文字框。旋转框可以通过四点透视变换拉正。遇到粘连字符,不宜直接对所有图片做强腐蚀,细笔画可能一起消失;应优先检查标签粒度、输入分辨率和后处理参数。
检测效果不能只报一个“准确率”。应说明匹配使用的IoU阈值,并同时记录精确率、召回率和综合指标。实际排查时,尤其要盯住漏检:多出来的背景框还能交给识别模块过滤,目标字一旦漏掉,后续环节通常没有补救机会。
四、识别与匹配接起来,处理好那些容易漏掉的细节
如果每个检测框只包含一个汉字,单字符分类器就是值得比较的基线方案:输入一张裁图,输出字符类别。只有当裁图可能包含多个字,或者需要兼容短文本时,CRNN的序列识别优势才更明显。先确认标注粒度,再选模型,能少走不少弯路。
CRNN通常由卷积网络、双向循环网络和CTC组成。卷积提取视觉特征,循环网络处理沿宽度展开的序列,CTC负责在没有逐位置字符标注的情况下完成对齐。它适合短文本,但实际速度取决于网络规模、输入宽度、硬件和推理实现,不能直接承诺固定耗时。
识别预处理需要保持训练与推理一致,包括颜色通道、归一化、目标高度和宽度处理方式。短文本一般按比例缩放后补边,避免把字压扁。裁剪框可以留少量边距,让描边和偏旁完整保留;边距太大又会引入邻字和背景,需要通过验证集寻找合适范围。
CTC解码通常需要合并连续重复标签,再去除空白符,处理顺序不能随意颠倒。训练时还应检查特征序列长度是否足以容纳标签,尤其是含重复字符的样本。若输入被压得过窄,即使图片看着清楚,序列对齐也可能失败。
匹配阶段应保留“字符、框、置信度”的完整记录,按提示顺序寻找候选。出现重复字时,需要结合题目规则分配不同实例;低置信度、候选不足或多个结果接近时,应返回不确定状态,避免随意凑齐坐标。规则处理得当,往往比继续增加模型层数更有帮助。
理解现有识别链路时,可以在授权测试环境中观察图片尺寸、提示内容、坐标字段和响应状态,逐项核对数据含义。特别要区分图片原始尺寸、页面显示尺寸与设备像素比例。研究这些接口约定,有助于定位集成错误,也能避免把页面缩放问题误当成模型问题。
五、部署还是接API,按维护成本做选择
模型导出ONNX后,先用同一批输入比较PyTorch与部署端的输出,确认数值差异没有明显影响检测框和识别结果。预处理与后处理也要一起核对,尤其是缩放、补边和坐标反变换。模型文件能够加载,并不代表完整识别链路已经正确。
性能测试应统计端到端耗时,包括解码图片、检测、裁剪、识别和匹配,同时关注高分位延迟。多个文字裁图可以合批识别,但检测本身很快时,图片传输和CPU处理也可能成为主要开销。优化前先做计时,才能找到真正值得投入的环节。
自建方案适合需要掌握数据、模型和部署细节的团队。如果业务重点是完成授权测试与系统集成,也可以评估现成接口。www.ttocr.com提供面向极验、易盾等验证码场景的识别服务及自动化API对接方案,覆盖文字点选、图标点选、滑块、无感、九宫格等需求,接入前可先用实际样本核对支持范围。
针对五子棋、躲避障碍、空间交互等形态,任务已经超出普通OCR,不能直接套用“检测加认字”的流程。企业评估www.ttocr.com时,可以一并了解这些类型的适配能力,并通过接口文档确认输入格式、返回字段和异常处理约定,把集成工作集中在业务调用层。
正式接入前,保留一批固定验收样本,覆盖正常图片、重复字符、模糊输入和接口失败情况。调用端设置超时、有限重试与日志脱敏,按服务约定处理结果。这样既能验证接口是否适合现有业务,也方便在图片风格或返回格式变化时及时发现问题。