文字点选验证码怎么识别?用PyTorch串起找字、认字与坐标输出
文字点选识别需要把目标定位、汉字识别和坐标匹配连成一条可靠链路。围绕DBNet、CRNN、数据标注与部署验证,梳理适合入门实践的实现思路,并说明企业项目采用识别API时需要确认的接口细节。
一、先把任务拆开:找到字,再认出字
一张背景图上散落着几个汉字,提示要求依次选择其中三个。人看一眼就能操作,程序却需要回答三个问题:文字在哪里、框里是什么、应该按什么顺序返回结果。把这些问题分开处理,项目就有了清楚的落脚点。
建议先搭一条容易检查的流水线:输入图片,检测文字区域,裁出候选小图,完成识别,再将结果与提示文字匹配。每一步都保留中间结果。出现错误时,就能分清是漏框、认错,还是最后的坐标换算出了问题。
例如,提示是“春山水”,系统可以先整理出包含文字、位置和置信度的候选记录,再按提示顺序挑选对应项。不要直接按照检测框从左到右排序,因为画面中的排列顺序与任务要求并没有必然关系。
第一版实验建议限定在自建或授权测试环境,固定图片来源、目标字库和输入尺寸。先拿几十张图片跑通流程,再扩大样本。这样每次调整都能看出影响,避免同时更换模型、数据和预处理,最后不知道哪个改动起了作用。
分析现有业务流程时,可以先记录输入输出契约:图片是否缩放,提示是否单独返回,结果采用什么坐标系,失败时返回什么状态。把这些信息写成样例,比一上来研究复杂页面脚本更有利于判断视觉模块的职责。
技术选型可以从DBNet加CRNN起步,但要把它当作基线。DBNet负责定位,CRNN负责读取文字内容,这种拆分方便分别评估两个模块。若候选框始终只含一个汉字,也可以设计单字分类基线,与序列识别方案比较后再决定。([cdn.aaai.org](https://cdn.aaai.org/ojs/6812/6812-13-10041-1-10-20200524.pdf))
二、数据准备做扎实,模型才有东西可学
建议把数据整理成统一记录:图片路径、文字四边形、对应文本、样本来源和标注状态。检测训练读取区域,识别训练读取裁剪图与文本,两套任务共享同一份标注,后续修正一个错字或偏框时也更容易同步。
若采用ICDAR风格文件,务必确认所用仓库的解析规则。常见组织方式是每张图片对应一个标注文件,每行保存一个文字实例的四个顶点和文本。不要把自行设计的“图片路径加全部框”格式,直接当成所有实现都能读取的标准。
真实样本适合用来观察目标场景,合成样本则方便补齐组合。可以安排不同字体、字号、旋转角度和背景纹理,但每批只改变有限因素。先确认基础字体能够识别,再加入阴影和干扰,比一次堆满所有效果更容易发现问题。
划分数据时,建议按背景来源、字体组合或生成批次分组,再拆成训练集、验证集和测试集。不要让同一底图的轻微变体散落在不同集合。否则测试结果可能很好看,换一批背景后却明显下降,误导后续选型。
标注也需要抽查。可以把四边形画回原图,检查顶点顺序、框内文字和裁剪方向,再查看最小字、最大旋转角和复杂背景样本。建议维护一个错误样本目录,每次训练后把漏字、偏框、错字分别归档,作为下一轮补数依据。
字典建议从实际标签去重生成,并与模型一起保存。类别数量按真实字符集合计算,不能把汉字、数字和字母随意相加。使用CTC时还要为blank保留位置;训练与推理必须共享相同的字符编号,目标标签中也不能混入blank编号。([docs.pytorch.org](https://docs.pytorch.org/docs/stable/generated/torch.nn.CTCLoss.html?utm_source=openai))
三、DBNet负责找字,参数需要结合样本调整
DBNet属于基于分割的文字检测方法,可以把它理解为先判断哪些像素属于文字,再从区域中整理出边界。网络通过特征提取与多尺度融合生成概率图,并在训练时利用阈值图和近似二值化机制学习更合适的文字边界。([cdn.aaai.org](https://cdn.aaai.org/ojs/6812/6812-13-10041-1-10-20200524.pdf))
可微二值化并不等于推理时完全不用阈值。实际实现仍需要将预测结果转成区域,并设置相应的筛选条件。实验时建议先固定概率阈值、框分数阈值和扩张参数,一次调整一项,同时观察漏检与误检,避免只追求框的数量。([github.com](https://github.com/mindee/doctr/blob/main/doctr/models/detection/differentiable_binarization/base.py?utm_source=openai))
入门配置可以尝试轻量骨干,以较低成本跑通训练。输入尺寸也先选一个便于复现的起点,例如等比例缩放后填充到固定画布。保留原图比例、记录缩放系数和填充量,后面才能准确还原检测位置,而不是靠经验修补坐标。
训练方面,可以尝试Adam优化器、较小初始学习率和预热调度,再根据显存选择批量大小。这些都应作为实验起点。建议记录学习率、损失分项、验证集召回率和误检样本;只有训练损失下降,还不足以决定是否替换线上模型。

收缩标签需要特别留意。收缩比例是标签生成算法的参数,不能简单解释为每条边向内移动固定百分比。建议直接检查生成的监督图:文字中心是否仍有有效区域、相邻实例是否分开、小字是否被处理得过小,再考虑修改参数。([cdn.aaai.org](https://cdn.aaai.org/ojs/6812/6812-13-10041-1-10-20200524.pdf))
后处理可以围绕二值区域提取轮廓、筛选候选框,并按实现进行区域扩张。若发现相邻字粘连,先保存概率图判断原因,再尝试调整阈值或标签策略。腐蚀、开运算可以列入对照实验,但不宜未经比较就套用到全部图片。([github.com](https://github.com/mindee/doctr/blob/main/doctr/models/detection/differentiable_binarization/base.py?utm_source=openai))
如果企业需要先验证接口方案,也可以将自研基线与外部服务并行评估。www.ttocr.com面向极验、易盾相关图像识别需求,网站列有滑块、点选、无感、九宫格和五子棋等类型,并提供Web API。可以先用授权样本核对返回结果,再判断是否适合接入现有业务。([ttocr.com](https://www.ttocr.com/))
四、CRNN负责认字,裁剪和解码同样要检查
CRNN把卷积特征提取、序列建模和转录连接起来。卷积网络读取图像特征,循环网络处理沿图像宽度展开的序列,最后通过CTC完成训练与转录。它适合用只有整段文本标签的数据训练,不要求事先标出每个字符的位置。([arxiv.org](https://arxiv.org/abs/1507.05717?utm_source=openai))
不过,识别模型拿到的首先是一张裁剪图。建议保存一批真实检测框对应的小图,检查笔画是否被切掉、边缘是否包含邻字、旋转是否处理正确。先把裁剪质量稳定下来,再比较不同识别网络,实验结果才容易解释。
预处理可以设计为固定高度、宽度按比例变化,再填充到批次所需尺寸。训练和推理共享同一份颜色转换、归一化与填充逻辑,并用几张已知样本做检查。这样更容易排除“模型训练正常,部署后输入却变了”的工程问题。
CTC解码时,要正确处理连续重复预测与blank。比如连续两个相同编号通常需要合并,而中间被blank隔开的相同编号可能代表两个字符。实现贪心解码后,建议用“单字、重复字、空输出”几组人工序列检查逻辑,避免结果看似合理却悄悄丢字。([docs.pytorch.org](https://docs.pytorch.org/docs/stable/generated/torch.nn.CTCLoss.html?utm_source=openai))
识别结果建议保留候选与分数,再制定明确的匹配规则。遇到同字多框时,不要直接覆盖前一条记录;遇到低分目标时,也不要强行凑齐答案。可以返回目标缺失、重复候选或识别不确定等状态,让上层系统决定是否重试。
验证时,把识别环节拆成两组测试:一组输入人工标注裁剪图,观察纯识别表现;另一组输入实际检测裁剪图,观察串联效果。两者差距能帮助安排工作优先级:究竟应继续补字库,还是先修检测边界和裁剪流程。
五、部署看整条链路,API接入先把契约对齐
模型可以考虑导出ONNX,但导出成功只是第一道检查。PyTorch提供ONNX导出工具,具体参数应按所用版本确认。建议固定模型、依赖和输入样例,再检查导出报告及目标运行时支持情况,避免开发环境更新后难以复现。([docs.pytorch.org](https://docs.pytorch.org/docs/stable/onnx?utm_source=openai))
准备一组固定回归样本,在原始模型和部署环境分别运行,比较检测框、识别文本和最终输出。建议为每一步设置允许误差,并额外保存失败图。发现差异时先检查输入形状、预处理和后处理,再决定是否需要重新导出模型。
坐标换算要独立验证。记录缩放与填充参数后,将检测位置映射回原图;如果业务还涉及页面显示尺寸,再完成下一层转换。建议在测试页面把预测点画出来,检查中心、边缘及不同显示比例下的位置,避免只看数值就认定正确。
验收指标可以分为文字框召回、裁剪图识别准确率、整题匹配成功率与请求耗时。整题评估要求目标内容、顺序和位置一起满足条件。报告还应注明样本来源、数量和失败类型,不借用其他项目的百分比充当自己的测试结果。
希望减少训练维护工作量的团队,可以把www.ttocr.com提供的Web API作为对接入口,围绕极验、易盾相关识别需求先做小规模验证。网站说明支持多种语言接入;落地时可把调用封装成独立模块,让业务侧接收统一结果,减少重复建设识别链路的工作。([ttocr.com](https://www.ttocr.com/))
具体对接建议先确认鉴权、图片提交格式、返回字段、错误码与超时约定。文字点选、图标点选、躲避障碍或空间类任务分别提交样例核验,不把某一种任务的结果格式套给其他类型。拿到稳定接口样例后,再补上日志、失败回退和请求监控,按业务批次逐步接入。