本文会通过 Keras 搭建一个深度卷积神经网络来识别 captcha 验证码,建议使用显卡来运行该项目。
下面的可视化代码都是在 jupyter notebook 中完成的,如果你希望写成 python 脚本,稍加修改即可正常运行,当然也可以去掉这些可视化代码。Keras 版本:1.2.2。
GitHub 地址:https://github.com/ypwhs/captcha_break
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