最近在极客时间学习Tensorflow教程,想写一篇博文来总结一下CNN识别验证码这个小项目
生成验证码
我们会引入captcha这个库来生成我们的验证码
这个库安装也很简单
直接使用pip install 安装即可
我们生成一个验证码的数据集
from captcha.image import ImageCaptcha
import random
import numpy as np
import tensorflow.gfile as gfile
import matplotlib.pyplot as plt
import PIL.Image as Image
# 建立下面的列表,我们将用random方法从里面随机组合成一个验证码
NUMBER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
LOWERCASE = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z']
UPPERCASE = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z']
CAPTCHA_CHARSET = NUMBER # 定义字符集,这里我们选用数字的字符集
CAPTCHA_LEN = 4 # 验证码长度
CAPTCHA_HEIGHT = 60 # 验证码高度
CAPTCHA_WIDTH = 160 # 验证码宽度
TRAIN_DATASET_SIZE = 5000 # 验证码数据集的大小
TEST_DATASET_SIZE = 1000 # 验证码测试集的大小
TRAIN_DATA_DIR = './train-data/'
TEST_DATA_DIR = './test-data/'
def gen_random_text(charset=CAPTCHA_CHARSET, length=CAPTCHA_LEN):
"""
生成随机字符
:param charset: 数据集
:param length: 验证码长度
:return: 返回一个随机字符组成的一个列表,长度为验证码长度
"""
text = [random.choice(charset) for _ in range(length)]
return ''.join(text)
# 只是一个测试
# a = gen_random_text()
# print(a)
def create_captcha_dataset(size=100, data_dir='./data/', height=60,
width=160,
image_format='.png'):
"""
创建并保存验证码数据集
:param size:数据集的大小
:param data_dir:保存的路径
:param height:验证码的高度
:param width:验证码的宽度
:param image_format:图像保存的类型,这里默认是png格式
:return:
"""
# 先检测datadir目录下是否有存在的验证码,如果有,则清楚重新生成
if gfile.Exists(data_dir):
gfile.DeleteRecursively(data_dir)
gfile.MakeDirs(data_dir)
# 创建ImageCaptcha实例captcha
captcha = ImageCaptcha(width=width,height=height)
for _ in range(size):
# 生成随机字符
text = gen_random_text(charset=CAPTCHA_CHARSET, length=CAPTCHA_LEN)
# 生成验证码并保存
captcha.write(text, data_dir + text + image_format)
return None
# 创建并保存训练集
# 由于随机抽取的时候难免会重复,captcha验证码会覆盖之前生成的图片,所以总文件数目可能会比我们所设置的少
create_captcha_dataset(TRAIN_DATASET_SIZE, TRAIN_DATA_DIR)
create_captcha_dataset(TEST_DATASET_SIZE, TEST_DATA_DIR)
对于我们的验证码生成,我们可以使用数字集或字母集合来生成,所以在开头分别定义了 NUMBER LOWERCASE UPPERCASE 这三个列表
我们的验证码宽度和高度分别设置为160, 60
验证码的训练集和测试集大小分别为5000, 1000
但实际进入到对应目录下,验证码数量都是小于我们的设置大小的
原因是我们使用random模块随机生成数字的时候,会出现重复的数字,进而生成图片的时候会覆盖掉原先生成的验证码
我们来看一下我们生成的验证码结果
可以看到验证码中带有许多噪点,而且每个验证码图片中都有一条曲线来干扰
数据预处理
新建一个data_process 的py文件
我们需要对我们