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

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

3天内不再提示

机器学习识别验证码技巧来了

马哥Linux运维 来源:未知 作者:李倩 2018-11-20 16:21 次阅读

写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有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生成的验证码:

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

再进行识别得到了结果:

另外,从图片来看,实际数据颜色明显和噪点干扰线不同,根据这一点可以直接把噪点全部去除,这里就不展开说了。

第一篇文章,先记录如何将图片进行灰度处理、二值化、降噪,并结合tesserocr来识别简单的验证码,剩下的部分在下一篇文章中和大家一起分享。

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

    关注

    66

    文章

    8373

    浏览量

    132391
  • 验证码
    +关注

    关注

    2

    文章

    20

    浏览量

    4693

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

    ,比如说引入机器学习和神经网络等人工智能相关技术来智能识别图片中的验证码要素,提高识别验证要素的
    发表于 11-01 15:21

    C#教程之中文验证码

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

    搜狗开放12306验证码识别技术助力抢票软件

    12306的验证码,已经击败了全国99%的购票者,我已经找不到回家的路了随着春运抢票高峰期来临,12306验证码识别成为用户讨论的热点。日前,搜狗浏览器、QQ浏览器等应用相继推出抢票功能,帮助用户秒
    发表于 10-13 16:21 1次下载

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

    研究验证码自动识别技术可以进一步提升人识别验证码的可读性,增强机器识别的难度,从而提高网络安全性。针对目前提出的
    发表于 12-20 14:14 0次下载

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

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

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

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

    一套基于GAN的验证码AI识别系统,能在0.5秒之内识别验证码

    近日,英国兰卡斯特大学、中国西北大学、北京大学的计算机科学家们共同开发了一种AI系统,能够在短短0.5秒内识别出多种验证码。该系统已在不同的33个验证码系统中进行了成功测试,其中11个来自世界上最受欢迎的一些网站,包括eBay和
    的头像 发表于 12-16 10:02 5009次阅读

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

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

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

    写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种: 图像类 滑动类 点击类 语音类
    的头像 发表于 05-03 13:43 2283次阅读

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

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

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

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

    带带弟弟OCR通用验证码识别SDK免费开源版

    在使用爬虫登录网站的时候,经常输入用户名和密码后会遇到验证码,简单一点的有字母验证码,复杂一点的有滑块验证码,点选文章和点选图片验证码。这些都是爬虫中的老大难问题,今天介绍一款通用
    的头像 发表于 03-30 17:26 4608次阅读

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

    在文章开头,老狐先给大家玩一个验证码的游戏,猜出图中验证码字母。
    的头像 发表于 08-12 10:25 2039次阅读
    <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 979次阅读
    Java 中<b class='flag-5'>验证码</b>的使用