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

之前写过一篇验证码的破解,地址在这,其实效果不好,有很多朋友来问,其实我已经说了只是个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 条评论
登录 后参与评论

相关文章

来自专栏ytkah

excel同时冻结首行和首列怎么操作

  之前ytkah只知道excel可以冻结首行或首列,但还不清楚如何同时冻结excel首行和首列,后面看到小C的报表,问了他才明白怎么操作。   首先,我们先把...

2945
来自专栏深度学习与计算机视觉

手把手教你如何应用TF-Slim快速实现迁移学习

这是一篇以实践为主的入门文章,目的在于用尽量少的成本组织起来一套可以训练和测试自己的分类任务的代码,其中就会用到迁移学习,TF-Slim库的内容,所以我们分为下...

5728
来自专栏企鹅号快讯

Invoke-PSImage利用分析

0x00 前言 最近在github看见一个有趣的项目:Invoke-PSImage,在png文件的像素内插入powershell代码作为payload(不影响原...

1939
来自专栏计算机视觉life

自识别标记(self-identifying marker) -(3) 用于相机标定的CALTag源码剖析(上)

CALTag的源代码(MATLAB)可以从如下网址下载: https://github.com/brada/caltag 下面以一幅被遮挡的图I为例进行...

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

R数据可视化之ggplot2 (一)

学完R语言的基本操作后,我们还可以继续学习R的几大著名而且使用强大的包,今天讲其中的一个,就是ggplot2,至于这个包的评价和地位,我就不多说了,感兴趣可以百...

29712
来自专栏PaddlePaddle

【进阶篇】C-API 使用流程

编写|PaddlePaddle 排版|wangp 这篇推文介绍 PaddlePaddle C-API 整体使用流程 1 使用流程 使用 C-API 的工作流...

2793
来自专栏iOSDevLog

将Core ML模型集成到您的应用程序中

此示例应用程序使用经过训练的MarsHabitatPricer.mlmodel模型来预测火星上的栖息地价格。

571
来自专栏AI研习社

Github 项目推荐 | Windows 10上的 GPU 加速深度学习工具

有很多工具能够帮助开发者在 Linux 和 Mac 上构建深度学习环境(比如 Tensorflow,不幸的是,TensorFlow 无法在 Windows 上轻...

1132
来自专栏腾讯IVWEB团队的专栏

SVG 动画精髓(上)

DR本文主要是讲解关于 SVG 的一些高级动画特效,比如 SVG 动画标签,图形渐变,路径动画,线条动画,SVG 裁剪等。例如:路径动画图形渐变:线条动画:以及...

2560
来自专栏刘望舒

Android 人脸识别之人脸注册

2322

扫码关注云+社区