验证码破解之一:定长文本验证码

之前写过一篇验证码的破解,地址在这,其实效果不好,有很多朋友来问,其实我已经说了只是个demo;既然如此,就写下文本验证码的破解;本次的主题是定长的,就是验证码的长度是个定值,也是大家在上网过程中遇到的最多的验证码。

其实挺简单的,网上也有很多的总结性的文章,基本验证码破解就两个思路(deep learning):

  • 定长类:卷积 + 多个Softmax
  • 不定长类: LSTM + CTC

这次的方法就是卷积+多个softmax

与传统的方法的区别

传统的方法是:

  1. 判定长度
  2. 分割单个字符
  3. 单个字符分类

现在我们的方法是:

构建一个网络让其一次性输出所有的字符(定长)

好处是显而易见的,简单啊!!!!同时借助大量的数据可以获得相当高的成功率

破解过程

数据的获取

由于需要大量的数据,所以无法通过网络down下来手写答案,所以只好代码生成;有一个python库可以帮我们搞定这个事情,地址戳这 贴下官方生成验证码的示例:

from captcha.audio import AudioCaptcha
from captcha.image import ImageCaptcha

audio = AudioCaptcha(voicedir='/path/to/voices')
image = ImageCaptcha(fonts=['/path/A.ttf', '/path/B.ttf'])

data = audio.generate('1234')
audio.write('1234', 'out.wav')

data = image.generate('1234')
image.write('1234', 'out.png')

非常简单,同时还可以生成语音验证码

构建网络

大家看下生成的验证码图片就知道了其实很简单,所以网络不需要构建很复杂就可以很有效的搞定这件事,假设字符的固定长度是4,参考代码如下(keras):

for i in range(4):
    x = Convolution2D(32*2**i, 3, 3, activation='relu')(x)
    x = Convolution2D(32*2**i, 3, 3, activation='relu')(x)
    x = MaxPooling2D((2, 2))(x)

x = Flatten()(x)
x = Dropout(0.25)(x)
x = [Dense(n_class, activation='softmax', name='c%d'%(i+1))(x) for i in range(4)]
model = Model(input=input_tensor, output=x)

很简单对吧,其实这个网络就可以工作的很好

训练

model.fit_generator(gen(), samples_per_epoch=51200, nb_epoch=5, nb_worker=2, pickle_safe=True, validation_data=gen(), nb_val_samples=1280)

gen是个生成器,生成训练数据

测试

x, y = next(gen(1))
y_pred = model.predict(X)
plt.title('real: %s\npred:%s'%(decode(y), decode(y_pred)))
plt.imshow(X[0], cmap='gray')

结果

训练了5个epoch,每个epoch大概5W张,acc可以到0.99

代码我是跑了别人使用Keras写的,准备使用Tensorflow复现下,写好后一并拿出来吧,暂时没有!

参考博客:

端到端的OCR

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Python数据挖掘:Kmeans聚类数据分析及Anaconda介绍

糖豆贴心提醒,本文阅读时间8分钟 今天我们来讲一个关于Kmeans聚类的数据分析案例,通过这个案例让大家简单了解大数据分析的基本流程,以及使用Python实现...

40913
来自专栏数说工作室

【分类战车SVM】附录:用Python做SVM模型

本集目录为: 一、简化版SMO算法 二、LIBSVM包 1.简介 2.数据格式 3.安装 4.简单的使用方法 三、题外话 上一集介绍了SMO的算...

27810
来自专栏量子位

AI跟Bob Ross学画画,杂乱色块秒变风景油画 | PyTorch教程+代码

王新民 编译整理 量子位 出品 | 公众号 QbitAI 正在研究机器学习的全栈码农Dendrick Tan在博客上发布了一份教程+代码:用PyTorch实现将...

3495
来自专栏互联网杂技

A*算法详解

概述 虽然掌握了 A* 算法的人认为它容易,但是对于初学者来说, A* 算法还是很复杂的。 搜索区域(The Search Area) 我们假设某人要从 A 点...

3409
来自专栏大数据挖掘DT机器学习

文本自动分类案例(源码)

使用机器学习方法 做文档的自动分类 套路: 1.根据每个文件 生成该文件的一个特征 2.根据特征 选择 分类器 进行文本分类 3.(可选)根据 2 步结果,调...

42512
来自专栏PPV课数据科学社区

ECharts又搞大动作!3.5 版本提供更多数据可视化图表

在 echarts 新发布的 3.5 版本中,新增了日历坐标系,增强了坐标轴指示器。同时,echarts 统计扩展 1.0 版本发布了。日历坐标系用于在日历中绘...

3506
来自专栏ml

faster-rcnn中ROI_POOIING层的解读

在没有出现sppnet之前,RCNN使用corp和warp来对图片进行大小调整,这种操作会造成图片信息失真和信息丢失。sppnet这个模型推出来之后(关于这个网...

4679
来自专栏PPV课数据科学社区

【学习】SPSS探索分析实践操作

SPSS为我们提供了探索分析,所谓探索分析之所以是探索,是因为有时候我们对于变量的分布特点不是很清楚,探索的目的在于帮助我们完成以下的工作:识别...

3618
来自专栏数说工作室

【SAS Says】扩展篇:IML(3):条件与循环

这是一段“资产收益率情景到评级情景的映射”的SAS程序,出自《金融计算与建模》(朱世武,282页): ? 代码中既用到了循环语句(do .. to ..),也...

37111
来自专栏IT派

用python怎样识别验证码?(含源码)

验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻。本文介绍了一套...

2290

扫码关注云+社区