0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Python机器学习解决验证码的资料说明

马哥Linux运维 来源:未知 2019-05-03 13:43 次阅读

写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种:

图像类

滑动类

点击类

语音类

今天先来看看图像类,这类验证码大多是数字、字母的组合,国内也有使用汉字的。在这个基础上增加噪点、干扰线、变形、重叠、不同字体颜色等方法来增加识别难度。相应的,验证码识别大体可以分为下面几个步骤:

灰度处理

增加对比度(可选)

二值化

降噪

倾斜校正分割字符

建立训练库

识别

由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码,这样做的好处就是可以有大量的知道明确结果的数据集。当需要真实环境下需要获取数据时,可以使用结合各个大码平台来建立数据集进行训练。

生成验证码这里我使用Claptcha这个库,当然Captcha这个库也是个不错的选择。

为了生成最简单的纯数字、无干扰的验证码,首先需要将claptcha.py的285行_drawLine做一些修改,我直接让这个函数返回None,然后开始生成验证码:

这里需要注意ubuntu的字体路径,也可以在网上下载其他字体使用。生成验证码如下:

可以看出,验证码有形变。对于这类最简单的验证码,可以直接使用谷歌开源的tesserocr来识别。

首先安装:

然后开始识别:

可以看出,对于这种简单的验证码,基本什么都不做识别率就已经很高了。有兴趣的小伙伴可以用更多的数据来测试,这里我就不展开了。

接下来,在验证码背景添加噪点来看看:

生成验证码如下:

识别:

效果还可以。接下来生成一个字母数字组合的:

生成验证码如下:

第3个为小写字母o,第4个为大写字母O,第5个为数字0,第6个为小写字母z,第7个为大写字母Z,最后一个是数字2。人眼已经跪了有木有!但现在一般验证码对大小写是不做严格区分的,看自动识别什么样吧:

人眼都跪的计算机当然也废了。但是,对于一些干扰小、形变不严重的,使用tesserocr还是十分简单方便的。然后将修改的claptcha.py的285行_drawLine还原,看添加干扰线的情况。

加了条干扰线就完全识别不出来了,那么有没有什么办法去除干扰线呢?

虽然图片看上去是黑白的,但还需要进行灰度处理,否则使用load()函数得到的是某个像素点的RGB元组而不是单一值了。处理如下:

处理后的图片如下:

可以看出处理后图片锐化了很多,接下来尝试去除干扰线,常见的4邻域、8邻域算法。所谓的X邻域算法,可以参考手机九宫格输入法,按键5为要判断的像素点,4邻域就是判断上下左右,8邻域就是判断周围8个像素点。如果这4或8个点中255的个数大于某个阈值则判断这个点为噪音,阈值可以根据实际情况修改。

处理后的图片如下:

好像……根本没卵用啊?!确实是这样的,因为示例中的图片干扰线的宽度和数字是一样的。对于干扰线和数据像素不同的,比如Captcha生成的验证码:

从左到右依次是原图、二值化、去除干扰线的情况,总体降噪的效果还是比较明显的。另外降噪可以多次执行,比如我对上面的降噪后结果再进行依次降噪,可以得到下面的效果:

再进行识别得到了结果:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8386

    浏览量

    132469
  • python
    +关注

    关注

    56

    文章

    4784

    浏览量

    84502

原文标题:用Python机器学习搞定验证码

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    无法验证邮箱,总是提示验证码错误,验证码明明是正确的。

    `无法验证邮箱,总是提示验证码错误,验证码明明是正确的。是不是系统的bug?`
    发表于 05-12 10:41

    一文解析验证码与打平台的攻防对抗

    1、验证码与打平台的攻防对抗  众所周知,验证码的出现是为了区分人和机器,但随着科技的发展,黑产从业者的可图之利增多,验证码的战场也进入了
    发表于 09-28 11:02

    平台是如何高效的破解市面上各家验证码平台的各种形式验证码的?

    ,比如说引入机器学习和神经网络等人工智能相关技术来智能识别图片中的验证码要素,提高识别验证要素的准确率等。以下是某个打平台相关人工智能技术
    发表于 11-01 15:21

    C#教程之中文验证码

    C#教程之中文验证码,很好的C#资料,快来学习吧。
    发表于 04-20 11:13 6次下载

    多样变换的手写验证码自动识别算法

    研究验证码自动识别技术可以进一步提升人识别验证码的可读性,增强机器识别的难度,从而提高网络安全性。针对目前提出的验证码识别方法基本都是采用光学字符识别(OCR)方法对
    发表于 12-20 14:14 0次下载

    简单地描述了如何用机器学习绕过E-ZPass New York网站的验证码

    ,来防止电脑自动填写表单。但是随着深度学习和计算机视觉的兴起,它们现在往往很容易被攻破。我在读Adrian Rosebrock的优秀的著作《Python计算机视觉深度学习》。在书中,Adrian简单地描述了他如何用
    的头像 发表于 01-22 09:15 6330次阅读
    简单地描述了如何用<b class='flag-5'>机器</b><b class='flag-5'>学习</b>绕过E-ZPass New York网站的<b class='flag-5'>验证码</b>

    SQLyog_12.4.1_带验证码

    SQLyog_12.4.1_带验证码.rar
    发表于 04-12 21:03 22次下载

    如何利用机器学习破解验证码的源代码教程

    验证码的设计是为了防止计算机自动填写表格,验证你是一个真实的“人”。但随着深度学习和计算机视觉的兴起,现在他们往往容易被击败。
    的头像 发表于 04-30 17:42 5819次阅读
    如何利用<b class='flag-5'>机器</b><b class='flag-5'>学习</b>破解<b class='flag-5'>验证码</b>的源代码教程

    以一个真实网站的验证码为例,实现了基于一下KNN的验证码识别

    很多网站登录都需要输入验证码,如果要实现自动登录就不可避免的要识别验证码。本文以一个真实网站的验证码为例,实现了基于一下KNN的验证码识别。
    的头像 发表于 12-24 17:27 7758次阅读

    拖动验证码的具体实现

    .验证码的一个功能就是来规避机器的自动操作,所以我们需要通过轨迹来判断这个拖动过程是真实的人还是机器,因此我们需要记录拖动的路径,路径经过计算之后可以发送到后端进行进一步的分类,比如对接深度
    的头像 发表于 07-18 11:02 6780次阅读
    拖动<b class='flag-5'>验证码</b>的具体实现

    验证码层出不穷?试试这个自动跳过验证码的工具

    目前网络上越来越多使用验证码了,验证码的本意是阻止机器刷流量挤占服务器资源,这本来无可厚非;但是验证码已经变得越来越过分,别说机器人了,连人
    的头像 发表于 11-15 10:42 5933次阅读

    验证码太麻烦,自动跳过验证码神器试一试

    目前网络上越来越多使用验证码了,验证码的本意是阻止机器刷流量挤占服务器资源,这本来无可厚非;但是验证码已经变得越来越过分,别说机器人了,连人
    的头像 发表于 11-15 11:15 1w次阅读

    爬虫实现目标网站验证码登陆

    在爬虫访问目标网站的过程中,很多网站为了避免被恶意访问,需要设置验证码登录,这样是为了避免非人类的访问。今天我们学习下如何使用Python爬虫实现验证码登录并且将生成的
    发表于 12-11 15:27 2412次阅读

    验证码到底在验证啥?聊一聊验证码是怎么为难我们人类的

    在文章开头,老狐先给大家玩一个验证码的游戏,猜出图中验证码字母。
    的头像 发表于 08-12 10:25 2064次阅读
    <b class='flag-5'>验证码</b>到底在<b class='flag-5'>验证</b>啥?聊一聊<b class='flag-5'>验证码</b>是怎么为难我们人类的

    Java 中验证码的使用

    今天我们讲一下在 Java 中验证码的使用。 验证码生成 本效果是利用easy-captcha工具包实现,首先需要添加相关依赖到pom.xml中,代码如下: com .github.whvcse
    的头像 发表于 09-25 11:11 998次阅读
    Java 中<b class='flag-5'>验证码</b>的使用