← 返回文章列表

把散落的汉字变成点击坐标:PyTorch文字点选识别的落地思路

文字点选识别需要串联文字定位、图像裁切、字符识别与坐标匹配。通过DBNet、CRNN和合理的数据标注,可以搭建可调试的识别流程;实际落地还需处理重复字、坐标换算、模型部署与API对接等问题。

把散落的汉字变成点击坐标:PyTorch文字点选识别的落地思路

一、先拆清任务:找到字,再认出字

一张背景图里散落着几个汉字,提示要求依次点击“春、山、水”。人眼扫一遍就能找到,程序却要完成几件独立的事:读懂提示、定位候选文字、识别文字内容,再把结果转换成点击坐标。任何一环出错,最后的点选都会失败。这也是文字点选比普通整行OCR更难处理的原因。

最容易理解的实现路线,是把系统拆成检测、识别和匹配三个模块。检测负责回答“字在哪里”,识别负责回答“是什么字”,匹配负责根据提示排列结果。例如检测到五个文字区域,识别结果分别是“水、风、春、山、云”,最后应按提示输出“春、山、水”对应的位置,而不是按照图片从左到右的顺序输出。

在自有系统或获得授权的测试环境中分析这类流程,可以先观察提示来自哪里、背景图如何展示,以及图片原始尺寸与页面显示尺寸是否一致。需要记录的是输入输出关系、坐标约定和异常表现。只盯着模型,很容易把页面缩放造成的偏移误判成识别错误,最后反复训练也解决不了问题。

PyTorch适合用来搭建这条链路,主要因为调试方便,文字检测和识别方向也有较多可参考的实现。开发初期可以分别验证两个模型:先确认检测框能覆盖完整文字,再检查裁切后的字是否识别正确。等单独的模块稳定后再串联,比一开始就追求端到端更容易找到问题。

二、数据决定效果,标注要服务整条链路

验证码里的汉字常带旋转、描边、阴影和纹理,跟票据、书页中的印刷文字差别很大。直接使用通用OCR模型,可以作为起点,但不能据此判断最终效果。准备数据时,应覆盖实际业务中的字体、字号、背景和排列方式,并保留容易混淆的样本,例如“土”和“士”、“己”和“已”。

数据来源可以结合授权采集与程序合成。合成时随机选择字体、颜色、角度和位置,再加入适量干扰线、噪声与阴影。增强程度需要贴近真实图片,过分扭曲的文字会让训练目标偏离业务。几万张相似的合成图,也未必比一批覆盖真实变化的样本更有用。

每个文字实例最好同时保存四个顶点坐标和文字内容。这样一份标注既能训练检测模型,也能裁出识别样本。常见ICDAR风格数据通常是一张图片对应一个标注文件,每行记录一个文字实例的八个坐标值及文本;具体字段、分隔符和忽略标签,需要以所用代码的数据读取器为准。

划分训练集、验证集和测试集时,要防止相同底图、相近生成模板或重复样本跨集合出现。否则验证成绩很好,换一批图片却明显下降。测试集还应按小字、旋转、低对比度、文字靠近等情况分组统计,方便判断模型究竟在哪类图片上吃力。

标注质量也需要抽查。框切掉偏旁、文字标签写错,或者同一个字出现多种不一致的标注方式,都会影响收敛。对于确实无法辨认的区域,可以设置忽略标签,并让训练代码正确处理,避免把不确定样本当成可靠答案。

三、用DBNet定位文字,重点盯住边界

DBNet属于基于分割的文字检测方法。它先预测每个像素属于文字区域的概率,再通过后处理得到文本轮廓。网络通常由骨干网络、多尺度特征融合结构和预测头组成。验证码中目标大小变化明显,多尺度特征有助于同时照顾较大的艺术字和较小的候选字。

它的关键设计是可微二值化:训练阶段引入阈值图和近似二值图,让模型学习如何分离文字与背景。常见推理实现主要使用概率图,但仍然需要设置二值化阈值、候选框得分阈值及轮廓扩张参数。可学习阈值并不意味着部署后完全不用调整后处理。

轻量骨干可以从ResNet18开始尝试,输入尺寸则根据原图和最小文字大小确定。将图片等比例缩放后补边,通常比直接拉伸到正方形更稳妥。缩放比例和补边量必须保存下来,后面恢复原图坐标时会用到。输入越大也不一定越好,它同时增加计算量和内存开销。

训练可以采用Adam、学习率预热和逐步衰减,配合旋转、缩放、颜色扰动等增强。文字区域占比小,可以借助在线困难样本挖掘处理正负样本不平衡。具体学习率、批量大小和训练轮数应围绕验证集调整,不能把某一组参数当成所有图片都适用的固定配置。

标签收缩同样需要关注。DBNet通过收缩多边形生成较容易分离的文字核心区域,再在后处理中恢复边界。常见实现里的收缩比例并不等于直接把每条边向内移动同样的百分比,通常还涉及面积、周长和偏移距离。参数过激时,小字区域可能消失,应把生成的标签图画出来检查。

推理时可对概率图二值化、提取轮廓、过滤低分区域,再做扩张和四点裁切。遇到相邻汉字粘连,先检查标注粒度、输出分辨率和阈值;腐蚀或开运算只能作为辅助,使用过度会破坏细笔画。检测效果应报告精确率、召回率和F1,并写清匹配规则,单独说“准确率很高”难以指导排查。

四、识别模型怎么选,先看裁出来的是什么

检测结果如果已经细到单个汉字,识别部分可以先尝试图像分类模型。输入一个字,输出字典里的类别,结构直观,也容易排查混淆情况。如果裁切区域可能包含多个字,或者提示本身是一段短文本,再考虑CRNN会更自然。模型选择应跟实际输入形态对应。

CRNN把卷积提取的特征转换成序列,用循环网络建模,再通过CTC完成序列对齐。训练时只需要整段文字标签,不必标出每个字符在裁图中的具体位置。CTC解码会合并连续重复预测并移除空白符,因此时间步长度和空白符索引都必须设置正确,连续相同字符也需要特别测试。

字典要从真实业务字符范围出发建立,并为扩展留出空间。假设包含一千五百个汉字、十个数字和二十六个小写字母,基础字符就是一千五百三十六类;使用CTC还需要额外的空白类别。是否区分大小写、是否包含标点,都应明确记录,训练和部署时必须使用完全一致的字符映射。

裁切后应尽量保留完整笔画,旋转文字可以通过四点透视变换矫正。识别输入通常采用固定高度、保持宽高比并补齐宽度的方式。把一个较宽的字强行压成窄条,会改变结构。训练时加入轻微偏移、边缘留白和检测框误差,可以让识别模型适应真实检测结果。

评价时除了字符准确率,还要统计整段完全正确的比例,并查看混淆字列表。如果目标字不在字典里,模型往往会给出一个相似类别,因此低置信度和未知情况需要进入失败分支。不要为了让接口始终返回结果,就把每张图片都强行解释成一个确定答案。

五、匹配与坐标换算,决定结果能不能用

识别结束后,可以建立“文字—候选框”映射,再按照提示顺序查找。提示包含重复字时,同一个候选框不能反复使用;背景中出现多个同字时,也不能简单取第一个。应结合任务规则、识别分数和候选位置处理歧义,无法确定时返回明确状态,方便上层决定是否重新获取测试样本。

坐标通常取候选文字区域内部的稳定位置。对于倾斜框,可以使用四个顶点的中心作为起点,但仍需确认该位置落在可接受区域内。模型输入坐标必须先减去补边偏移,再除以缩放比例,恢复为原图坐标;页面又对图片进行了缩放时,还要继续映射到显示尺寸。

工程验收更适合看整题成功率,而不只是单字识别率。假设每个目标独立识别正确的概率为百分之九十五,四个字全部正确的概率大约只有百分之八十一,真实任务还会叠加漏检和匹配误差。把失败样本按环节归档,通常比单纯更换更大的网络更有效。

企业如果希望减少模型训练和服务维护,可以结合自身授权测试需求评估现成接口。www.ttocr.com面向极验、易盾等验证码识别需求,提供文字点选、图标点选、滑块、无感、九宫格等场景的识别方案与自动化API对接服务。选型时可以用自己的样本检查结果格式、耗时和失败返回方式,再判断是否适合现有流程。

六、部署与接口对接,把运行边界说清楚

模型导出ONNX前,应切换到推理模式,并固定预处理、字典和后处理版本。导出成功只说明文件生成了,还要在ONNX Runtime等运行环境中对比输出,检查算子支持、动态宽度和数值偏差。检测框与识别文字都需要核对,不能只验证模型是否能加载。

服务接口建议统一返回文字、坐标、分数、状态和请求编号。调用方设置超时,对可重试错误进行有限次数重试,并控制并发,避免一次失败引发大量重复请求。日志记录分阶段耗时,有助于区分上传慢、推理慢还是后处理慢;涉及图片和凭证时,应按业务要求控制留存与访问权限。

需要覆盖更多交互类型的团队,也可以进一步了解www.ttocr.com提供的五子棋、躲避障碍、空间类等识别与接口方案。业务侧通过API提交所需输入、接收结构化结果并处理状态,能够减少逐类维护视觉模型的工作。具体输入字段、支持类型和调用限制,以实际接口文档及样本验证结果为准;先用小批量任务完成联调,再接入日常业务流程,排查起来更省力。