对于本次基于卷积神经网络识别验证码有着非常大的兴趣,所以尝试性地去做了测试,过程当中踩了不少坑,也参考了许多前辈的博客和教程,最终识别率可达到98.25%
一、下图是训练的过程:
二、实验的情况简介:
实验环境:Python3.6
、Centos 7.3
、Tensorflow 1.9
训练的过程是放到远程服务器上跑的,1H1G的配置,没有GPU,所以训练总耗时5小时
在本地机器Win10+MX150+Python3.6+Tensorflow1.9
环境下,CUDA
总是找不到xxx90.dll
,按照网上的大佬博客记录来还是无法解决,遂放弃而转移到服务器上慢慢跑
验证码的来源是 Python
中一个用于生成验证码的captcha库,其生成的验证码UCkV
如下:
本次实验中为了验证训练效果,从速度上考虑,只做了数字验证码的识别
三、实验过程:
需要验证码,首先我想到自己用PHP简单写了一个验证码的生成程序,也是为了验证模型的准确率,发现如果读文件的形式效率不是很高,故直接采用在python下的captcha库来生成有一定复杂度的验证码。
如下是生成验证码的程序,可生成数字+字母大小写的任意长度验证码
# coding:utf-8
# name:captcha_gen.py
import random
import numpy as np
from PIL import Image
from captcha.image import ImageCaptcha
NUMBER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
LOW_CASE = ['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']
UP_CASE = ['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_LIST = NUMBER
CAPTCHA_LEN = 4 # 验证码长度
CAPTCHA_HEIGHT = 60 # 验证码高度
CAPTCHA_WIDTH = 160 # 验证码宽度
def random_captcha_text(char_set=CAPTCHA_LIST, captcha_size=CAPTCHA_LEN):
"""
随机生成定长字符串
:param char_set: 备选字符串列表
:param captcha_size: 字符串长度
:return: 字符串
"""
captcha_text = [random.choice(char_set) for _ in range(captcha_size)]
return ''.join(captcha_text)
def gen_captcha_text_and_image(width=CAPTCHA_WIDTH, height=CAPTCHA_HEIGHT, save=None):
"""
生成随机验证码
:param width: 验证码图片宽度
:param height: 验证码图片高度
:param save: 是否保存(None)
:return: 验证码字符串,验证码图像np数组
"""
image = ImageCaptcha(width=width, height=height)
# 验证码文本
captcha_text = random_captcha_text()
captcha = image.generate(captcha_text)
# 保存
if save:
image.write(captcha_text, './img/' + captcha_text + '.jpg')
captcha_image = Image.open(captcha)
# 转化为np数组
captcha_image = np.array(captcha_image)
return captcha_text, captcha_image
if __name__ == '__main__':
t, im = gen_captcha_text_and_image(save=True)
print(t, im.shape) # (60, 160, 3)
然后编写一个工具库,用于调用验证码生成程序来生成训练集
# -*- coding:utf-8 -*-
# name: util.py
import numpy as np
from captcha_gen import gen_captcha_text_and_image
from captcha_gen import CAPTCHA_LIST, CAPTCHA_LEN, CAPTCHA_HEIGHT, CAPTCHA_WIDTH
def convert2gray(img):
"""
图片转为黑白,3维转1维
:param img: np
:return: 灰度图的np
"""
if len(img.shape) > 2:
img = np.mean(img, -1)
return img
def text2vec(text, captcha_len=CAPTCHA_LEN, captcha_list=CAPTCHA_LIST):
"""
验证码文本转为向量
:param text:
:param captcha_len:
:param captcha_list:
:return: vector 文本对应的向量形式
"""
text_len = len(text) # 欲生成验证码的字符长度
if text_len > captc