Tensorflow搭建CNN实现验证码识别

​整个项目代码分为三部分:

  • Generrate_Captcha:

生成验证码图片(训练集,验证集和测试集);

读取图片数据和标签(标签即为图片文件名);

  • cnn_model:卷积神经网络;

  • driver:模型训练及评估。

1、配置项

class Config(object):
    width = 160  # 验证码图片的宽
    height = 60  # 验证码图片的高
    char_num = 4  # 验证码字符个数
    characters = range(10)  # 数字[0,9]
    test_folder = 'test'    # 测试集文件夹,下同
    train_folder = 'train'
    validation_folder = 'validation'
    tensorboard_folder = 'tensorboard'  # tensorboard的log路径
    generate_num = (5000, 500, 500)  # 训练集,验证集和测试集数量
    alpha = 1e-3  # 学习率
    Epoch = 100  # 训练轮次
    batch_size = 64     # 批次数量
    keep_prob = 0.5     # dropout比例
    print_per_batch = 20    # 每多少次输出结果
    save_per_batch = 20     # 每多少次写入tensorboard

2、生成验证码(class Generate)

验证码图片示例:

file

0478

check_path():检查文件夹是否存在,如不存在则创建。

gen_captcha():生成验证码方法,写入之前检查是否以存在,如存在重新生成。

3、读取数据(classs ReadData)

read_data():返回图片数组(numpy.array格式)和标签(即文件名);
label2vec():将文件名转为向量;


label = '1327'
​
label_vec = [0,1,0,0,0,0,0,0,0,0,
            0,0,0,1,0,0,0,0,0,0,
            0,0,1,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,1,0,0]

load_data():加载文件夹下所有图片,返回图片数组,标签和图片数量。

4、定义模型(cnn_model)

采用三层卷积,filter_size均为5,为避免过拟合,每层卷积后面均接dropout操作,最终将的图像转为的矩阵。
大致结构如下:

file

模型结构

5、训练&评估

  • next_batch():迭代器,分批次返还数据;

  • feed_data():给模型“喂”数据;

x:图像数组;
y:图像标签;
keep_prob:dropout比例;

  • evaluate():模型评估,用于验证集和测试集。

  • run_model():训练&评估

6、目前效果

目前经过4000次迭代训练集准确率可达99%以上,测试集准确率93%,还是存在一点过拟合,不过现在模型是基于CPU训练的,完成一次训练耗费时间大约4个小时左右,后续调整了再进行更新。

Images for train :10000, for validation : 1000, for test : 1000
Epoch : 1
Step     0, train_acc:   7.42%, train_loss:  1.43, val_acc:   9.85%, val_loss:  1.40, improved:*  
Step    20, train_acc:  12.50%, train_loss:  0.46, val_acc:  10.35%, val_loss:  0.46, improved:*  
Step    40, train_acc:   9.38%, train_loss:  0.37, val_acc:  10.10%, val_loss:  0.37, improved:   
Step    60, train_acc:   7.42%, train_loss:  0.34, val_acc:  10.25%, val_loss:  0.34, improved:   
Step    80, train_acc:   7.81%, train_loss:  0.33, val_acc:   9.82%, val_loss:  0.33, improved:   
Step   100, train_acc:  12.11%, train_loss:  0.33, val_acc:  10.00%, val_loss:  0.33, improved:   
Step   120, train_acc:   9.77%, train_loss:  0.33, val_acc:  10.07%, val_loss:  0.33, improved:   
Step   140, train_acc:   8.98%, train_loss:  0.33, val_acc:  10.40%, val_loss:  0.33, improved:*  
Epoch : 2
Step   160, train_acc:   8.20%, train_loss:  0.33, val_acc:  10.52%, val_loss:  0.33, improved:*  
...
Epoch : 51
Step  7860, train_acc: 100.00%, train_loss:  0.01, val_acc:  92.37%, val_loss:  0.08, improved:   
Step  7880, train_acc:  99.61%, train_loss:  0.01, val_acc:  92.28%, val_loss:  0.08, improved:   
Step  7900, train_acc: 100.00%, train_loss:  0.01, val_acc:  92.42%, val_loss:  0.08, improved:   
Step  7920, train_acc: 100.00%, train_loss:  0.00, val_acc:  92.83%, val_loss:  0.08, improved:   
Step  7940, train_acc: 100.00%, train_loss:  0.01, val_acc:  92.77%, val_loss:  0.08, improved:   
Step  7960, train_acc: 100.00%, train_loss:  0.01, val_acc:  92.68%, val_loss:  0.08, improved:   
Step  7980, train_acc: 100.00%, train_loss:  0.00, val_acc:  92.63%, val_loss:  0.09, improved:   
No improvement for over 1000 steps, auto-stopping....
Test accuracy:  93.00%, loss:  0.08

7、Tensorboard

每次训练之前将Tensorboard路径下的文件删除,不然趋势图上会凌乱。
Accurracy

file

loss

file
原文链接及完整代码:

https://github.com/AwesomeTang/Captcha_CNN

​文源网络,仅供学习之用,如有侵权,联系删除。

我将优质的技术文章和经验总结都汇集在了我的公众号【Python圈子】里,为方便大家学习,还整理了一套学习资料,免费提供给热爱Python的同学! 更有学习交流群,多交流问题才能更快进步~
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
验证码识别是一个常见的图像识别问题,卷积神经网络(CNN)是其中一种常用的解决方案。下面是一个使用 TensorFlow 2 实现的简单 CNN 模型来识别验证码的例子: 首先,导入必要的库: ```python import os import numpy as np import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout ``` 接着,定义一些超参数: ```python IMG_WIDTH = 60 IMG_HEIGHT = 20 BATCH_SIZE = 32 EPOCHS = 10 NUM_CLASSES = 4 ``` 其中,`IMG_WIDTH` 和 `IMG_HEIGHT` 分别代表输入图像的宽度和高度,`BATCH_SIZE` 是每次训练时使用的样本数量,`EPOCHS` 是训练迭代次数,`NUM_CLASSES` 是验证码字符集的大小。 然后,准备数据集。假设我们有一个包含 1000 张验证码图片的数据集,每张图片都是 60x20 的灰度图像,保存在 `data` 文件夹下,文件名为 `captcha_{i}.png`(`i` 从 1 到 1000)。我们需要将数据集分成训练集和测试集,并使用 `ImageDataGenerator` 类来对图像进行预处理: ```python train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, validation_split=0.2) train_generator = train_datagen.flow_from_directory( 'data', target_size=(IMG_HEIGHT, IMG_WIDTH), batch_size=BATCH_SIZE, color_mode='grayscale', class_mode='categorical', subset='training') test_generator = train_datagen.flow_from_directory( 'data', target_size=(IMG_HEIGHT, IMG_WIDTH), batch_size=BATCH_SIZE, color_mode='grayscale', class_mode='categorical', subset='validation') ``` 其中,`train_datagen` 定义了一系列图像增强操作,包括缩放、剪切、旋转、平移等。`train_generator` 和 `test_generator` 分别是训练集和测试集的生成器。 接下来,构建 CNN 模型: ```python model = Sequential([ Conv2D(32, (3, 3), activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 1)), MaxPooling2D((2, 2)), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Conv2D(128, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Flatten(), Dropout(0.5), Dense(512, activation='relu'), Dropout(0.5), Dense(NUM_CLASSES, activation='softmax') ]) ``` 该模型包含 3 个卷积层、3 个池化层和 2 个全连接层,其中每个卷积层后面都跟着一个最大池化层。最后一层是一个大小为 `NUM_CLASSES` 的 softmax 层,用于分类。 最后,编译模型并开始训练: ```python model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(train_generator, epochs=EPOCHS, validation_data=test_generator) ``` 训练完成后,我们可以使用模型来预测新的验证码图片: ```python def predict_captcha(filename): img = tf.keras.preprocessing.image.load_img(filename, color_mode='grayscale', target_size=(IMG_HEIGHT, IMG_WIDTH)) img = tf.keras.preprocessing.image.img_to_array(img) img = np.expand_dims(img, axis=0) img /= 255. prediction = model.predict(img) prediction = np.argmax(prediction, axis=1) return prediction[0] ``` 该函数接受一个验证码图片的文件名,返回模型预测出的验证码字符的标签。 以上就是使用 TensorFlow 2 实现验证码识别的一个简单例子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值