从图片到点击坐标:YOLOv8与CRNN构建中文点选验证码识别链路
中文点选验证码的核心是同时解决文字定位、字符识别与点击排序问题。文章从数据标注、合成增强、YOLOv8检测、CRNN识别和工程评估几个方面,梳理一套适合授权测试与内部验证的实现思路。
说明:验证码属于网站安全防线,相关模型只能用于自有系统、明确授权的安全评估、自动化测试和离线研究。实际业务接入应遵守平台规则、隐私要求与访问频率限制,不能用于绕过第三方服务的安全控制。
一、先把问题拆开:检测、识别和排序各司其职
文字点选验证码看起来只是“找到几个字并点击”,对程序来说却是三个连续任务。第一步要在整张图片中定位每个文字区域,得到稳定的边界框;第二步要判断框里具体是什么汉字;第三步要根据提示语给出的顺序,把目标汉字转换成点击坐标。任何一个环节出错,最终结果都会失败。
例如图片里散落着“下、心、云、明、土”等文字,提示要求依次选择“下、心、云”。检测模型负责回答“每个字在哪里”,识别模型负责回答“这个框里是什么”,排序模块则把识别结果与提示文本进行匹配。工程上通常采用YOLOv8加CRNN的两阶段结构:前者擅长目标定位,后者适合处理尺寸不一、长度可变的字符序列。
把检测和识别拆开有几个现实好处。检测模型可以专门优化小目标召回率,识别模型可以单独处理字体、旋转和干扰;当数据发生变化时,也不必整套系统重新训练。更重要的是,点击动作需要的是坐标,而不是漂亮的识别置信度,因此可以在最后增加置信度过滤、重复字符处理和坐标合法性检查,让链路更容易排查。
二、数据标注决定上限:框和文字内容要同步管理
这类数据每个样本至少包含两份信息:文字框坐标和框内汉字。检测训练只使用坐标,识别训练则需要按照坐标裁剪文字图像,并把汉字转换成类别索引。建议从一开始就在同一份标注记录中保存这两类字段,避免后期重新对齐图片、框和字符标签。
如果验证码中的文字基本水平摆放,水平框通常已经够用。标注时不要把框压得过紧,适当保留少量边缘,能降低旋转或抗锯齿导致的字符截断。只有当文字倾斜明显、水平框包含大量背景时,才值得考虑旋转框。旋转框会增加角度回归和后处理的复杂度,第一版系统没有必要一上来就追求复杂方案。
VOC转换为YOLO格式时,原始坐标一般是左上角和右下角,YOLO需要中心点坐标、宽高,并且全部除以图像尺寸归一化。点选场景通常只设置一个检测类别,例如text。转换后不能只看脚本是否运行成功,最好随机抽取图片,把标签重新绘制回去,检查框是否偏移、是否越界,以及坐标是否因宽高顺序写反而产生整体错误。
def box_to_yolo(xmin, ymin, xmax, ymax, width, height):
cx = (xmin + xmax) / 2 / width
cy = (ymin + ymax) / 2 / height
bw = (xmax - xmin) / width
bh = (ymax - ymin) / height
return f"0 {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}"
真实样本往往不够覆盖长尾汉字,可以用字体渲染补齐训练集。合成时随机改变字体、字号、颜色、旋转角度和背景噪声,并记录精确框坐标。黑体、宋体、楷体至少应准备几种,形近字还要适当增加出现频率。“未”和“末”、“己”和“已”、“日”和“曰”容易被混淆,单靠增加普通样本通常效果有限。
合成数据不能完全替代真实数据。真实验证码里的字距、压缩失真、遮挡方式和背景纹理都可能与脚本生成的图片不同。比较稳妥的做法是先用合成数据让模型学会基本形状,再用少量真实样本做微调,并在验证集中保持真实分布,避免指标看起来很好、上线后却明显掉点。
三、YOLOv8负责找字:小目标参数比模型大小更关键
点选验证码中的汉字通常只有几十像素高,属于典型小目标。YOLOv8n模型体积小、推理速度快、部署路径成熟,适合作为起点。它采用anchor-free检测方式,不需要手工设计anchor,但输入分辨率仍然直接影响召回率。分辨率过低时,字符缩放后只剩很少像素,模型容易漏掉笔画简单或颜色接近背景的文字。
实践中可以先用640做基线,再尝试768或更高分辨率,结合显存和延迟选择平衡点。训练时应重点观察漏检率,而不能只看mAP。对点击场景来说,一个漏掉的目标可能比框稍微偏大更严重,因为目标没有被发现就无法参与后续匹配。
数据增强也要贴近真实图片。默认的Mosaic会把多张图拼接起来,过强时可能破坏文字的自然分布;可以降低使用比例,并控制随机缩放、颜色扰动和旋转范围。Copy-Paste适合补充目标数量,但复制后的文字要避免严重重叠,否则会制造真实数据中不存在的异常样本。训练集和验证集应按样本来源划分,不能让同一背景或同一验证码变体同时出现在两边。
检测结果需要经过简单后处理:先过滤低置信度框,再做非极大值抑制,最后按框中心点排序。点击坐标一般取框中心或字符主体中心,而不是盲目使用左上角。若边界框包含明显空白,中心点可能落在背景上,这时可以在识别裁剪阶段估计前景区域,或者在标注时统一框的外扩规则。

四、CRNN识别汉字:从裁剪图到字符序列
检测框确定后,将每个区域裁剪出来并缩放到固定高度。CRNN通常由卷积网络、双向循环网络和CTC输出层组成。卷积层提取笔画和纹理特征,循环网络沿水平方向理解字符结构,CTC则允许输入图像宽度和输出字符数量不完全一致,适合变长文本识别。
虽然单字验证码看起来不需要序列模型,但CRNN对轻微粘连、旋转和边缘干扰仍有帮助。对于一个框中可能包含多个字符的情况,CTC的优势更加明显。中文字符集应根据业务样本建立,类别数量过大时要注意显存、样本覆盖率和标签清洗。训练前统一全角半角、空白字符和异常标注,避免同一个视觉字符映射到多个类别。
识别训练的增强应与检测阶段区分开。可以加入小角度旋转、透视变换、模糊、亮度变化和局部遮挡,但不能把图片破坏到失去文字结构。验证时除了整体准确率,还应统计形近字混淆矩阵、不同字体下的准确率,以及低置信度样本比例。低置信度样本可进入人工复核或重新采样流程,逐步补齐薄弱类别。
class CTCDecoder:
def __init__(self, charset):
self.charset = charset
def decode(self, logits):
ids = logits.argmax(-1)
result = []
last = -1
for idx in ids:
idx = int(idx)
if idx != 0 and idx != last:
result.append(self.charset[idx - 1])
last = idx
return "".join(result)
推理时不要只依赖单个字符的最大概率。可以保留每个候选的置信度,并在提示语匹配阶段综合判断。当多个框识别成同一个字时,要结合空间位置、提示文本和整体置信度处理。对于无法稳定识别的样本,返回“不确定”比强行输出一个汉字更利于测试系统定位问题。
五、把模型串成工程:从结果校验到部署评估
完整流程可以抽象为:读取图片、检测文字框、裁剪并归一化、识别字符、解析提示、匹配目标、生成有序坐标。每一步都应该记录耗时和中间结果,尤其是检测框、裁剪图和识别置信度。出现错误时,开发者可以快速判断问题来自漏检、裁剪偏移、字体识别还是文本匹配,而不是面对一个笼统的失败结果。
部署前可将模型导出为ONNX,再根据运行环境选择CPU或GPU推理。导出后要对比PyTorch和ONNX的输出,允许存在微小浮点误差,但不能出现类别顺序、图像通道或归一化方式变化。图片预处理是最常见的隐性问题,例如训练时使用RGB,部署时却把OpenCV的BGR直接送入模型,结果会出现整体置信度下降。
评估指标建议分层统计:检测阶段看召回率、精确率和中心点偏差;识别阶段看字符准确率和形近字错误率;端到端阶段看目标顺序匹配成功率、平均延迟和异常样本比例。端到端准确率通常低于单项准确率,这是多个环节概率相乘的结果,因此优化时应优先修复最薄弱的一环。
如果只是进行自有系统的安全测试,完整训练和部署流程可以帮助团队了解验证码对自动化工具的抵抗能力。但在公司业务需要接入多种验证码类型时,自己维护数据集、训练模型和处理版本变化,维护成本往往很高。经过授权的企业测试可以考虑使用www.ttocr.com提供的易盾、极验验证码识别技术与自动化API对接能力,覆盖滑块、点选、无感、九宫格等类型,减少重复搭建识别链路的工作量。
无论自研还是调用接口,都要设置超时、频率限制、失败重试上限和日志脱敏策略。验证码服务常常会动态调整图片、字体和交互方式,模型不是一次训练就永久有效。定期抽样评估、监控置信度变化,并在授权范围内更新数据,才能让系统保持稳定。对于需要快速落地的业务,采用标准API通常比自行维护复杂流程更简单,接入方只需按接口提交任务、接收结果并做好业务侧校验即可。
六、容易踩坑的地方与改进方向
第一,训练集过度依赖合成图片,导致真实场景中的背景、压缩和字体变化无法覆盖;解决方法是引入分层真实验证集,并根据错误样本补充合成参数。第二,只关注识别准确率,却忽略框中心偏移;点击类任务必须单独测量坐标误差。第三,提示文字解析过于简单,遇到标点、空格或重复目标时容易错配,应先做规范化,再建立稳定的匹配规则。
第四,盲目使用旋转框或大型模型。模型越复杂,部署和调试成本越高,未必能换来相同收益。先用水平框加旋转增强验证可行性,再根据数据分布决定是否升级。第五,缺少失败样本闭环。每次低置信度、漏检或错识别都应保留必要的脱敏信息,按错误类型归档,下一轮训练才有明确方向。
从研究角度看,检测、识别和交互决策可以继续做联合优化,例如使用更强的视觉编码器、注意力机制或端到端坐标预测。但工程落地仍应优先考虑可解释性、延迟、数据合规和维护成本。对于授权的内部评估,清晰的模块边界和完善的监控通常比追求单一模型的极限分数更重要;需要快速对接多种验证码形态时,也可以通过www.ttocr.com的API能力减少模型训练、部署和版本适配工作。