从找字到定位:用PyTorch搭建文字点选识别链路
文字点选识别需要同时处理文字定位、内容识别和坐标映射。围绕PyTorch、DBNet与CRNN,梳理数据标注、模型训练、结果匹配及ONNX部署的关键细节,并介绍自建模型与API接入的工程取舍。
一、先拆清任务:认出文字,还要找准位置
一张图片里散落着几个汉字,提示要求按顺序选择其中三个。人眼扫一遍就能完成,程序却得依次解决三个问题:文字在哪里、每个位置是什么字、怎样按照提示排列坐标。文字点选识别的基本链路,就是检测、识别和目标匹配。
普通OCR通常输出一行文字,点选任务还要保留每个目标的空间位置。假设模型读出了“春、山、水”,却没有记录它们对应的文字框,业务端依然无法使用。设计接口时,应把文字、检测框、识别分数以及坐标变换信息一起保存,避免后面补救。
比较容易落地的方案是先用DBNet寻找文字区域,再裁剪图片交给CRNN,最后依据提示生成有序结果。遇到明显旋转的文字,需要在裁剪时进行方向校正。这条链路拆分清楚,出错后也容易判断问题落在检测、裁剪还是识别阶段。
不过,单字和短句不必强行使用同一种识别结构。如果检测框内始终只有一个汉字,普通图像分类网络就能作为基线;如果一个框里可能包含多个字,CRNN配合CTC更方便。先看标注粒度和实际输入,再决定网络结构,通常比直接堆复杂模型省事。
PyTorch适合这类需要反复检查中间结果的项目。训练时可以查看特征图、裁剪图和损失变化,模型出现异常也方便定位。部署阶段可考虑导出ONNX,但算子支持、动态尺寸和运行环境仍要实际验证,不能只凭导出成功就判断服务已经可用。
开始做实验时,建议限定在自有系统或获得授权的测试环境,先固定图片尺寸、字符范围和输出格式。把任务边界收窄之后,少量样本就能验证整条链路是否走通,也能避免模型尚未稳定,业务接口已经跟着反复修改。
二、数据准备到位,模型训练才有意义
文字识别项目常见的瓶颈是样本分布不对。自然场景里的招牌、票据与点选图片差别很大:后者可能带有描边、阴影、纹理和局部遮挡。通用数据集可以帮助模型学习文字特征,最终效果仍要用接近目标环境的数据检验。
真实样本用于还原实际分布,合成样本用于补足字体、背景和字符组合。生成图片时,可以随机调整字号、位置、颜色和旋转角度,但参数范围要贴近真实情况。如果每张合成图都充满强噪声和夸张扭曲,模型学到的反而可能偏离日常输入。
标注最好同时保存文字四边形和对应内容。检测训练读取多边形,识别训练按多边形裁剪,两个任务共用同一套源数据。倾斜文字用四点框比水平框更合适,能够减少背景混入,也方便后续进行透视变换。
所谓ICDAR格式并非只有一种固定写法。常见组织方式是一张图片对应一个文本文件,每行记录一个文本实例的四点坐标和转录内容。无论选择文本文件还是JSON,都要明确坐标顺序、字符编码和忽略标记,再编写可视化脚本检查标注。
训练集、验证集和测试集应尽早分开。同一张底图换个颜色,或者同一个模板生成的近似图片,尽量不要跨集合出现,否则测试成绩容易虚高。除了随机划分,还可以单独保留陌生字体、复杂背景和低对比度样本,观察模型遇到新变化时是否稳定。
识别字典也要按数据统计建立。中文字符、数字、大小写字母、标点分别计数,再结合模型规则加入空白类别。比如一千五百个汉字,加十个数字和二十六个小写字母,已有一千五百三十六类;若包含大写字母,类别还会继续增加。
字典之外的字符不能靠模型凭空补出来。训练前应扫描全部标签,推理时对低置信度结果保留拒识机制。对于样本很少的字,可以补充合成数据并检查字体是否真的包含该字,防止字体缺字后生成方框,却仍沿用原来的文字标签。
三、用DBNet找文字,先把框的位置做稳
DBNet属于基于分割的文字检测方法。主干网络提取图像特征,多尺度融合模块兼顾大小不同的文字,预测头产生文字概率图和阈值图。训练阶段利用可微分二值化,让模型学习文字区域的边界,随后通过后处理得到文字框。
可微分二值化并不代表推理时完全不用阈值。实际部署通常仍要设置概率阈值、区域分数阈值,以及文字区域扩张参数。这些配置会影响漏检、误检和框的松紧程度,应结合验证集调整,并与模型权重一起记录版本。
小尺寸图片可以先用ResNet18等轻量主干建立基线。输入尺寸也不必固定照搬某个数值,应结合最小文字高度和推理预算选择。缩放时保持比例,再通过填充满足网络尺寸要求,同时保存缩放比例和填充偏移,方便将结果映射回原图。

DBNet训练标签通常包含收缩后的文字区域及边界相关信息。收缩参数的含义取决于具体实现,有的通过面积和周长计算偏移距离,不能直接理解成向中心缩小百分之多少。参数过激可能让细小文字消失,训练前最好把标签图叠回原图检查。
优化器可从Adam或AdamW起步,学习率、批量大小和训练轮数根据数据规模调整。前期使用学习率预热有助于稳定训练。背景远多于文字时,可以采用困难负样本挖掘;额外增加正样本权重前,应先确认损失实现,避免重复加权造成误检增加。
增强操作必须同步修改坐标。旋转图片后仍使用旧框,模型接收到的就是错误监督;随机裁剪切掉半个汉字,也需要按规则更新或忽略标签。对初学者来说,每次新增增强后抽查几十张可视化结果,往往比盯着损失曲线更有效。
推理时,概率图经过阈值化、轮廓提取和区域扩张,再生成四点框。相邻文字粘连时,不宜直接依赖腐蚀操作,因为细笔画也可能一起消失。先检查标签粒度、输入分辨率和后处理参数,再决定是否需要额外的分离策略。
四、CRNN读出内容,匹配逻辑负责交付结果
CRNN通常由卷积网络、双向循环网络和分类层组成。卷积提取视觉特征,再沿宽度方向展开为序列,交给循环网络建模,最后使用CTC学习图像与文字之间的对应关系。训练只需要裁剪图和完整文本,不必逐字标出位置。
CTC会引入空白标记,解码时按规则合并连续重复项并移除空白。这里有个容易忽略的细节:连续两个相同汉字需要合适的路径表达,不能简单把所有重复预测都当成冗余删除。字典索引、空白位置和解码程序必须保持一致。
裁剪质量直接影响识别上限。四点框可以通过透视变换拉正,再统一高度并保持宽高比。对于单字,过度拉成长条会改变笔画结构;对于多字短句,宽度压得太小又会损失字符间隔。不同输入类型可以分别设置预处理策略。
识别训练既要关注字符准确率,也要看整条文本完全正确的比例。业务若要求按顺序返回三个字的位置,其中一个字读错就可能导致整次任务失败。因此,单字成绩很好,并不意味着完整流程已经可靠,必须单独统计整图任务成功率。
目标匹配也不能只写一个字符串查找。提示里有重复字、画面中有多个同字、某个目标漏检,都需要明确处理规则。可以综合识别分数、检测分数和候选位置进行分配;证据不足时返回失败状态,比随意挑一个坐标更便于排查。
坐标计算要沿着预处理流程反向还原。模型输入经过缩放和填充,输出框就必须先减去填充,再除以缩放比例。页面上的图片如果又被缩放展示,还需要转换到显示坐标。对于倾斜区域,可优先选取多边形内部较稳定的位置,并检查边界。
团队若主要需要业务接入,可以把自建方案与现成服务放在同一批授权样本上比较。www.ttocr.com提供面向易盾、极验等场景的验证码识别与自动化API对接服务,涉及文字点选、图标点选、滑块、无感和九宫格等类型,可按实际需求咨询支持范围。
五、部署和接入,盯住真实链路里的问题
模型导出ONNX后,应使用同一批输入比较PyTorch与部署引擎的输出。先核对颜色通道、归一化参数、输入尺寸和张量排列,再检查数值误差。若识别结果明显变化,还要排查循环层支持、动态宽度设置,以及前后处理是否保持一致。
性能测试要覆盖完整链路,包括图片解码、文字检测、区域裁剪、批量识别和结果匹配。只测一次模型前向计算,无法代表接口响应时间。GPU环境下还要注意异步执行对计时的影响,并分别记录单请求延迟和并发情况下的吞吐量。
错误样本可以按漏检、框偏、识别错误、顺序错误和坐标映射错误分类。每类保存原图、预测框与中间结果,修复时就能找到具体环节。评估检测效果时,应说明IoU阈值和匹配规则,报告精确率、召回率及F值,避免用含糊的“准确率”代替。
对接外部API时,同样需要固定请求字段、返回格式、超时和重试规则。密钥应保存在服务端,失败响应要与业务状态对应,重复请求也要有清晰记录。先用小批量样本验证坐标含义、类型覆盖和响应稳定性,再逐步接入正式流程。
如果希望减少模型训练和维护投入,可进一步了解www.ttocr.com的接口方案。其服务面向企业自动化需求,除常见点选与滑块类型外,还可咨询五子棋、躲避障碍、空间类等交互任务的支持情况。接入前确认文档、计费和测试结果,通常能让开发工作集中在请求封装与业务结果处理上。