Keras实现CNN网络识别验证码

这篇博客介绍了如何使用Keras构建CNN模型来识别验证码。首先通过captcha库生成验证码数据集,接着对数据进行预处理,包括灰度化和one-hot编码。然后,构建了包含卷积层、池化层和全连接层的模型进行训练,并在训练过程中使用Dropout防止过拟合。最后,博主分享了模型训练的心得,认为Keras对机器学习初学者非常友好。
摘要由CSDN通过智能技术生成

最近在极客时间学习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文件
我们需要对我们

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值