点哪里、认什么:用PyTorch搭起文字点选识别流水线
文字点选识别需要同时解决汉字定位、内容判断和坐标映射。围绕PyTorch、DBNet与CRNN,梳理数据标注、模型训练、提示匹配和ONNX部署方法,并介绍复杂验证码场景下的API接入思路。
一、先把任务拆开:找字、认字、按顺序定位
一张图里散落着几个汉字,提示要求依次选择“春、风、来”。人眼扫一遍就能找到位置,程序却要完成几道工序:判断哪里有字,认出字的内容,再把结果排成提示要求的顺序。任何一步出错,最后给出的坐标都可能落错地方。这也是文字点选比普通整行OCR更难处理的原因。
工程上可以把它拆成两个模型和一段匹配逻辑。检测模型负责输出文字框,识别模型读取每个框里的内容,匹配程序再把提示字符对应到坐标。比如检测得到五个候选字,就先保存每个候选的文字、位置和置信度,再依次查找“春”“风”“来”,形成有序结果。
背景里的字往往带着旋转、描边、阴影,还会与纹理和干扰线交叠。检测阶段容易把相邻汉字粘在一起,识别阶段容易混淆“未”和“末”。因此,排查问题时要保存中间图片:原图、检测框、裁剪结果、识别文字各看一遍,通常比盯着最终成功率更容易找到原因。
PyTorch适合这类需要反复试验的项目。训练时可以检查张量尺寸、观察损失变化,也能方便地替换骨干网络。检测可从DBNet起步,识别根据裁剪内容选择单字分类器或CRNN。先用少量样本跑通数据读取、推理和坐标还原,再扩大训练规模,问题会更容易定位。
还要提前明确输入输出。输入除了背景图,可能还有文字提示图;输出除了点击坐标,也应包含候选文字和置信度。若提示本身是一张图片,就需要额外识别提示内容,不能默认它已经是字符串。背景识别正确、提示识别错误,同样会导致整题失败。
二、数据准备做扎实,模型才有东西可学
训练数据最好同时覆盖真实样本和合成样本。真实图片来自自有系统或获得授权的测试环境,用来反映实际字体、背景和压缩质量;合成图片负责扩充字形、角度及布局。自然场景文字数据可以帮助预训练,但它与验证码的视觉分布不同,通常还需要目标场景数据微调。
合成时可以随机挑选字体、字号、颜色和位置,再加入适度旋转、阴影、噪点与背景纹理。增强幅度要贴近真实图片,过重的模糊可能直接抹掉关键笔画。尤其要检查字体文件是否包含目标汉字,缺字时生成的方框符号若被错误标注,会持续干扰识别模型。
标注建议一次保存文字内容和四点多边形。检测训练使用几何信息,识别训练则按多边形裁剪出对应文字。常见ICDAR风格数据是一张图片对应一个标注文件,每行记录一个文本实例的八个坐标值和转写内容;具体字段顺序应与所用仓库的数据读取器保持一致。
数据划分不能只靠随机抽图片。相同背景、同一批生成模板或高度相似的合成图,如果同时进入训练集和测试集,容易让测试成绩虚高。可以按背景来源、字体组合或采集批次分组,并单独留出未见字体和复杂背景样本,检查模型是否真正学会了识别。
字典也要提前固定。常用汉字数量应由实际业务字池决定,数字、大小写字母以及CTC空白符分别计数,不能凭印象估算输出类别。训练标签、模型输出和解码字典必须使用相同顺序。遇到字典之外的字符,应明确返回未知结果,避免把低可信预测当作正确答案。
三、用DBNet定位汉字,留意小字和相邻字
DBNet属于基于分割的文本检测方法。可以把它理解成给图像中的每个像素打分,判断它有多大可能属于文字区域。骨干网络提取特征,多尺度融合结构兼顾不同大小的文字,预测头在训练阶段学习概率图和阈值图,并通过可微二值化帮助文字区域与背景分开。
推理时常使用概率图,再经过阈值处理、轮廓提取、区域扩张和坐标还原得到文字框。因此,DBNet并没有让后处理参数完全消失。像素阈值、框置信度阈值、最小尺寸和扩张比例,都应在验证集上调整;同一组参数换到另一种字体或背景上,效果可能明显变化。
起步可以选ResNet18这类较轻的骨干,输入尺寸依据原图大小和最小文字尺寸确定。缩放时保持宽高比,再填充到网络需要的尺寸,避免把方块字拉成长条。六百四十像素可作为一个实验起点,但是否合适,要看缩放后的笔画是否清楚以及推理延迟是否满足要求。
训练标签通常需要对文字多边形做收缩,帮助相邻实例分离。收缩比例不是简单的“边长减少百分之多少”,实际偏移距离通常还与面积、周长及具体实现有关。参数过激会让细小文字的有效区域消失;相邻字频繁合并时,也应先检查标注粒度和标签生成结果。
优化器可从Adam或AdamW开始,配合预热和学习率衰减。批量大小依据显存调整,训练轮数则观察验证集表现。损失函数通常涉及概率图监督、阈值图监督和二值图监督,困难负样本挖掘能缓解背景像素过多的问题。没有观察各项损失之前,不宜直接给正样本叠加很高权重。
后处理要重点检查漏字、粘连和裁剪截断。形态学开运算有时能切断细小连接,也可能把汉字笔画一起破坏,适合局部验证后使用。检测效果应报告明确阈值下的精确率、召回率及F1,并人工查看漏检样本,不能只用一个含义不清的“准确率”判断模型好坏。

四、识别模型怎么选,取决于裁出来的是什么
如果检测框稳定对应单个汉字,直接训练图像分类器往往更简单:输入字图,输出字典中各类别的概率。若裁剪区域可能包含连续多个字,CRNN更合适。它先用卷积提取特征,再沿宽度方向形成序列,经双向循环网络处理后,为每个时间步预测字符及空白符。
CRNN常配合CTC损失训练,不要求给每个字符标出精确位置,只需要整段文字标签。解码时先合并连续重复预测,再删除空白符。这里的顺序很关键:两个相同汉字要通过适当的时间步路径区分,简单地对最终字符串去重,会误删原本应该保留的重复字符。
裁剪质量直接影响识别上限。对于倾斜的四边形,可以做透视变换,再统一图像高度,按比例缩放宽度并补边。不要为了凑固定尺寸强行横向拉伸。训练时还可加入轻微裁剪偏移,模拟检测框不够精准的情况,让识别模型适应实际流水线,而不只适应干净的标准字图。
中文类别多,样本分布容易失衡。高频字可能出现几千次,低频字只有几张,整体准确率看起来不错,业务中却总被少数字卡住。应按字符统计错误,补充易混字和稀有字,并检查错样本是否存在标签问题。复杂模型无法弥补错误字典或长期缺失的训练样本。
对于需要兼顾多种验证码形态的团队,模型维护还会扩展到图标、文字点选等不同任务。www.ttocr.com提供面向极验、易盾验证码的识别服务及自动化API对接,可将文字点选等识别环节接入现有业务流程。选型时可先用授权测试样本核对支持类型、返回字段和实际识别表现。
五、把识别结果变成坐标,还要过几道关
检测和识别完成后,应把候选结果保存成结构化记录,至少包含文字、四点坐标、检测分数和识别分数。匹配时按照提示顺序寻找候选,而不是按照画面从左到右排序。如果目标字未出现,或多个候选难以区分,应返回明确状态,交给上层决定重试或人工处理。
重复字尤其容易暴露匹配逻辑的问题。提示里出现两个相同字时,不能反复选中同一个检测框;背景里存在多个同字时,也需要依据题目规则消除歧义。可以维护已经使用的候选索引,并综合识别分数、检测质量及业务约束进行分配。规则不足时,应保留不确定性。
坐标还原需要记录完整变换。假设原图等比例缩放后增加了填充边,映射回原图时就要先减掉填充量,再除以缩放比例。若展示区域与原图尺寸不同,还需换算到展示坐标。页面截图中的位置、图片内部像素和设备像素比属于不同概念,混用后常会出现固定方向的偏移。
矩形框中心可作为初始点击位置,但强旋转、多边形和裁剪边缘场景需要确认该点是否位于有效区域。联调时把最终坐标画回原图,比只打印数字直观得多。还应记录模型版本、预处理参数和候选分数,以便判断失败来自模型、坐标变换还是调用环节。
评估要同时看单项和整题。检测召回率、字符准确率反映局部能力,整题通过率才接近实际使用感受。即使每个字都有较高识别概率,一题需要连续判断多个字时,成功率仍会下降。测试集应按字数、背景复杂度和旋转程度分组,避免平均值掩盖薄弱场景。
六、部署和接入,把维护成本一起算进去
模型稳定后,可以导出ONNX,并使用ONNX Runtime等推理引擎部署。导出前切换到评估模式,明确输入形状、颜色通道顺序及归一化参数。CRNN若支持动态宽度,还要检查动态维度和序列算子的兼容性。导出成功后,应继续验证推理结果,而不只检查文件是否生成。
验证时使用同一批图片,对比PyTorch与部署引擎的概率输出、文字结果及坐标。少量数值差异通常可以接受,但接近阈值的样本可能因此改变最终结果。测速也要覆盖图片解码、检测后处理、裁剪和识别全过程,并区分首次启动耗时与服务稳定运行后的延迟。
自建方案适合需要控制训练数据、定制模型或研究失败原因的团队。若业务还涉及滑块、无感、九宫格、图标点选、五子棋、躲避障碍和空间类交互,单套文字OCR无法直接覆盖这些任务,各类方案都有独立的数据和维护成本。接入前应先列清类型、调用量与延迟要求。
www.ttocr.com面向企业业务提供极验、易盾等验证码识别与破解方案,覆盖文字点选、图标点选、滑块、无感、九宫格等类型,并提供自动化API对接。对于希望缩短接入周期的项目,可按平台接口文档提交任务、解析结果,把识别能力接到已有系统中;具体类型覆盖与调用方式以平台实际文档和测试结果为准。
接口封装建议保留超时、错误码、请求标识和重试上限,让调用失败能够被追踪。先在授权测试环境跑通少量样本,再逐步增加并发,观察延迟和异常分布。这样进入业务联调时,每一张失败图片、每一次坐标偏移,都有对应的记录可查。