某验3代-空间推理验证识别
本篇文章仅供学习使用,如侵权请联系删除。
某验验证码3代,4代已经是老生常谈的问题了,本篇文章粗略的分析一波3代空间推理验证码识别与验证的整个过程。
1.参数破解
从一开始gt和challenge的参数的获取,到后面w的生成,提交验证并获取最终的validate参数,就完成了整个该验证码的破解与识别。当然,嘴上说说还是比较简单,但是实际扣js代码并还原的过程还是比较痛苦的,这里就不一一赘述了,主要这些过程已经有很多大佬通过文章分享过了。破解部分不是本片文章的核心,核心在验证码的识别部分。
2. 验证码识别
3代空间推理验证码的识别,可以分成两部分完成,即:识别+推理
先来看下3代空间推理的验证码图片:
空间推理验证码是由sign提示和含有不同颜色,不同形状以及不同大小的物体组成的图片构成的,根据提示获取到指定的物体,并提交该物体的坐标即可。
---- 识别 ----
验证码的图片中的物体,主要包含:(5 * 5 * 2 = 50种类别)
形状:圆柱体,球体,正方体,圆锥体,多面体5种物体
大小:大,小,2种大小
颜色:灰(黑),红色,绿色,蓝色,黄色5种颜色
接下来,训练一个可以识别出这50种标签的深度学习神经网络模型:这里选用yolov5
1. 准备工作:数据集,这里准备了1000张图片,如下图
2. 使用labelimg【pip install labelimg】工具对每一张图片进行标注(ps:过程极为痛苦,可以交给第三方专业的团队,不然眼睛真的会瞎)
3. yolov5模型训练
1) 下载yolov5模型:git clone https://github.com/ultralytics/yolov5.git
2)下载预训练模型文件:https://github.com/ultralytics/yolov5(本文使用yolov5s),并将模型文件放至weights文件目录下
3)将前面的数据集文件按照比例分成两部分(训练集和验证集),并按照yolov5官方要求的文件目录结构,准备好所有的数据集。
4)复制yolov5/data/coco128.yaml,重新命名为coco_space.yaml,修改数据集路径,类别数量,列别名称
5)复制yolov5/models/ 下对应的模型文件,重新命名为yolov5s_space.yaml,修改其中的类别数量n为50
6)训练:python ./train.py --data ./data/coco_space.yaml --cfg ./models/yolov5s_space.yaml --weights ./weights/yolov5s.pt --batch-size 12 --epochs 120 --workers 0 --name s_120 --project yolo_space
7)测试:python detect.py --source ./test.jpg --weights ./yolo_space/s_120/weights/best.pt --conf-thres 0.3
数据集:
数据标注:
标注结果:
模型训练:
模型测试:
到此,就完成了yolov5模型对图片中物体的识别和定位
模型准确率在90%-99%,基本可以精确的识别出物体的颜色,形状,大小
推理的过程可能比较慢,可以进一步进行优化,导出onnx文件,使用tensorrt加速等方法优化模型的推理速度和性能
---- 推理 ----
完成了物体的识别与定位后,接下来就是推理的部分,没有找到可以参考的方法,无奈只能被迫自己绞尽脑汁写了,这部分没有对应的模型去识别,就是各种的逻辑判断,所以代码看起来比较臃肿,但是效果还是完全可以接受,识别准确率在90%以上,结合上面模型识别部分,两者结合起来整体的效果还是比较理想的,毕竟错了可以重试。下面粗略的介绍下整体的思路和方法:
用一个具体的例子来说明:
sign:请_点击_在大型蓝色物体后面的黄色物品。
image:如下图
yolov5检测结果:[[[‘红色’, ‘大’, ‘正方’], [262, 307]], [[‘红色’, ‘大’, ‘正方’], [469, 208]], [[‘黄色’, ‘大’, ‘多面’], [115, 261]], [[‘黄色’, ‘大’, ‘多面’], [194, 163]], [[‘蓝色’, ‘小’, ‘圆柱’], [55, 208]], [[‘蓝色’, ‘小’, ‘正方’], [368, 161]], [[‘蓝色’, ‘大’, ‘正方’], [583, 239]]]
思路:
-
使用jieba分词将提示信息进行断词,并过滤掉一些没有用的词语和标点符号,比如:[“请”, “点击”, “与”, “有”, “的”, “在”, “。”, “物体”, “物品”, “_”, “号”]等等,这样,就简单的获取到了一些描述物体的主要特征。
请_点击_在大型蓝色物体后面的黄色物品。对应的结果为:['大型', '蓝色', '后面', '黄色']
-
根据上面的描述,需要找到参照物,然后再通过参照物找到最终的物体,所以接下来需要把1中提取到的关键特征词,进行分割:
描述参照物的特征关键词 + 找到最终物体的位置关键词或者相似等关键词 + 最终物体的特征关键词
所以上面可以拆分为:[[‘大型’, ‘蓝色’], [‘后’], [‘黄色’]]
大型 + 蓝色 = 参照物
后 = 位置特征词
黄色 = 最终物体 -
在yolov5检测结果中查找参照物:
遍历所有的结果根据关键词:['大型', '蓝色'] 很轻松就会找到参照物为[['蓝色', '大', '正方'], [583, 239]]]
-
根据3种找到的参照物+方位词,颜色特征,体积特征再过滤一些物体
蓝色后面的物体 根据蓝色方块的坐标 可以过滤掉蓝色方块前面的物体
-
最后,根据最后一部分特征描述词语,找到最终的物体
黄色,蓝色方块后面只有一个黄色的物体,锁定到黄色大多面体,即[['黄色', '大', '多面'], [194, 163]],完美找到最终的物体
中间寻找过程中,会有一些小细节,这里就不一一赘述了,比如345中关键词,大型中的型是没有用的需要剔除,当然除了这一个还有很多,比如品,左右,前,后,最,相同,颜色,大小,形状,体积,尺寸,物体,方块,立方,侧等等词语都是需要进行处理的。
最最最最最后,提交坐标参数,去生成一系列的参数,提交到接口去验证并获取validate参数。
到这里,某验3代空间推理的识别就分享完了,后面还会陆续分享3代其他的验证码识别:图标点选,文字点选,滑块验证,仅供探讨和学习。