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

之前写过一篇验证码的破解,地址在这,其实效果不好,有很多朋友来问,其实我已经说了只是个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强大的人脸识别包,只要十多行代码完全可以实现人脸识别的功能。这就叫站在巨...

3355
来自专栏杨清华的专栏

JPEG 编码过程:为 GPU 处理开路

分析JPEG图像的编解码过程以及图像缩放原理,针对处理过程中繁重的计算过程,考虑利用GPU并行加速处理的可能。

5541
来自专栏Python小屋

Python使用扩展库numpy计算矩阵加权平均值

本文介绍Python扩展库numpy的函数average()的用法。 >>> import numpy as np # 创建二维矩阵 >>> x = np.ma...

2775
来自专栏mathor

“达观杯”文本智能处理挑战赛

 由于提供的数据集较大,一般运行时间再10到15分钟之间,基础电脑配置在4核8G的样子(越消耗内存在6.2G),因此,一般可能会遇到内存溢出的错误

1212
来自专栏搞前端的李蚊子

vue实现侧边栏手风琴效果

 模板 ? 代码如下 html <template> <div class="header"> <ul> <!-...

4037
来自专栏ATYUN订阅号

【教程】利用Tensorflow目标检测API确定图像中目标的位置

深度学习提供了另一种解决“Wally在哪儿”(美国漫画)问题的方法。与传统的图像处理计算机视觉方法不同的是,它只使用了少量的标记出Wally位置的示例。 在我的...

5596
来自专栏大数据风控

R中如何用ifelse进行数据分组

数据分组,根据数据分析对象的特征,按照一定的数值指标,把数据分析对象划分为不同的区间部分来研究,以揭示内在的联系和规律性; 在R中,我们常用ifelse函数来进...

2328
来自专栏数据派THU

机器学习和深度学习视频资料精选(附学习资料)

来源:大数据挖掘DT数据分析 本文长度为633字,建议阅读3分钟。 本文为你介绍机器学习和深度学习的视频资料。 第一部分 基础语言 pandax视频教程链接: ...

5988
来自专栏Pulsar-V

原-图像处理基础(四)DCT变换

Imread()用于读取图片文件中的数据 figure() 控制画图的窗口 imshow() 显示图像 rgb2gray() 把真彩图像转变为灰度图像 d...

3146
来自专栏GAN&CV

迁移学习之--tensorflow选择性加载权重

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/d...

1164

扫码关注云+社区