Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[验证码识别技术]字符验证码杀手--CNN

[验证码识别技术]字符验证码杀手--CNN

作者头像
用户1170933
发布于 2018-04-02 02:46:30
发布于 2018-04-02 02:46:30
6.1K0
举报
文章被收录于专栏:python开发者python开发者

字符验证码杀手--CNN

1 abstract 

目前随着深度学习,越来越蓬勃的发展,在图像识别语音识别中也表现出了强大的生产力。对于普通的深度学习爱好者来说,一上来就去跑那边公开的大型数据库,比如ImageNet或者CoCo,可以会觉得这个屠龙之技离生活好遥远。那么本文就是希望将此技术运用到一些普通用户日常就能感知的场景上,让普通用户切实能够体会到深度学习工具的非凡能力。

关键字:深度学习,验证码,破解,识别,CNN

2 验证码概述

很多普通程序员在入门爬虫的时候,基本上都会遇到的环节---“验证码”。就是这个东西使得很多程序的自动化工作止步,让人懊恼不已。关于验证码的功能,以前提到过(todo),本文不再赘述,只用一句话来概括下:验证是一种防止程序自动化的一个措施,其最常见的表现形式就是看图识别字符。

验证码技术就是一种反自动化技术。本文所解决的问题则是,使用深度学习技术来实现“全自动化的识别验证码”(这听起来有那么点人工智能的味道了)。

因为现在新的形式的验证产品很多,光从外界的展现形式上就有:

  1. 完整滑动解锁式
  2. 随机滑动拼图式
  3. 随机点选汉字式
  4. 图片分类选择式
  5. 其它

但是本文是以学习为目标,并不指向任何一种验证形式,而是指向传统的字符型验证码。由浅入深来对验证码进行一些科普。下图就是网络上的各色各样的字符型验证码,敬请大家赏析:

3 验证码场景

首先说明本文的观点:随着深度学习技术在图像处理技术上越来越强大的表现,这些传统的纯依靠简单图片的码式验证已经没有任何的安全性可言

但是这些不安全的验证码却即使是在今天写这篇文章的时候,还存在于互联网的各个角落,存在于大互联网公司,基于像银行,证券和保险等等这些金融领域。

这些主要的应用场景包括:注册,登录,找回密码,抢购下单,评论,投票等等。如果这个地方不安全的话,也就是说能够通过程序做自动化,那么网络上的资源就会全部被自动化程序抢夺过去,或者说直接落入少数会做自动化的人的手中。为什么呢?因为普通计算机程序的计算能力是人的几万甚至几百万倍。

如果还不能理解,我说一个简单的例子吧,如果你自己去注册你的帐号密码需要3分钟完成,但是通过程序可以一秒钟注册300个账号。讲到这个地方,如果你还不理解,那么你想象在去年的时候互联网金融行业非常火爆时,每注册一个账号就有20块钱可以拿。也就是说比较厉害的人可以通过这个程序,一秒钟赚6000块钱。

如果你还不能理解这个东西的话,再举一些和大家日常生活中非常相关度高的一个场景:

  1. 网上春节购买火车票。春节的时候大家会买火车票吧?你是不是发现你守在电脑面前不管怎么用心,不管怎么努力,结果发现放出火车票的时候,那些票一扫而光?然后发现身边好多人都没买到票,但是网上黄牛那儿却票源充足,但是不好意思,得加价。
  2. 网上手机新品发布秒杀。国内大厂手机新品发布时,网上瞬间秒光,自己买不到,但是黄牛那儿也有,得加钱。
  3. 网上开盘选房子。你要买房子,网上开盘选房,虽然你已经做好了不看户型,有房就抢的准备,但是开盘瞬间,你就发现网络被挤爆,然后等线上网页缓过来时,房子已经完了。但是身边加钱找专业人员代抢的人却抢到了房子,为什么?
  4. 网上拍汽车牌照。在国内某些大城市里面对于汽车牌照的发放量的把控是是非常严格的。每次在网上拍牌照的那天,很多人都会请假一天,然后在一个网络环境非常好的网吧里面等待来处理这个事情,但是发现还是抢不过别人付费请的专业团队的那些人。当然抢不过有一方面是自己业务不熟悉的原因,还有一方面就是:可能你在拿一个小铲子的辛苦的小打小闹的,别人直接操纵在一个大型挖掘机上战场了。生产力是完全不一样的。

类似的事情特别特别多。这个产业就叫做“薅羊毛”,顾名思义就是积少成多,有很小的成本把一点点的小的利益聚集起来就会变成一个比较可观的利益。

4 应用举例

4.1 互联网大厂

4.1.1 美橙互联

https://www.cndns.com/members/signin.aspx

4.1.2 中国互联网络信息中心

http://www.cnnic.net.cn/

4.1.3 百度

https://wappass.baidu.com/

4.1.4 阿里支付宝

https://omeo.alipay.com/service/checkcode?sessionID=a2a5fc056b8e3ef8b32758835333d673&t=0.3144848125469759

4.1.5 网易邮箱

http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=163navi&regPage=163

4.1.6 58同城

https://passport.58.com/validcode/get?vcodekey=d5S2Tk7dofqN30VwIN6WTwvOHP6AkyvC&time=1466065243496

4.2 互联网金融

4.2.1 平安保险

https://www.pingan.com.cn/pinganone/pa/index.screen?sid_source=toagw

4.2.2 宜信

https://www.creditease.cn/a/user/loadRegisterUserPage

4.2.3 大地保险

http://www.95590.cn/ebiz/loginSkin.jsp?loginBackUrl=http://www.95590.cn/

5 图像识别

下面是字符验证码两种比较极端的表现形式:

简单类型的特点:

  1. 背景和前景可以很容易完全分离
  2. 字符的取值范围仅为[0,9]这样的最小有限域
  3. 生成图片的字符为单一字体
  4. 多位字符串可以通过简单算法进行完美切割

复杂类型的特点:

  1. 背景有随机干扰点或者干扰线条
  2. 字符范围为所有数字,字母,甚至汉字集
  3. 生成的图片的字体多样化
  4. 多位字符在图片上的位置出现重合,无法完美切割

在上一部分内容中举的现在线上应用的例子,基本上属于比较复杂的类型,但是由于它的设计理念仍然停留在图像学上,所以对于现在的CNN来说,是完全没有技术上的问题,毕竟很多深度学习框架的入门教程就是对手写数字数据库MNIST进行识别。它们有的区别只是前期准备工作的工作量的不同,这里所说的前期准备工作就是指:带标记的数据的准备工作。所谓的“带标记的数据”是指,需要人预先告诉计算机什么样的图片对应着是什么样的字符串,因为本问题中所用的CNN方法是属于有监督学习的范围,需要有个场外的“老师”进行指导。

关于上面两种极端的字符验证码的识别的技术方法,请移步文章末尾链接。

里面有两个例子,并附上了完整的源码:

  1. 使用传统机器学习SVM对简单验证码识别
  2. 使用CNN对多位字符验证端到端的识别

当然后面的那种CNN的方法是对于解决此类问题是属于核武器级别的,CNN模式的优点缺点都很明显:

-       优点:通用性强,换一个模式后,可以不用修改代码就可以直接训练出新的模型。

-       缺点:需要大量的带标注的数据,特别是端到端的复杂一点的,可能需要几万带标记的先验数据集。

在CNN的文章中给出的demo,因为只是做效果演示,里面的数据集的生成是直接用的第三方标准库无限生成的。如果是在具体的场景去使用,则需要准备大量的带标记数据,像本文提到的困难的字符验证,如果要达到90%以上的正确识别率,估计需要5万带标记数据。下图是生成的部分先验数据集:

对于不同的多字符验证码,根据其难易程度分类,可以有一些不同的处理方式,有“蛮力型”的通用识别方法,也有“特事特办”的特别识别方法。

5.1 通用识别方法

所谓的通用识别方法就是:流程化作业,基本不太需要在编程上思考太多。

通用步骤如下:

  1. 下载一定数量的目标验证码图片。根据验证图片的复杂程度而定,有的需要几百张,有的需要几万张。
  2. 已经事先准备好一套标准的CNN图像分类的项目模板,需要事先做好的功课。
  3. 对项目模板进行简单的参数调整,以适配当前问题的图片尺寸。
  4. 将图像输入CNN,将输出的结果和先验标记的类型做误差对比
  5. 不断迭代生成模型

这其实是一个深度学习对分类问题处理的标准化流程。有不明白的地方,请补充一点相关的知识:

https://www.tensorflow.org/get_started/mnist/beginners

https://www.tensorflow.org/get_started/mnist/pros

由Google公司主推的深度学习框架tensorflow的入门文档里面就介绍了分别用矩阵回归和CNN神经网络对手写数字识别的方法。

当然,关于如何获取带标记的数据,目前也有比较便宜的获取渠道,直接在网上搜索“打码平台”,提供这“人工智能”领域的“人工”服务的厂家也不少,而且是明码标价:

对于字符型验证码,基本上是几分钱一张标记图吧。

5.2 特别识别方法

虽然上面的通用型方法可以百试不爽,但是每次来一个新的问题,你都要准备大量的带标记数据,这个未免也太繁琐了,而且像一些简单的字符验证码的问题,其实倒没有必要去大动干戈。那么这个时候就需要一些小的技巧了。

这里所说的特别识别方法,仍然是基于深度学习这种通用方法来做的,只是我们可以将一些复杂问题进行适当的简化,这个思想有点类似于“降维”处理的意思。

因为深度学习具有这样的神奇效果:理论上对绝大多数的线性或者非线性问题都能实现非常好的拟合

但是对于越复杂的问题,对数据的需求量越大。这个现状是无法避免的,但是我们却能够做一些人为的自动化工作,以达成此目标。

比如像这些验证:

不管它们色彩有多么的变化,不管背后加些啥乱七八糟的干扰点或者线,但是有一个事实他们无法回避,就是:他们的字符之间都是非常好分割的。也就是说,像这些类型的验证码,可以很容易将一个本来要判定N位字符串的问题简化为“判定1位字符,然后将N个这样的图片再组合起来”。这样网络的复杂度可以大大的简化,训练所需要的样数量,还有训练的时长都会大量减少

如果验证码图片可以从N维“降维”到1维了,这个字符的字体如果是单一的,比如下面这些验证:

那么问题就更简单了:只需要为每个字符分类准备一张图片即可。也不是说如果你的验证码范围是[0,9],则只需要从下载的图片集中对0~9这几个数字每个标记一张即可,然后就是使用一些普通的数据增强技术:贴图,绽放,上下自由截取,随机噪点等等,可以生成无限多的数据集了,当然这些全部是由程序自动化完成。

好的图像预处理也很重要,所谓好的图像预处理,就是指能够将图像里面的主体特征变得更加明显,例如:

好的图像预处理会使识别问题难度直线下降,比如上面左图如果用CNN估计可能要1万样本,而右边的那个经过预处理后,估计只需要1千样本就OK了。

关于如何做数据增强,在后续的文章中会进行具体介绍。

6 文末小结

如果对本话题有兴趣请持续关注本系列文章。

如果还想进一步讨论相应的技术,请加入QQ群:592109504

手机QQ扫描二维码https://mp.weixin.qq.com/s/7RCtZH0ljuF5Ti6jgQxyww

验证识别合辑技术文章:https://zhuanlan.zhihu.com/p/30871712

后续会有更多干货文章,敬请期待。。。  

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
本文主要探讨了如何利用深度学习识别图片中的字符型验证码,通过对比传统机器学习方法,指出了在深度学习下使用端到端模型的优势。同时,介绍了两种不同的神经网络结构:卷积神经网络CNN和循环神经网络RNN。作者还提供了项目地址,方便读者复现。
用户1170933
2018/01/05
1.6K0
基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
[验证码识别技术]-初级的滑动式验证图片识别
用户1170933
2018/01/05
1.6K0
[验证码识别技术]-初级的滑动式验证图片识别
字符型图片验证码识别完整过程及Python实现
本文讲述如何通过对比学习算法实现手写数字识别,并使用一个基于SVM的算法进行测试。通过对比不同算法的效果,得出结论:使用基于SVM的算法可以较好地识别手写数字。
用户1170933
2018/01/05
6.2K0
字符型图片验证码识别完整过程及Python实现
原来验证码是为了对抗黑客
年关将至,一场世界级的社会壮举又将上演,那就是咱们的春运,短短的十几天将搬运30亿人次的客流,让国外的记者和看客们都不得不佩服咱们伟大祖国的交通运输能力。为了准备这场“大戏”,抢票这种全民级现象已经提前上演,虽然买票难的问题已经逐年好转,但在抢票过程中仍然槽点不断,其中的明星当属验证码了,这两天12306的验证码已经被大家各种吐槽各种调侃,那么这次和大家一起来研究一下关于这个验证码背后的问题。 验证码的由来 其实一开始,互联网上是没有验证码的。那时想要在论坛上发帖,只需轻轻敲一下回车键。然而,当时的黑客也十
程序员互动联盟
2018/03/15
9460
原来验证码是为了对抗黑客
Python项目实战篇——常用验证码标注和识别(需求分析和实现思路)
今天给大家分享的实战项目是常用验证码标注&识别,从想法诞生到实现思路,再到编码实战的整体过程,这个过程我前后整理了上万字,计划分章节来发布。言归正传,一起来看看今天的内容吧!今天这篇内容主要讲解这篇文章的创作灵感、需求分析和实现思路。
Python进阶者
2021/09/15
7270
Python项目实战篇——常用验证码标注和识别(需求分析和实现思路)
基于Python使用SVM识别简单的字符验证码的完整代码开源分享
本文介绍了一个基于Python使用SVM识别简单的字符验证码的完整代码,包括数据集、原理、代码环境、数据解释和方案思路。通过这个案例,可以学习到如何利用机器学习技术解决验证码识别问题。
用户1170933
2018/01/05
1.8K0
基于Python使用SVM识别简单的字符验证码的完整代码开源分享
TensorFlow识别字母扭曲干扰型验证码-开放源码与98%模型
转载请附:博文网址: urlteam   ,github 网址:tensorflow_cnn
十四君
2019/11/24
1.5K0
12306图片验证12小时内被破解,验证安全的出路到底在哪?
03月16日上午,12306网站更新了自己的验证码形式,将原有的验证码从英文字符变换到8张小图片,用户必须根据问题提示来点击选中正确的图片,然后才能预定车票。紧接着,各路媒体开始发稿,《12306官网放大招:启用图片验证码所有抢票软件将失效》《12306官网推出全新图片验证码抢票软件将失效》等新闻层出不穷。作为一个程序员,看到这样的标题,十分困惑这些媒体是怎么用上帝视角这么直接断定抢票软件将全部失效的,可以想象一大波刷票公司正准备捋起袖子干活就直接听到12306宣布自己胜利了。当然,我们反对一切的黄牛党,本
我是攻城师
2018/05/11
1.6K0
利用深度学习实现验证码识别-1
验证码(CAPTCHA)是网络安全中常用的一种机制,用于区分人类用户和自动化程序。然而,随着人工智能技术的发展,计算机视觉和深度学习算法在识别验证码方面取得了显著进展。本文将介绍如何使用PyTorch框架实现一个深度学习模型来识别简单的数字验证码。
井九
2024/10/12
1650
利用深度学习实现验证码识别-1
Python验证码识别 | 源码+通用模型
项目地址:https://github.com/kerlomz/captcha_trainer
用户4738238
2020/06/02
6.1K0
Python验证码识别 | 源码+通用模型
模仿黑产破解12306验证码,验证码产品的未来是?
导读:12306验证码,长时间高居反人类产品排行榜第一名(据某网站调查),普通人一次通过率仅8%,人也识别不清的图片就能成功阻挡自动机了吗?谷歌街景验证码完全取自自然环境确保图片的不重复不被爆破,但是面对黑产的巨额利润,又能坚持多久?本文由安全平台部的shisi撰写,试图通过模仿黑产的破解手法去重新思考验证码产品的发展方向。 验证码,人类与机器不平等的对抗 在AI的新时代背景下,破解一款验证码的成本正变的越来越低。 很多时候,看似复杂的谷歌街景、12306验证码、让人望而却步的百万图库,实际并不复杂:
腾讯技术工程官方号
2018/05/11
1.3K0
当 AI 足够聪明时,我们的验证码还有用吗?
点击蓝字 关注我们 大家好,欢迎来到《不写代码也能看懂的风控安全系列》。 今天开启的“验证码风云录”专题将围绕一个课题展开,即探秘:“验证码为什么越做越简单了?” 在这一系列中,笔者将验证码的20年发展历程大致分为3大阶段: · 比谁更丑 → 图像对抗时代 → 本文揭秘 · 比谁更精 → 行为对抗时代 → 下篇预告 · 比谁更深 → 资源对抗时代 → 前沿报告 而本文将要带大家走近的,便是“比比谁更丑”的图像对抗时代。 全文4000字,阅读预计15分钟,喜欢你就赞我一下! 01 #前言:为什么会有
腾讯技术工程官方号
2021/08/23
7650
【2018春运-AI大战黄牛党】智能抢票选座,机器学习阻击黄牛党
作者:常佩琦 【新智元导读】春运已到达高峰期,不少浏览器推出了人工智能抢票和选座功能。而黄牛党也与时俱进,用机器人和AI恶意刷票。如何应对这种现象?专家表示可利用机器学习来阻击黄牛党。 又到了一年一度的春运大战。与往年不同的是,AI在今年的春运大战中扮演了重要角色。 据悉,今年春运全国旅客发送量预计将达到30亿人次,预计铁路、民航分别增长8.8%和10%。如此庞大的返乡人群,加大了购票的难度。而12306利用稀奇古怪的图像验证码来防止黄牛党恶意刷票,结果却苦了正常购票的用户。 不断有网友吐槽,12306网站
新智元
2018/03/20
8200
【2018春运-AI大战黄牛党】智能抢票选座,机器学习阻击黄牛党
Android开发笔记(一百五十)自动识别验证码图片
若问目前IT领域最炙手可热的技术方向,必属人工智能(简称AI)无疑。前有谷歌的阿法狗完胜围棋世界冠军柯洁,后有微软小冰出版了诗集《阳光失了玻璃窗》,一时间沸沸扬扬,似乎人工智能无所不能,从而掀起了人民大众了解和关注AI的大潮。 虽然人工智能看起来仿佛刚刚兴起,但是它的相关产品早已普遍应用,在工业制造领域,有越来越多的机器人用于自动化生产;在家庭生活领域,则有智能锁、扫地机器人等助力智能家居。这些智能产品的背后,离不开人工智能的几项基本技术,包括计算机视觉、自然语言处理、数据挖掘与分析等等。这几项技术的应用说明如下: 1、计算机视觉,包括图像识别,视频识别等技术,可应用于指纹识别、人脸识别、无人驾驶汽车等等; 2、自然语言处理,包括音频识别、语义分析等技术,可应用于机器翻译、语音速记、信息检索等等; 3、数据挖掘与分析,包括大数据的相关处理技术,可应用于商品推荐、天气预报、红绿灯优化等等; 上述的几个人工智能应用,看似牛逼,可是这跟Android开发有什么关系呢?其实手机App很早就用上了相关的智能技术,还记得12306网站的神奇验证码吧,买张热点地区的火车票一直是个老大难,常常在火车站售票窗口排了许久的队伍,终于排到你的时候却发现目的地的火车票卖光了。特别是春运的时候,即使不到售票窗口排队,而是到12306网站买票,也常常因为各种操作问题贻误下单,于是各种抢票插件应运而生,帮助用户自动登录、自动选择乘车日期和起止站点、自动下单抢票。抢票插件的核心功能之一,便是自动识别登录过程中的验证码图片,原本这个验证码图片是用来阻止程序自动登录的,然而道高一尺魔高一丈,任你采取图片验证码又如何,抢票插件照样能够识别出图片所呈现出来的形状。注意,这里提到的识别图片中的验证码,即为人工智能的一项初级应用。 验证码图片识别,最简单的是数字验证码,因为数字只有从0到9一共十个字符,并且每个数字的形状也比较简单,所以本文就从数字验证码的识别着手,拨开高大上的迷雾,谈谈人工智能的初级应用。 先来看看一张再普通不过的验证码图片:
aqi00
2019/01/18
1.3K0
网络验证码--你到底是爱它还是恨它?
用户1170933
2017/12/27
1.3K0
网络验证码--你到底是爱它还是恨它?
使用Python+Tensorflow的CNN技术快速识别验证码
2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 正文共2929个字,17张图,预计阅读时间:8分钟。 近年来,机器学习变得愈加火热,中国选手柯洁与AlphaGo的人机大战更是引起热议。目前,在图像识别和视觉分析研究中,卷积神经网络(CNN)技术的使用越来越多。Tensorflow 是由 Google 团队开发的神经网络模块,短短几年间, 就已经有很多次版本的更新。最近我也在自学Tensorflow,想通过卷积神经网络快速识别整块验证码(不分割字符)。期间也碰到许多
企鹅号小编
2018/01/24
1.4K0
使用Python+Tensorflow的CNN技术快速识别验证码
发票编号识别、验证码识别 ,图像分割
地址:http://v.youku.com/v_show/id_XMTI1MzUxNDY3Ng==.html
机器学习AI算法工程
2019/10/29
1.9K0
发票编号识别、验证码识别 ,图像分割
【DCIC2022】科技金融子赛道验证码识别0.65+ baseline
在传统的文本识别方法中,任务分为3个步骤,即图像预处理、字符分割和字符识别。需要对特定场景进行建模,一旦场景变化就会失效。面对复杂的文字背景和场景变动,基于深度学习的方法具有更优的表现。
致Great
2022/03/11
4830
【DCIC2022】科技金融子赛道验证码识别0.65+ baseline
实战:CNN+BLSTM+CTC的验证码识别从训练到部署 | 技术头条
本项目适用于Python3.6,GPU>=NVIDIA GTX1050Ti,原master分支已经正式切换为CNN+LSTM+CTC的版本了,是时候写一篇新的文章了。
AI科技大本营
2019/05/10
1.1K0
实战:CNN+BLSTM+CTC的验证码识别从训练到部署 | 技术头条
图形验证码识别技术
阻碍我们爬虫的。有时候正是在登录或者请求一些数据时候的图形验证码。因此这里我们讲解一种能将图片翻译成文字的技术。将图片翻译成文字一般被成为光学文字识别(Optical Character Recognition),简写为OCR。实现OCR的库不是很多,特别是开源的。因为这块存在一定的技术壁垒(需要大量的数据、算法、机器学习、深度学习知识等),并且如果做好了具有很高的商业价值。因此开源的比较少。这里介绍一个比较优秀的图像识别开源库:Tesseract。
用户2200417
2022/03/07
2K0
推荐阅读
相关推荐
基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档