Keras实现CNN网络识别验证码

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在极客时间学习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、付费专栏及课程。

余额充值