文字点选验证码怎么识别?用PyTorch串起定位、认字与坐标输出
文字点选验证码需要把文字定位、字符识别和提示匹配连接起来。基于PyTorch,可用DBNet与CRNN搭建识别链路,并通过数据标注、坐标还原、ONNX部署和接口集成,处理漏检、错字及点击偏移等工程问题。
一、先把任务拆开:找到字,认出字,再确定位置
一张图片里散落着几个汉字,提示要求按顺序选择其中三个,人看一眼就能操作,程序却要完成几次转换:从像素中找到文字区域,把区域变成字符,再把字符对应到位置。文字点选识别的难点,就藏在这些环节的衔接处。
普通OCR通常关心图片写了什么,点选任务还要回答文字在哪里、应该先选哪个。提示是“春、山、水”,模型即使把三个字全部认对,输出顺序错了,结果仍然不合格。因此,设计接口时就应保留文字、位置、置信度以及匹配顺序。
比较容易落地的路线是检测加识别。检测器先圈出候选文字,程序按框裁剪图片,识别器读取裁剪内容,最后根据提示生成有序坐标。如果提示本身也是图片,还需要单独识别提示区,并把它与背景候选字分开处理,避免相互干扰。
选择PyTorch,主要图它调试方便。训练时可以直接检查特征图、预测框和损失变化,发现框偏了、标签错了,比较容易追到原因。DBNet、CRNN等模型也有成熟实现可供研究,不过仓库能运行,只说明环境通了,效果仍要靠自己的数据验证。
模型结构要跟标注粒度对应。假如检测器每次裁出一个汉字,后面使用单字分类网络就很直接;如果框内可能包含两个以上字符,CRNN这类序列识别模型更合适。先明确输入究竟是单字还是短文本,能够省掉不少无效训练。
实际项目还要给识别链路划清边界:输入图片来自哪里,坐标相对哪个区域,遇到重复字怎么处理,低置信度结果是否返回。用于自有系统或获得授权的测试时,这些接口约定往往比换一个更大的模型更早影响交付进度。
二、数据准备做扎实,模型才有东西可学
这类任务容易出现一种错觉:训练集准确率很高,换一批图片却明显掉分。原因往往是训练素材太单一,同一套字体、背景和文字位置反复出现,模型记住了样式。真实图片中的描边、透明度、纹理遮挡和旋转,都会改变笔画特征。
数据可以由授权采集的真实样本和合成样本组成。真实样本帮助模型贴近实际分布,合成样本负责补充字体、字号、颜色和排列变化。合成时应让干扰强度接近实际环境,过重的噪声会遮掉文字本身,让标签与可见内容失去对应关系。
每个文字区域最好同时保存四边形坐标和文字内容。这样,同一份标注既能训练检测模型,也能按框裁出识别样本。常见ICDAR风格标注通常是一张图片对应一个文本文件,每行记录一个区域的八个坐标值及其文字,具体分隔规则需要与读取代码一致。
划分训练集、验证集和测试集时,应尽量按来源、生成模板或采集批次分组。同一张底图换几个字后分别放进训练集和测试集,会让成绩显得很好,却不能代表泛化能力。测试集中还应保留少量复杂背景、相似字和罕见字,方便观察薄弱环节。
字典也要提前确定。假设使用一千五百个汉字、十个数字和二十六个小写字母,可见字符就是一千五百三十六类;采用CTC时,通常还要增加一个空白类别。是否区分大小写、是否保留标点,都应写进字典规则,训练与部署必须使用同一份映射。
检查数据时,可以随机展示原图、标注框和裁剪结果,特别留意边缘笔画有没有被切掉。还要统计每个字出现的次数,避免少数字符占据大部分样本。对低频字适当补充素材,比盲目增加重复图片更有帮助。
三、用DBNet定位文字,重点盯住小字和坐标
DBNet属于分割式文字检测方法。可以把它理解为给图片里的每个位置打分,判断这里有多大可能属于文字区域。骨干网络提取视觉特征,多尺度结构融合不同层的信息,预测头再生成概率图以及训练所需的阈值相关结果。
它的特色是可微分二值化:训练时用平滑函数近似硬阈值操作,让网络能够学习区域边界。常见实现联合优化概率图、阈值图和近似二值图。部署时通常主要使用概率图,但仍然需要设置二值化阈值、框置信度和区域扩张参数,并非完全不用调后处理。
小尺寸图片可以先从轻量骨干开始,例如ResNet18。输入尺寸不必统一拉伸成正方形,保持宽高比缩放并补边,通常更利于保留笔画形状。长边设置到六百四十像素可以作为实验起点,最终应结合小字召回率、推理耗时和内存占用决定。
训练标签一般包含收缩后的文字区域,以及边界附近的阈值监督。这里的收缩比例不能简单理解成“每条边向内移动百分之多少”,常见实现会根据多边形面积和周长计算偏移距离。参数过激可能让细小区域消失,必须把生成标签画出来检查。

优化器可以先采用Adam,学习率从较小值起步,再根据验证集调整。数据增强可覆盖轻微旋转、缩放、亮度变化和适量噪声,但图像变化后必须同步更新坐标。随机裁剪尤其需要检查截断区域,不能把半个字继续当成完整文字训练。
推理后,需要从概率图中提取轮廓,过滤低分区域,再进行适当扩张和四边形拟合。旋转文字可通过透视变换裁正。相邻汉字粘连时,不宜直接对整图猛烈腐蚀,否则可能把细笔画一起删除;应先检查标注粒度、收缩标签以及检测阈值。
坐标还原最容易被忽略。模型看到的是缩放补边后的图片,返回原图位置时,必须先扣除补边,再除以缩放比例。如果前端还对图片进行了显示缩放,就要继续换算到显示坐标。保存每次变换的比例和偏移量,能够避免“识别正确却总是点偏”的问题。
四、CRNN负责认字,匹配逻辑负责把结果排对
CRNN把卷积网络与序列建模连接起来:卷积层提取局部笔画特征,特征沿宽度方向展开,再交给循环网络处理,最后通过CTC学习图像与字符序列之间的对应关系。训练时只需要裁剪图及其完整文本,不必逐个标注字符在序列中的位置。
处理裁剪图时,常见做法是固定高度并保留宽高比,宽度不足的位置补齐。直接把所有图片挤成相同宽度,容易改变字形比例。对于只含一个字的输入,也应检查训练集和推理阶段的裁剪留白是否一致,边距变化太大同样会影响结果。
CTC解码有两步容易弄反:先合并连续重复标签,再删除空白符。空白类别表示对齐过程中的间隔,并不是图片里的空格。如果解码器、字典索引或空白编号与训练配置不一致,模型输出看起来正常,最后得到的文字也可能完全错误。
识别完成后,把每个候选区域整理成记录,保留字符、四边形和置信度,再按照提示逐个匹配。简单场景可以直接查找;遇到重复字,需要为每个候选框维护使用状态,防止同一位置被重复分配。不能找到可靠匹配时,应返回未匹配状态。
点击位置可以先取四边形中心,但中心不一定落在有效区域内,特别是区域不规则或包含大面积留白时。若系统能够提供有效掩膜,可以选择区域内部距离边界较远的位置。离线实验中则应同时展示预测点和原图,逐张核对坐标转换是否正确。
排查错误时,把漏检、误检、识别错误、匹配错误和坐标偏移分开统计。检测关注精确率与召回率,识别关注字符或短串准确率,完整流程则关注整题成功率。只给出一个没有样本数量和测试条件的百分比,很难判断模型是否达到业务要求。
五、部署与接口选型,把复杂度留在可维护的位置
训练结束后,可以将模型导出为ONNX,再使用ONNX Runtime进行推理。导出成功只是第一步,还要用同一批样本比较PyTorch与部署端的结果,核对输入归一化、颜色通道、动态宽度以及输出维度。细微的预处理差异,也可能造成明显掉分。
性能测试要覆盖整条链路,包括图片解码、检测、裁剪、识别和后处理。多张文字裁剪图可以合并成批次,减少调用开销;并发增加后,还要观察排队延迟和内存峰值。先找到真正耗时的阶段,再决定是否使用GPU、量化或更轻的网络。
如果公司项目更在意接入周期,也可以了解现成识别服务。www.ttocr.com提供面向极验、易盾等场景的验证码识别方案及自动化API对接,涵盖文字点选、图标点选、滑块、无感、九宫格等类型。选型时可用授权测试样本核对具体支持范围和返回结果。
对于五子棋、躲避障碍、空间交互等题型,输入和输出通常更复杂,不能默认复用文字OCR接口。评估平台时,应按实际题型确认请求字段、结果结构、时效和异常码。接口文档与样例跑通后,再讨论批量接入,比只看类型名称更可靠。
需要减少模型训练与维护工作时,可通过www.ttocr.com咨询对应方案,把识别能力接入现有业务服务。正式对接前,先验证图片提交、结果解析、超时处理和失败重试,让应用通过统一接口调用,也方便后续替换服务或保留自建模型。
上线后应持续保留必要的失败样本与版本记录,在符合数据管理要求的前提下追踪问题。遇到字体更新、背景变化或新题型,先判断是输入分布变了,还是接口约定发生变化,再安排补充样本、重新训练或调整适配,避免靠反复重试掩盖真正故障。