专栏名称: 机器学习研究会
机器学习研究会是北京大学大数据与机器学习创新中心旗下的学生组织,旨在构建一个机器学习从事者交流的平台。除了及时分享领域资讯外,协会还会举办各种业界巨头/学术神牛讲座、学术大牛沙龙分享会、real data 创新竞赛等活动。
目录
相关文章推荐
爱可可-爱生活  ·  【深度思考第十七篇:普通人学AI,关键不在于 ... ·  2 天前  
爱可可-爱生活  ·  【Even ... ·  3 天前  
宝玉xp  ·  转发微博-20241212151705 ·  5 天前  
宝玉xp  ·  OpenAI 直播的第 5 ... ·  5 天前  
51好读  ›  专栏  ›  机器学习研究会

【学习】使用深度学习来破解 captcha 验证码

机器学习研究会  · 公众号  · AI  · 2017-03-30 19:56

正文



点击上方“机器学习研究会”可以订阅哦
摘要
 

转自:杨培文

本文会通过 Keras 搭建一个深度卷积神经网络来识别 captcha 验证码,建议使用显卡来运行该项目。

下面的可视化代码都是在 jupyter notebook 中完成的,如果你希望写成 python 脚本,稍加修改即可正常运行,当然也可以去掉这些可视化代码。Keras 版本:1.2.2。

GitHub 地址:github.com/ypwhs/captch

captcha

captcha 是用 python 写的生成验证码的库,它支持图片验证码和语音验证码,我们使用的是它生成图片验证码的功能。

首先我们设置我们的验证码格式为数字加大写字母,生成一串验证码试试看:

from captcha.image import ImageCaptchaimport matplotlib.pyplot as pltimport numpy as npimport random%matplotlib inline%config InlineBackend.figure_format = 'retina'import stringcharacters = string.digits + string.ascii_uppercaseprint(characters)width, height, n_len, n_class = 170, 80, 4, len(characters)generator = ImageCaptcha(width=width, height=height)random_str = ''.join([random.choice(characters) for j in range(4)])img = generator.generate_image(random_str)plt.imshow(img)plt.title(random_str)

数据生成器

训练模型的时候,我们可以选择两种方式来生成我们的训练数据,一种是一次性生成几万张图,然后开始训练,一种是定义一个数据生成器,然后利用 fit_generator 函数来训练。

第一种方式的好处是训练的时候显卡利用率高,如果你需要经常调参,可以一次生成,多次使用;第二种方式的好处是你不需要生成大量数据,训练过程中可以利用 CPU 生成数据,而且还有一个好处是你可以无限生成数据。

我们的数据格式如下:

X

X 的形状是 (batch_size, height, width, 3),比如一批生成32个样本,图片宽度为170,高度为80,那么形状就是 (32, 80, 170, 3),取第一张图就是 X[0]。

y

y 的形状是四个 (batch_size, n_class),如果转换成 numpy 的格式,则是 (n_len, batch_size, n_class),比如一批生成32个样本,验证码的字符有36种,长度是4位,那么它的形状就是4个 (32, 36),也可以说是 (4, 32, 36),解码函数在下个代码块。

def gen(batch_size=32):
    X = np.zeros((batch_size, height, width, 3), dtype=np.uint8)
    y = [np.zeros((batch_size, n_class), dtype=np.uint8) for i in range(n_len)]
    generator = ImageCaptcha(width=width, height=height)
    while True:
        for i in range(batch_size):
            random_str = ''.join([random.choice(characters) for j in range(4)])
            X[i] = generator.generate_image(random_str)
            for j, ch in enumerate(random_str):
                y[j][i, :] = 0
                y[j][i, characters.find(ch)] = 1
        yield X, y

上面就是一个可以无限生成数据的例子,我们将使用这个生成器来训练我们的模型。


原文链接:

https://zhuanlan.zhihu.com/p/26078299

“完整内容”请点击【阅读原文】
↓↓↓