Tensorflow是目前最流行的深度学习框架,我们可以用它来搭建自己的卷积神经网络并训练自己的分类器,本文介绍怎样使用Tensorflow构建自己的CNN,怎样训练用于简单的验证码识别的分类器。本文假设你已经安装好了Tensorflow,了解过CNN的一些知识。
下面将分步介绍怎样获得训练数据,怎样使用tensorflow构建卷积神经网络,怎样训练,以及怎样测试训练出来的分类器
1. 准备训练样本
使用Python的库captcha来生成我们需要的训练样本,代码如下:
- import sys
- import os
- import shutil
- import random
- import time
- #captcha是用于生成验证码图片的库,可以 pip install captcha 来安装它
- from captcha.image import ImageCaptcha
- #用于生成验证码的字符集
- CHAR_SET = ['0','1','2','3','4','5','6','7','8','9']
- #字符集的长度
- CHAR_SET_LEN = 10
- #验证码的长度,每个验证码由4个数字组成
- CAPTCHA_LEN = 4
- #验证码图片的存放路径
- CAPTCHA_IMAGE_PATH = 'E:/Tensorflow/captcha/images/'
- #用于模型测试的验证码图片的存放路径,它里面的验证码图片作为测试集
- TEST_IMAGE_PATH = 'E:/Tensorflow/captcha/test/'
- #用于模型测试的验证码图片的个数,从生成的验证码图片中取出来放入测试集中
- TEST_IMAGE_NUMBER = 50
- #生成验证码图片,4位的十进制数字可以有10000种验证码
- def generate_captcha_image(charSet = CHAR_SET, charSetLen=CHAR_SET_LEN, captchaImgPath=CAPTCHA_IMAGE_PATH):
- k = 0
- total = 1
- for i in range(CAPTCHA_LEN):
- total *= charSetLen
- for i in range(charSetLen):
- for j in range(charSetLen):
- for m in range(charSetLen):
- for n in range(charSetLen):
- captcha_text = charSet[i] + charSet[j] + charSet[m] + charSet[n]
- image = ImageCaptcha()
- image.write(captcha_text, captchaImgPath + captcha_text + '.jpg')
- k += 1
- sys.stdout.write("\rCreating %d/%d" % (k, total))
- sys.stdout.flush()
- #从验证码的图片集中取出一部分作为测试集,这些图片不参加训练,只用于模型的测试
- def prepare_test_set():
- fileNameList = []
- for filePath in os.listdir(CAPTCHA_IMAGE_PATH):
- captcha_name = filePath.split('/')[-1]
- fileNameList.append(captcha_name)
- random.seed(time.time())
- random.shuffle(fileNameList)
- for i in range(TEST_IMAGE_NUMBER):
- name = fileNameList[i]
- shutil.move(CAPTCHA_IMAGE_PATH + name, TEST_IMAGE_PATH + name)
- if __name__ == '__main__':
- generate_captcha_image(CHAR_SET, CHAR_SET_LEN, CAPTCHA_IMAGE_PATH)
- prepare_test_set()
- sys.stdout.write("\nFinished")
- sys.stdout.flush()
运行上面的代码,可以生成验证码图片,
生成的验证码图片如下图所示:2. 构建CNN,训练分类器
代码如下: