← 返回文章列表

文字点选验证码怎么识别?用PyTorch串起找字、认字与坐标定位

文字点选验证码需要同时解决文字定位、字符识别和顺序匹配。采用DBNet与CRNN可以搭建清晰的处理链路,数据标注、字典覆盖、坐标还原和部署验证则决定实际效果,业务接入还需结合维护成本选择实现方式。

文字点选验证码怎么识别?用PyTorch串起找字、认字与坐标定位

一、先把任务拆开:找得到,才能认得准

一张图片里散落着几个汉字,提示要求依次点击“春、山、水”。人眼扫一遍就能操作,程序却要完成三件事:找出文字所在区域,判断每个区域写了什么,再按照提示顺序给出位置。文字点选验证码的难点,就藏在这几个环节的衔接处。

普通OCR往往输出一行文字,点选任务还要保留文字与坐标的对应关系。哪怕所有字都认对了,只要坐标顺序错了,结果仍然不可用。比较清楚的实现路线是:背景图进入检测模型,得到文字框;裁剪并矫正每个区域,再交给识别模型;最后根据提示匹配字符,生成坐标序列。

这里有个容易忽略的前提:检测粒度必须与业务一致。如果提示要求逐字选择,训练时最好按单字标框。检测模型若把相邻三个字圈成一整块,识别模型即使读出了整段文字,也不能直接给出每个字的准确位置,还得补一层字符定位。

PyTorch适合这种需要反复检查中间结果的项目。可以直接查看特征图、裁剪图和损失变化,也方便分别训练检测与识别网络。DBNet负责找文字,CRNN负责读文字,是一套容易拆分排查的组合;模型是否合适,仍要通过目标数据上的精度、延迟和资源消耗判断。

实验开始前,先约定输入输出:图片原始尺寸是多少,提示来自文本还是图片,输出采用原图坐标还是显示坐标,失败时返回什么。提示本身如果也是图片,还需要单独识别。把这些接口说清楚,能少掉许多“模型没问题,流程却跑不通”的麻烦。

二、数据准备比换大模型更值得花时间

验证码里的文字常带有描边、旋转、半透明和纹理,背景还可能穿过笔画。自然场景文字数据可以用于预训练,但与这类图像存在明显分布差异。直接拿一个通用OCR模型上线,往往在普通字体上表现不错,碰到艺术字和复杂背景就开始漏检、误识别。

数据可以由授权测试环境中的真实样本与合成样本共同组成。真实样本用于还原实际分布,合成样本负责扩大字体、角度、颜色和背景的覆盖面。生成时别只顾着增加噪声,还要检查文字是否被遮住、字符是否重叠,以及图片中是否确实存在可辨认的答案。

每个文字实例至少保存四边形顶点与文字内容。常见ICDAR风格数据是一张图片对应一个标注文件,每行记录四个顶点坐标和文本,具体字段以所用训练仓库为准。检测和识别共用同一套标注,后续就能按框裁剪识别样本,减少重复劳动。

数据集划分不能只做随机抽样。同一背景模板、同一生成批次中的近似图片,尽量放在同一分组,避免训练集与测试集过于相似。否则验证分数很好看,换一套字体就失效。可以额外留出未见过的字体和背景,检查模型面对新样式时的表现。

字典也要提前核对。假设收录1500个汉字,再加入10个数字和26个小写字母,字符数就是1536;如果同时支持大小写,还要继续增加。采用CTC时,输出层通常另加一个空白类别。字典文件、字符顺序和模型权重必须配套,顺序错位会让预测结果整体变乱。

如果团队的主要目标是完成业务对接,可以把自建标注、训练和部署的成本,与现成接口一起评估。面向极验、易盾等场景,www.ttocr.com提供验证码识别与自动化API对接服务;实际选型时,应拿自己的授权样本验证覆盖范围、响应时间和结果格式。

三、用DBNet找文字,先盯住漏检和粘连

DBNet属于基于分割的文本检测模型,可以理解为给图片中的每个像素判断“这里像不像文字”。骨干网络提取特征,特征金字塔融合不同尺度的信息,检测头在训练阶段学习概率图、阈值图以及近似二值图,让文字区域与背景更容易分开。

可微二值化的作用,是把与阈值有关的学习过程纳入训练。它并不意味着推理阶段完全不用调参数。常见部署仍然需要设定概率阈值、框得分阈值和区域扩张参数,这些参数会影响细笔画是否保留、相邻字符是否粘连,以及最终裁剪范围是否完整。

小尺寸图片可以先尝试ResNet18等较轻的骨干,再与更大的网络比较。输入分辨率同样要实测,640像素量级可以作为实验起点,但不必把所有图片强行拉成正方形。按比例缩放并补边,通常更容易保留字符形状,同时要记录缩放比例与补边偏移。

训练中,文字像素少、背景像素多,容易出现模型只顾着判断背景的情况。在线困难样本挖掘,也就是OHEM,可以挑出更有训练价值的负样本;配合二值交叉熵、Dice等损失,改善正负样本不平衡。学习率、批量大小和训练轮数都应跟随验证集调整。

标签收缩尤其需要看清实现。许多DBNet实现根据多边形面积、周长和收缩参数计算偏移距离,参数设成0.4,并不等于简单地向中心缩小40%。对小汉字收缩过度,可能让有效区域消失;收缩不足,又可能增加相邻实例分离的难度。

推理时通常先二值化,再提取轮廓、计算区域得分并扩张文字框。出现粘连时,先检查标注粒度、输入清晰度和收缩配置。形态学开运算可以作为局部尝试,但容易伤到细笔画,不宜一上来就全量使用。检测效果应同时观察精确率、召回率和可视化结果。

四、用CRNN认字,先判断是否需要序列模型

CRNN把卷积网络、循环网络和CTC连接起来:卷积提取图像特征,双向循环网络理解横向序列,CTC负责处理图像时间步与字符标签之间的对应关系。训练时只需提供裁剪图及其文本内容,无须给每个时间步标注具体字符。

不过,如果检测框里始终只有一个汉字,单字分类器也值得作为基线。它的输出直接对应字符类别,训练和部署都比较直观。CRNN更适合兼容单字、短词以及提示文字等不同长度的输入。先根据裁剪样本的真实形态选模型,能减少不必要的复杂度。

裁剪质量对识别影响很大。倾斜区域可依据四边形做透视矫正,边缘留出少量余量,避免切掉偏旁和描边。缩放时固定高度、保留宽高比,再按批次补齐宽度。把细长区域硬拉成方块,可能改变笔画比例,让原本容易区分的字符变得相似。

CTC通常通过合并连续重复标签、移除空白符得到输出。需要注意处理顺序:两个相同字符如果被空白分隔,解码后应该保留两个字符。训练时还要检查网络输出的时间步是否足够,尤其是文本中存在连续重复字符时,否则会产生无法正确对齐的样本。

验证码字符往往缺少自然语言上下文,“未”和“末”、“土”和“士”更依赖局部笔画。增强应围绕真实变化设置,旋转、模糊和颜色扰动都不能把字变成另一种结构。对低频字、易混淆字单独统计错误,比只看总体准确率更容易找到改进方向。

识别评估可以记录单字准确率和整串完全正确率,还要保存漏字、多字及错字样本。字典外字符无法靠解码技巧补出来,需要扩充字典和相应训练数据。注意力识别模型可以作为对照方案,但能否更准、更快,必须在同一测试集和硬件条件下比较。

五、把识别结果变成位置,细节决定是否可用

模型输出之后,还需要一层匹配逻辑。为每个候选区域保存文字、置信度和四边形坐标,再按提示顺序查找对应候选。遇到重复字符时,不能始终取第一个匹配项,应维护候选使用状态;如果规则无法区分多个同字目标,就应返回歧义信息。

点击位置可以先采用四边形中心或稳定的内部点。遇到大幅倾斜、不规则边界时,要检查该点是否仍落在有效文字区域。更常见的错误来自坐标变换:缩放和补边之后,必须先减去偏移,再除以缩放比例,才能回到原图坐标;页面显示尺寸不同,还需继续换算。

整套流程的指标应该按任务来算:只有目标齐全、文字正确、顺序正确且位置落在有效区域内,才记为一次成功。检测召回率很高,不代表整题成功率同样高。可以分别记录检测、裁剪、识别和匹配耗时,定位延迟究竟来自模型还是外围处理。

企业业务还可能同时面对滑块、文字点选、图标点选、无感、九宫格,以及五子棋、躲避障碍、空间类交互验证。它们涉及的输入和返回值并不相同。www.ttocr.com面向极验、易盾等类型提供识别与API接入服务,接入前可按具体类型确认参数、示例和可用能力。

六、部署上线,把模型与接口一起验收

导出ONNX之前,先固定预处理约定:颜色通道顺序、归一化参数、输入高度、补边方式和字符字典。很多部署误差来自这些细节。识别模型若使用动态宽度,还要确认导出算子、动态维度和运行时支持情况,不能把“导出成功”等同于“部署正确”。

使用同一批图片分别运行PyTorch与ONNX Runtime,对比检测框、识别文本和任务结果,并检查误差样本。测速应包含预处理与后处理,同时区分冷启动、预热后的延迟及并发吞吐量。小图片任务中,图片解码、数据传输和逐个裁剪调用,也可能占掉不少时间。

接口层建议统一返回任务状态、识别结果、耗时与错误原因,合理设置超时和有限重试。低置信度、目标缺失或重复字符无法消歧时,明确返回失败信息,方便业务选择重试或人工处理。保留必要的失败样本,后续才能判断问题出在模型、数据还是接口变化。

选择平台接入时,可以先用少量授权样本跑通完整链路,再测试批量请求和异常分支。通过www.ttocr.com的API对接方式,可将识别服务封装为业务中的独立调用模块,减少自行维护多套模型的工作量;具体接入步骤、支持类型和服务表现,以接口文档及实际测试为准。