点选式验证码?使用深度学习搞定它

方案要点:

  • 点选式验证码的一般解决流程

  • 如何使用 xyolo 训练自己的目标检测模型

  • 不借助 OCR 功能解决中文验证码的识别问题

爬虫,反爬虫,反反爬虫……一个无限循环。

验证码是反爬虫手段中的常用技术,今天,笔者选择其中的一种——汉字点选式验证码 和大家分享一下。

点选式验证码一般会给定两部分内容:

  • 需要点击的几个汉字(为了便于区分,把这部分称为标签部分)。可能直接给文字(可以直接从html中知道是什么字),也可能给一张包含这几个字的图片(从html里面只能获得这张图片,并不知道图片里面是什么字)。
  • 生成的验证码图片(为了便于区分,把这部分称为验证部分)。一般给一张背景图,里面包含多个(大于等于需要点击的汉字个数)被扭曲、加工过的汉字。

要求我们按照汉字给出的顺序,在生成的验证码图片中依次点击正确汉字。下面给个例子:

在这里插入图片描述

其中,上方的 济拉 是给定的、需要点击的文字;下方是被点击区域,包含六个被扭曲、加工过的汉字,我们需要依次正确点击 两个字。

是不是感觉挺复杂的样子?莫怕,我们能搞定它!

此项目已经上传到GitHub,你可以直接从GitHub访问源代码和数据集:

https://github.com/AaronJny/captcha_detection

转载请注明来源:https://blog.csdn.net/aaronjny/article/details/109732693

一、方案选择

碰到验证码,解决方法一般可以分成两种:

  • 自己解决它(自己构建模型并训练)
  • 让别人帮我解决它(借助打码平台)

其实并不是什么东西都自己搞才是最好的,合理借助第三方平台或功能同样是个很好的选择。这个需要根据个人的情况做选择,我提供一个参考建议。

什么情况下适合借助打码平台?

  • 验证码触发量小 or 开发周期比较赶 or 不具备独立解决验证码的能力
  • 有打码平台方面的预算

毕竟打码平台真的很便宜,像这种点选式的验证码识别一次才几分钱调用量不大的情况下,成本要比自己动手搞低多了。一是减少了开发成本,二是减少了部署的成本(自己写模型也是要在服务器上部署的)。

打码平台的一般流程:

爬虫程序 打码平台 大爷大妈的客户端 大爷大妈 正常采集中…… 触发了验证码! 截取验证码 传输验证码截图 收到验证码截图 分配给员工 传输验证码截图 收到验证码截图 展示验证码截图 依次正确地点击图片上的文字 记录下大爷大妈点击的坐标 传输点击的坐标列表 传输点击的坐标列表 换算坐标 向目标网站提交验证码 正常采集中…… 爬虫程序 打码平台 大爷大妈的客户端 大爷大妈

具体的打码平台我就不推荐了,没收广告费,大家去网上搜一下就行,有很多。

什么情况下适合自己搞?

  • 调用量很大
  • 打码平台不支持要解决的验证码类型(一般都支持,并且可以协商)
  • 不信任打码平台
  • 业务需求
  • 我不管,我就是要练技术,我就是要自己搞

没有提到的其他情况,还请自行衡量。

不过嘛,今天咱们要讲技术,就不管场景了。我不管,我就是要自己搞!

二、方案架构

2.1 问题拆解

我们可以把点选式验证码的问题拆成两个小问题:

1、图片中的字都在哪儿?

即检测图片中所有的字的坐标。经过这一步,我们能把图片中的字都切割出来。

在这里插入图片描述

形象点说,就是找到上图中的所有框框的位置。进而,我们可以根据框框的坐标把字的图片切出来。

就像下图这样。

在这里插入图片描述

2、切割出来的图片里面的字,是啥?

对于每一个切割出来的小图片,判断它是什么字,进而判断它是不是我们要点击的字。

2.2 一般流程

所以,解决这种问题,一般流程如下:

  • 1、使用爬虫抓取多张验证码图片
    • 图片越多,效果越好
  • 2、使用labelImg标注数据集
  • 3、使用标注好的数据集训练一个目标检测模型
    • 并不限制使用某种具体的模型或算法
    • 常见的诸如SSD、YOLO、R-CNN等都可以
  • 4、获取一个给定文字图片,输出文字的模型
    • 可以自己编写、标注并训练一个模型
    • 可以借助开源OCR工具,比如tesseract
    • 也可以借助第三方的OCR接口,比如百度的通用文字识别,每天五万次免费额度,非常良心
  • 5、获取标签部分要点击的文字
    • 如果html里面可以拿到,直接解析html就可以了
    • 如果标签部分给定的是图片,需要先借着4中的模型进行识别
  • 6、使用3中的目标检测模型对验证部分的图片进行检测,获取所有文字的坐标
  • 7、根据6中获取的坐标,切分文字图片,并逐一使用4中的模型识别出图片对应的汉字
  • 8、判断哪些坐标是需要点击的,按照正确地顺序点击它

上面这个是一般流程,是大家都喜欢使用的一种流程。那么问题来了——有没有不一般的流程?

有的!我要开始抖机灵了!

我们来仔细讨论一下上面流程的第4部分。这里需要获取一个图像转文字的模型,一般情况下,我们优先考虑现成的资源:

  • 开源OCR工具tesseract
  • 百度的通用文字识别接口

经测试,tesseract 对示例中给出的验证的识别效果很差(加载了中文tessdata也不行),基本上识别不出来。百度的接口对于标签部分的识别还不错,但对验证部分的识别效果也很差。

这也不能怪tesseract和百度OCR,毕竟这是为了反爬虫而刻意扭曲、加工的字体,他们的模型并没有在这种数据上进行训练,识别不出来也很正常。

那就只剩下一种选择了,自己实现模型完成图像转文字的任务。

怎么做?最简单、也最直接的想法就是:

  • 1、使用爬虫抓取验证码
  • 2、将验证码中的验证区域的字的图片都截取下来,标定它是什么字
  • 3、根据标定情况,构建词汇表和数据集
  • 4、使用卷积神经网络+softmax构建深度学习模型
  • 5、训练并调优

但这里存在一个问题,验证码图片中的文字并不是固定的几个字来回使用,而是随机的、很多字。

也就是说,词汇表的大小可能是10、100、1000甚至更大。

假设词汇表只是10,那么模型做的就是一个十分类问题,我们手工标定几百、多了的话上千张图片也够用了。

但如果词汇表是100、1000,我们面对的就是100、1000分类的问题。要想在这样的词汇大小下取得良好的识别效果的话,对数据规模的要求是很大的,标注上万张图片都不够。

标注这么多图片,只要想想都觉得好麻烦啊……

作为一条咸鱼的我并不想手工去标注那么多图片,一心想着偷懒的我,忽然灵机一动,我似乎,并不需要知道每个图片上的字是什么啊……

  • 标签区域的文字图片位置相对固定,可以直接截取下来
  • 验证区域的文字位置可以通过目标检测模型获得,进而截取出相应文字图片

两个图片我都有了,我管它图片上的文字是啥。对于标签区域的每一张文字图片,我只需要逐一判断验证区域的所有文字图片,和它是不是同一个字不就行了嘛。

也就是说,我不再需要一个100、1000分类的分类器了,只需要一个二分类器,把输入从一张图片改成两张图片,判断两张图片是否为同一个字就行了?!这样就把复杂问题变简单了,模型的复杂度能降下来,数据集的规模需求也能随之降下来,完美!

啧啧,怎么感觉这个想法这么眼熟呢?稍微思考一下,握草,这不就是NLP里面常用的负采样思想嘛???

后来去查了一下,发现类似的思路早有人提出来了,学名叫孪生神经网络……

可惜,错失发现新大陆的机会 [狗头] [狗头]

在这里插入图片描述

行吧,调整之后的流程大

  • 32
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
【资源说明】 基于孪生神经网络实现的点选识别python源码(带注释)+运行说明+数据集+预训练模型.zip ## 效果 4090训练100轮 测试集可以达到98.6%以上,基本上已经破解了该类验证码。 ![效果演示](./beeb1dc9cdf4f18a98a51d631745ba75.png "效果演示") ## 坑 注意啊,建议重新把yolo分割文字那个部分训练下,因为我这个样本是别人从前台截图后标注训练的,导致泛化性能不是很好!! 有能力的话建议把样本都重新标注下。 ### 如何使用? 下载数据集和预训练模型:https://systems.lanzout.com/iWUqz15mo57a #### 环境安装 安装环境,我用到的是python3.10 ``` conda create -n geetest python=3.8 ``` 安装必要的环境 ``` pip3 install -r requirement.txt ``` ### CUDA安装 安装cuda和 cudnn ``` conda install cudnn=8.1.0.77 cudatoolkit=11.2.0 ``` #### 数据准备 准备数据集,放入data中,格为 id_序号.jpg|png,id可以采用uuid,序号第一张图是1,第二张图是2,只能两张图 例如,相同的两个字, ``xxxxx_1.jpg``和``xxxxx_2.jpg`` ### 训练模型 配置训练参数,config.py中,一般来说只需要配置gpu就行了,如果你没有gpu就不填,就自动使用cpu 开始训练 ``` python train.py ``` 预测 ``` python predict.py ``` 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!
在 HTML 中添加验证码通常需要借助 JavaScript 和服务器端的代码。其中,点选验证码可以使用深度学习进行识别,但是需要大量的训练数据和模型调整,可能需要一定的专业知识和技能。以下是一个简单的示例,仅供参考: 1. 在 HTML 中创建一个包含验证码的元素,例如一个图像: ``` <img src="captcha.php" id="captcha" alt="验证码"> ``` 2. 在 JavaScript 中为该元素添加一个点击事件处理程序,用于刷新验证码: ``` document.getElementById("captcha").addEventListener("click", function() { this.src = "captcha.php?" + Math.random(); }); ``` 3. 在服务器端代码中生成验证码图像,并将其发送给客户端。这里使用 PHP 作为例子: ``` <?php session_start(); $code = generate_code(); $_SESSION['captcha'] = $code; $img = image_create(); image_draw($img, $code); header('Content-Type: image/png'); imagepng($img); imagedestroy($img); function generate_code() { $code = ''; $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for ($i = 0; $i < 6; $i++) { $code .= substr($chars, rand(0, strlen($chars)-1), 1); } return $code; } function image_create() { return imagecreatetruecolor(100, 30); } function image_draw($img, $code) { $bg_color = imagecolorallocate($img, 220, 220, 220); $text_color = imagecolorallocate($img, 0, 0, 0); imagefill($img, 0, 0, $bg_color); imagettftext($img, 20, 0, 10, 20, $text_color, 'arial.ttf', $code); for ($i = 0; $i < 100; $i++) { $color = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255)); imagesetpixel($img, rand(0, 99), rand(0, 29), $color); } } ?> ``` 4. 在服务器端代码中验证用户输入的验证码是否正确: ``` <?php session_start(); if ($_POST['captcha'] !== $_SESSION['captcha']) { // 验证码错误 } else { // 验证码正确 } ?> ``` 需要注意的是,以上示例中的验证码生成和识别方较为简单,仅供参考,实际应用中可能需要更加复杂的实现方

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值