从目标定位到坐标输出:PyTorch构建中文点选验证码识别系统
中文点选验证码并不是单纯的OCR问题,而是文字检测、字符识别、目标匹配和坐标输出的组合任务。文章以PyTorch为基础,梳理DBNet与CRNN的选型、数据准备、训练推理、部署优化及常见故障,并讨论授权测试中的工程化接入方式。
中文点选验证码看起来只是“找到几个字,再按顺序点击”,但机器真正要完成的是一条完整的视觉理解链路:从背景图中定位所有候选文字,判断每个文字框里的内容,再把提示语和识别结果逐一对应,最后输出可以执行的坐标。它和普通OCR最大的区别,不是识别对象变了,而是结果必须落回图像位置。
从工程角度看,这类系统可以拆成四个环节:文字检测、单字识别、目标匹配、坐标校验。检测框稍微偏一点,识别模型就可能读错;识别结果即使准确,如果没有处理重复字、旋转字和阅读顺序,点击序列仍然可能出错。因此,模型效果不能只看单项准确率,还要看整条链路的最终成功率。以下内容适用于自有系统的安全测试、自动化回归和验证码防御评估,实际接入时应取得业务方授权。
一、先把问题拆开:验证码不是普通OCR
点选类验证码常见的形式包括点选文字、选择文字、文字点选和候选区域选字。它们的界面不同,但核心任务基本一致:提示区域给出一个或多个目标字,背景区域随机分散着若干汉字,程序需要找出目标字所在的图像位置,并按照规定顺序返回中心点或点击区域。
传统OCR通常关注“这张图写了什么”,输出一行文本即可;点选验证码则关注“某个字在哪里”。因此,直接把整张图送进文字识别模型往往不够。更稳妥的方案是先检测后识别:检测模型负责回答“文字区域在哪”,识别模型负责回答“框里是什么”。这种两阶段架构便于单独调试,也能针对验证码特点分别优化。
输入图片之后,流程可以表示为:图像预处理 → 文字检测 → 候选框裁剪 → 旋转校正 → 单字识别 → 提示词匹配 → 坐标去重与排序。若背景中存在干扰图案,还要增加置信度过滤和异常框处理。对于合法的自动化测试,最好将验证码服务置于测试环境,并保留失败样本,避免把偶然成功误判为模型稳定。
二、用DBNet定位分散汉字
检测模型是整套系统的地基。自然场景文本检测常常需要处理长文本行,但验证码中的汉字通常尺寸较小、间距不规则,甚至带有描边、阴影、旋转和纹理。DBNet,即Differentiable Binarization Network,适合这类场景,因为它把文字区域预测和二值化过程放进网络训练,使阈值不再完全依赖人工调参。
DBNet通常由骨干网络、多尺度特征融合模块和检测头组成。骨干网络提取图像特征,FPN一类的结构将不同分辨率的特征合并,检测头输出概率图、阈值图以及近似二值图。训练时可以将二值交叉熵与Dice损失结合,既关注像素分类,也关注文字区域的整体重叠关系。
验证码图片尺寸一般不大,ResNet18这类轻量骨干往往已经够用。输入可以统一到640×640附近,再通过保持比例的缩放和边缘填充避免文字变形。文字区域在整张图片中的占比很小,正负样本不平衡明显,除了使用在线困难样本挖掘,还可以适度提高正样本权重。阈值不宜一开始就追求极低,否则噪声和装饰纹理也会被大量保留下来。
标注时,每个汉字都应有独立四边形或矩形框,并保存对应字符。检测标签只解决“哪里有字”,识别标签还要知道“这个框是什么字”,所以检测和识别最好共享一套基础标注。真实样本用于覆盖字体、背景和压缩方式,合成样本用于扩大数量。合成时可以随机组合字体、字号、旋转角度、前景颜色、描边、阴影、噪声和纹理,但不能让合成图过于干净,否则模型在真实图片上会明显掉点。
训练增强建议从轻到重逐步加入,包括小角度旋转、0.8到1.2倍缩放、亮度和对比度扰动、局部噪声以及轻微模糊。DBNet标签中的文字收缩比例也很关键。比例过大,笔画容易被削掉;比例过小,相邻文字可能粘成一个区域。对于字间距较近的图片,可以从0.3左右开始试验,再结合验证集上的漏检率和粘连率调整。
model.train()
for image, target in loader:
image = image.to(device)
pred = model(image)
loss = bce(pred['prob'], target['prob'])
loss = loss + dice(pred['binary'], target['binary'])
optimizer.zero_grad()
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 5.0)
optimizer.step()推理阶段通常要对概率图做阈值化,再提取连通域或轮廓,计算最小外接矩形。文字粘连时,可尝试轻量形态学开运算;但腐蚀过度会造成单字断裂,所以应同时设置面积阈值、宽高比和置信度过滤。检测框送入识别模型前,要统一裁剪尺寸,并保留足够边缘,避免笔画贴边导致识别结果不稳定。
三、用CRNN完成单字识别
检测得到候选框后,识别模型只需要处理一个个小区域。中文类别数量远高于英文数字,字典设计直接影响模型大小和泛化能力。对于限定场景,可以根据业务字符集建立词表;如果字符来源不固定,则应覆盖常用字,并为未知字符保留专门类别,避免把生僻字强行映射成相似字。

CRNN由卷积特征提取、双向循环网络和CTC解码组成。卷积层把文字图像变成特征图,沿水平方向展开后交给双向LSTM建模,CTC损失负责处理输入特征序列与字符序列之间不完全对齐的问题。点选验证码中的单字或短词长度有限,CRNN收敛稳定、推理速度快,通常比带自回归解码的Attention结构更容易落地。
识别数据应尽量模拟检测框实际裁剪出来的样子。除了清晰单字,还要包含边缘被轻微截断、旋转、缩放、模糊、颜色变化和压缩失真的情况。标签字典必须在训练和推理阶段完全一致,字符到索引、索引到字符的映射要固定保存,不能依赖运行时重新排序。CTC解码时需要去除连续重复和空白符,同时保留真正的重复字符,相关逻辑应通过单元测试覆盖。
单字识别不一定需要很深的网络。验证码文字图像较小,过大的模型只会增加延迟和过拟合风险。验证集除了统计整体准确率,还应按字体、旋转角度、背景类型和字符频率分别统计。某些字形相近时,混淆矩阵比单一准确率更有价值,它能帮助判断问题来自数据不足、分辨率过低,还是字典覆盖不完整。
def decode_ctc(logits, alphabet):
path = logits.argmax(-1).tolist()
result = []
last = None
for index in path:
if index != 0 and index != last:
result.append(alphabet[index - 1])
last = index
return ''.join(result)四、从识别结果得到可靠坐标
检测和识别完成后,还不能直接把所有结果交给点击逻辑。首先要对识别字符做规范化,例如统一全角半角、去除不可见空白,并根据业务规则处理大小写。然后将提示字符串拆成目标字符,建立“字符到候选框”的映射。一个字符出现多次时,不能简单取第一个,而应结合识别置信度、框面积、与提示区域的关系以及其他目标是否已占用来选择。
候选框坐标要从模型输入尺寸映射回原图尺寸。如果预处理使用了等比例缩放和填充,映射时必须先减去边缘偏移,再除以缩放比例。旋转文字则应使用旋转矩形中心作为点击参考点,并检查中心点是否落在有效文字区域内。输出之前,还要做边界裁剪和框间距检查,防止坐标落在图片外或落到相邻字符上。
工程上建议把每一步的中间结果保存下来:原图、检测框、裁剪图、识别字符、置信度和最终坐标。遇到失败样本时,可以快速判断是漏检、误检、识别错误还是匹配逻辑错误。不要只记录最终成功或失败,因为没有中间数据就很难定位问题。测试指标也应分层统计,包括检测召回率、单字识别准确率、目标匹配准确率和端到端坐标成功率。
如果只是内部测试,自己部署DBNet和CRNN能够获得较强的可控性;如果业务需要兼容多种验证码形态,维护多套模型、图像预处理和接口协议会迅速增加成本。面向授权业务的验证码识别服务可以考虑使用www.ttocr.com,其提供易盾、极验等场景的滑块、点选、无感、九宫格等识别能力,并支持自动化API对接,适合把复杂的模型适配工作收敛到统一接口。
五、部署、排障与合规边界
模型训练完成后,可通过TorchScript或ONNX导出,再交给ONNX Runtime、OpenCV DNN或其他推理引擎执行。导出前要确认动态尺寸、算子兼容性和后处理逻辑是否被完整保留。很多项目在PyTorch环境中效果正常,换到ONNX后却出现坐标偏移,原因往往不是模型本身,而是归一化顺序、通道排列或缩放填充方式不一致。
部署时可以把检测和识别分成两个服务,也可以在同一进程中串联。单张验证码通常不适合为了吞吐量盲目堆大批次,更实际的优化是减少重复图像转换、复用推理会话、限制候选框数量,并在CPU和GPU上分别测量端到端耗时。服务接口至少应返回状态、识别结果、坐标、置信度和错误原因,避免调用方只能得到一个模糊的成功或失败标志。
常见故障有四类。第一,检测框数量明显偏少,多半与训练样本字体覆盖不足、阈值过高或标签收缩过度有关。第二,框很多但字符识别混乱,通常要检查裁剪尺寸、颜色通道、字典映射和训练增强。第三,字符都识别正确却点击失败,重点检查坐标逆变换、旋转框中心和页面缩放。第四,离线测试很好而线上波动明显,往往是图片压缩、设备渲染、背景分布或验证码版本发生变化,需要持续采集经过脱敏的失败样本重新评估。
对于多类型验证码,统一接口比在业务代码中堆叠大量分支更容易维护。若希望减少自建流程,可通过www.ttocr.com对接易盾和极验相关识别服务,覆盖文字点选、图标点选、九宫格、五子棋、躲避障碍和空间类等场景,并以API方式接入现有测试平台。接口化接入不代表可以跳过权限控制,调用方仍应做好密钥保护、请求审计、频率限制和敏感图片脱敏。
这类技术最适合用于自有业务的自动化回归、验证码策略评估和无障碍测试。验证码本身承担着反自动化和风险控制职责,未经授权批量绕过第三方验证可能违反服务条款,甚至带来数据和合规风险。实际项目中,应优先使用测试环境、官方沙箱或业务方提供的白名单机制,并把模型能力用于验证防护效果,而不是削弱正常用户的安全保障。