本文介绍了python使用tensorflow深度学习识别验证码 ,分享给大家,具体如下:
除了传统的PIL包处理图片,然后用pytessert+OCR识别意外,还可以使用tessorflow训练来识别验证码。
此篇代码大部分是转载的,只改了很少地方。
代码是运行在linux环境,tessorflow没有支持windows的python 2.7。
gen_captcha.py代码。
#coding=utf-8 from captcha.image import ImageCaptcha # pip install captcha import numpy as np import matplotlib.pyplot as plt from PIL import Image import random # 验证码中的字符, 就不用汉字了 number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] alphabet = ['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'] ALPHABET = ['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'] ''' number=['0','1','2','3','4','5','6','7','8','9'] alphabet =[] ALPHABET =[] ''' # 验证码一般都无视大小写;验证码长度4个字符 def random_captcha_text(char_set=number + alphabet + ALPHABET, captcha_size=4): captcha_text = [] for i in range(captcha_size): c = random.choice(char_set) captcha_text.append(c) return captcha_text # 生成字符对应的验证码 def gen_captcha_text_and_image(): while(1): image = ImageCaptcha() captcha_text = random_captcha_text() captcha_text = ''.join(captcha_text) captcha = image.generate(captcha_text) #image.write(captcha_text, captcha_text + '.jpg') # 写到文件 captcha_image = Image.open(captcha) #captcha_image.show() captcha_image = np.array(captcha_image) if captcha_image.shape==(60,160,3): break return captcha_text, captcha_image if __name__ == '__main__': # 测试 text, image = gen_captcha_text_and_image() print image gray = np.mean(image, -1) print gray print image.shape print gray.shape f = plt.figure() ax = f.add_subplot(111) ax.text(0.1, 0.9, text, ha='center', va='center', transform=ax.transAxes) plt.imshow(image) plt.show()
train.py代码。
#coding=utf-8 from gen_captcha import gen_captcha_text_and_image from gen_captcha import number from gen_captcha import alphabet from gen_captcha import ALPHABET import numpy as np import tensorflow as tf """ text, image = gen_captcha_text_and_image() print "验证码图像channel:", image.shape # (60, 160, 3) # 图像大小 IMAGE_HEIGHT = 60 IMAGE_WIDTH = 160 MAX_CAPTCHA = len(text) print "验证码文本最长字符数", MAX_CAPTCHA # 验证码最长4字符; 我全部固定为4,可以不固定. 如果验证码长度小于4,用'_'补齐 """ IMAGE_HEIGHT = 60 IMAGE_WIDTH = 160 MAX_CAPTCHA = 4 # 把彩色图像转为灰度图像(色彩对识别验证码没有什么用) def convert2gray(img): if len(img.shape) > 2: gray = np.mean(img, -1) # 上面的转法较快,正规转法如下 # r, g, b = img[:,:,0], img[:,:,1], img[:,:,2] # gray = 0.2989 * r + 0.5870 * g + 0.1140 * b return gray else: return img """ cnn在图像大小是2的倍数时性能最高, 如果你用的图像大小不是2的倍数,可以在图像边缘补无用像素。 np.pad(image,((2,3),(2,2)), 'constant', constant_values=(255,)) # 在图像上补2行,下补3行,左补2行,右补2行 """ # 文本转向量 char_set = number + alphabet + ALPHABET + ['_'] # 如果验证码长度小于4, '_'用来补齐 CHAR_SET_LEN = len(char_set) def text2vec(text): text_len = len(text) if text_len > MAX_CAPTCHA: raise ValueError('验证码最长4个字符') vector = np.zeros(MAX_CAPTCHA * CHAR_SET_LEN) def char2pos(c): if c == '_': k = 62 return k k = ord(c) - 48 if k > 9: k = ord(c) - 55 if k > 35: k = ord(c) - 61 if k > 61: raise ValueError('No Map') return k for i, c in enumerate(text): #print text idx = i * CHAR_SET_LEN + char2pos(c) #print i,CHAR_SET_LEN,char2pos(c),idx vector[idx] = 1 return vector #print text2vec('1aZ_') # 向量转回文本 def vec2text(vec): char_pos = vec.nonzero()[0] text = [] for i, c in enumerate(char_pos): char_at_pos = i # c/63 char_idx = c % CHAR_SET_LEN if char_idx < 10: char_code = char_idx + ord('0') elif char_idx < 36: char_code = char_idx - 10 + ord('A') elif char_idx 0.9: ##我这里设了0.9,设得越大训练要花的时间越长,如果设得过于接近1,很难达到。如果使用cpu,花的时间很长,cpu占用很高电脑发烫。 saver.save(sess, "crack_capcha.model", global_step=step) print time.time()-start_time break step += 1 train_crack_captcha_cnn()
测试代码:
output = crack_captcha_cnn() saver = tf.train.Saver() sess = tf.Session() saver.restore(sess, tf.train.latest_checkpoint('.')) while(1): text, image = gen_captcha_text_and_image() image = convert2gray(image) image = image.flatten() / 255 predict = tf.argmax(tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2) text_list = sess.run(predict, feed_dict={X: [image], keep_prob: 1}) predict_text = text_list[0].tolist() vector = np.zeros(MAX_CAPTCHA * CHAR_SET_LEN) i = 0 for t in predict_text: vector[i * 63 + t] = 1 i += 1 # break print("正确: {} 预测: {}".format(text, vec2text(vector)))
如果想要快点测试代码效果,验证码的字符不要设置太多,例如0123这几个数字就可以了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
关注微信公众号获取更多VSCode编程信息,定时发布干货文章
全部评论