Tensorflow简单验证码识别应用


Posted in Python onMay 25, 2017

简单的Tensorflow验证码识别应用,供大家参考,具体内容如下

1.Tensorflow的安装方式简单,在此就不赘述了.

2.训练集训练集以及测试及如下(纯手工打造,所以数量不多):

Tensorflow简单验证码识别应用

Tensorflow简单验证码识别应用

3.实现代码部分(参考了网上的一些实现来完成的)

main.py(主要的神经网络代码)

from gen_check_code import gen_captcha_text_and_image_new,gen_captcha_text_and_image
from gen_check_code import number
from test_check_code import get_test_captcha_text_and_image
import numpy as np
import tensorflow as tf

text, image = gen_captcha_text_and_image_new()
print("验证码图像channel:", image.shape) # (60, 160, 3) 
# 图像大小 
IMAGE_HEIGHT = image.shape[0]
IMAGE_WIDTH = image.shape[1]
image_shape = image.shape
MAX_CAPTCHA = len(text)
print("验证码文本最长字符数", MAX_CAPTCHA) # 验证码最长4字符; 我全部固定为4,可以不固定. 如果验证码长度小于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
  # int gray = (int) (0.3 * r + 0.59 * g + 0.11 * 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 # 如果验证码长度小于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):
  try:
   k = ord(c)-ord('0')
  except:
   raise ValueError('No Map')
  return k

 for i, c in enumerate(text):
  idx = i * CHAR_SET_LEN + char2pos(c)
  vector[idx] = 1
 return vector


# 向量转回文本
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 < 62:
   char_code = char_idx - 36 + ord('a')
  elif char_idx == 62:
   char_code = ord('_')
  else:
   raise ValueError('error')
  text.append(chr(char_code))
 return "".join(text)


# 生成一个训练batch
def get_next_batch(batch_size=128):
 batch_x = np.zeros([batch_size, IMAGE_HEIGHT * IMAGE_WIDTH])
 batch_y = np.zeros([batch_size, MAX_CAPTCHA * CHAR_SET_LEN])

 # 有时生成图像大小不是(60, 160, 3) 
 def wrap_gen_captcha_text_and_image():
  while True:
   text, image = gen_captcha_text_and_image_new()

   if image.shape == image_shape:
    return text, image

 for i in range(batch_size):
  text, image = wrap_gen_captcha_text_and_image()
  image = convert2gray(image)


  batch_x[i, :] = image.flatten() / 255 # (image.flatten()-128)/128 mean为0
  batch_y[i, :] = text2vec(text)

 return batch_x, batch_y


####################################################################

X = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT * IMAGE_WIDTH])
Y = tf.placeholder(tf.float32, [None, MAX_CAPTCHA * CHAR_SET_LEN])
keep_prob = tf.placeholder(tf.float32) # dropout


# 定义CNN
def crack_captcha_cnn(w_alpha=0.01, b_alpha=0.1):
 x = tf.reshape(X, shape=[-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1])

 # w_c1_alpha = np.sqrt(2.0/(IMAGE_HEIGHT*IMAGE_WIDTH)) #
 # w_c2_alpha = np.sqrt(2.0/(3*3*32))
 # w_c3_alpha = np.sqrt(2.0/(3*3*64))
 # w_d1_alpha = np.sqrt(2.0/(8*32*64))
 # out_alpha = np.sqrt(2.0/1024)

 # 定义三层的卷积神经网络

 # 定义第一层的卷积神经网络
 # 定义第一层权重
 w_c1 = tf.Variable(w_alpha * tf.random_normal([3, 3, 1, 32]))
 # 定义第一层的偏置
 b_c1 = tf.Variable(b_alpha * tf.random_normal([32]))
 # 定义第一层的激励函数
 conv1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x, w_c1, strides=[1, 1, 1, 1], padding='SAME'), b_c1))
 # conv1 为输入 ksize 表示使用2*2池化,即将2*2的色块转化成1*1的色块
 conv1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
 # dropout防止过拟合。
 conv1 = tf.nn.dropout(conv1, keep_prob)

 # 定义第二层的卷积神经网络
 w_c2 = tf.Variable(w_alpha * tf.random_normal([3, 3, 32, 64]))
 b_c2 = tf.Variable(b_alpha * tf.random_normal([64]))
 conv2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv1, w_c2, strides=[1, 1, 1, 1], padding='SAME'), b_c2))
 conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
 conv2 = tf.nn.dropout(conv2, keep_prob)

 # 定义第三层的卷积神经网络
 w_c3 = tf.Variable(w_alpha * tf.random_normal([3, 3, 64, 64]))
 b_c3 = tf.Variable(b_alpha * tf.random_normal([64]))
 conv3 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv2, w_c3, strides=[1, 1, 1, 1], padding='SAME'), b_c3))
 conv3 = tf.nn.max_pool(conv3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
 conv3 = tf.nn.dropout(conv3, keep_prob)

 # Fully connected layer
 # 随机生成权重
 w_d = tf.Variable(w_alpha * tf.random_normal([1536, 1024]))
 # 随机生成偏置
 b_d = tf.Variable(b_alpha * tf.random_normal([1024]))
 dense = tf.reshape(conv3, [-1, w_d.get_shape().as_list()[0]])
 dense = tf.nn.relu(tf.add(tf.matmul(dense, w_d), b_d))
 dense = tf.nn.dropout(dense, keep_prob)

 w_out = tf.Variable(w_alpha * tf.random_normal([1024, MAX_CAPTCHA * CHAR_SET_LEN]))
 b_out = tf.Variable(b_alpha * tf.random_normal([MAX_CAPTCHA * CHAR_SET_LEN]))
 out = tf.add(tf.matmul(dense, w_out), b_out)
 # out = tf.nn.softmax(out)
 return out


# 训练
def train_crack_captcha_cnn():
 # X = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT * IMAGE_WIDTH])
 # Y = tf.placeholder(tf.float32, [None, MAX_CAPTCHA * CHAR_SET_LEN])
 # keep_prob = tf.placeholder(tf.float32) # dropout
 output = crack_captcha_cnn()
 # loss 
 # loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(output, Y))
 loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(output, Y))
 # 最后一层用来分类的softmax和sigmoid有什么不同?
 # optimizer 为了加快训练 learning_rate应该开始大,然后慢慢衰 
 optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

 predict = tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN])
 max_idx_p = tf.argmax(predict, 2)
 max_idx_l = tf.argmax(tf.reshape(Y, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2)
 correct_pred = tf.equal(max_idx_p, max_idx_l)
 accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

 saver = tf.train.Saver()
 with tf.Session() as sess:
   sess.run(tf.global_variables_initializer())

   step = 0
   while True:
    batch_x, batch_y = get_next_batch(64)
    _, loss_ = sess.run([optimizer, loss], feed_dict={X: batch_x, Y: batch_y, keep_prob: 0.75})
    print(step, loss_)

    # 每100 step计算一次准确率
    if step % 100 == 0:
     batch_x_test, batch_y_test = get_next_batch(100)
     acc = sess.run(accuracy, feed_dict={X: batch_x_test, Y: batch_y_test, keep_prob: 1.})
     print(step, acc)
     # 如果准确率大于50%,保存模型,完成训练
     if acc > 0.99:
      saver.save(sess, "./crack_capcha.model", global_step=step)
      break
    step += 1

## 训练(如果要训练则去掉下面一行的注释)
train_crack_captcha_cnn()


def crack_captcha():
 output = crack_captcha_cnn()

 saver = tf.train.Saver()
 with tf.Session() as sess:
  saver.restore(sess, tf.train.latest_checkpoint('.'))

  predict = tf.argmax(tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2)
  count = 0
  # 因为测试集共40个...写的很草率
  for i in range(40):
   text, image = get_test_captcha_text_and_image(i)
   image = convert2gray(image)
   captcha_image = image.flatten() / 255
   text_list = sess.run(predict, feed_dict={X: [captcha_image], keep_prob: 1})
   predict_text = text_list[0].tolist()
   predict_text = str(predict_text)
   predict_text = predict_text.replace("[", "").replace("]", "").replace(",", "").replace(" ","")
   if text == predict_text:
    count += 1
    check_result = ",预测结果正确"
   else:
    check_result = ",预测结果不正确"
    print("正确: {} 预测: {}".format(text, predict_text) + check_result)

  print("正确率:" + str(count) + "/40")
# 测试(如果要测试则去掉下面一行的注释)
# crack_captcha()

gen_check_code.py(得到训练集输入,需要注意修改root_dir为训练集的输入文件夹,下同)

from captcha.image import ImageCaptcha # pip install captcha
import numpy as np
from PIL import Image
import random
# import matplotlib.pyplot as plt
import os
from random import choice

# 验证码中的字符, 就不用汉字了
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']

root_dir = "d:\\train"

# 验证码一般都无视大小写;验证码长度4个字符
def random_captcha_text(char_set=number, 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():
 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 = np.array(captcha_image)
 return captcha_text, captcha_image


def gen_list():
 img_list = []
 for parent, dirnames, filenames in os.walk(root_dir): # 三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字
  for filename in filenames: # 输出文件信息
   img_list.append(filename.replace(".gif",""))
   # print("parent is:" + parent)
   # print("filename is:" + filename)
   # print("the full name of the file is:" + os.path.join(parent, filename)) # 输出文件路径信息
 return img_list
img_list = gen_list()
def gen_captcha_text_and_image_new():
 img = choice(img_list)
 captcha_image = Image.open(root_dir + "\\" + img + ".gif")
 captcha_image = np.array(captcha_image)
 return img, captcha_image


# if __name__ == '__main__':
#  # 测试
#  # text, image = gen_captcha_text_and_image()
#  #
#  # 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()
#  #
#
#  text, image = gen_captcha_text_and_image_new()
#
#  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()

test_check_code.py(得到测试集输入)

from captcha.image import ImageCaptcha # pip install captcha
import numpy as np
from PIL import Image
import random
import matplotlib.pyplot as plt
import os
from random import choice


root_dir = "d:\\test"



img_list = []
def gen_list():

 for parent, dirnames, filenames in os.walk(root_dir): # 三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字
  for filename in filenames: # 输出文件信息
   img_list.append(filename.replace(".gif",""))
   # print("parent is:" + parent)
   # print("filename is:" + filename)
   # print("the full name of the file is:" + os.path.join(parent, filename)) # 输出文件路径信息
 return img_list

img_list = gen_list()
def get_test_captcha_text_and_image(i=None):
 img = img_list[i]
 captcha_image = Image.open(root_dir + "\\" + img + ".gif")
 captcha_image = np.array(captcha_image)
 return img, captcha_image

4.效果

在测试集上的识别率

Tensorflow简单验证码识别应用

5.相关文件下载

训练集以及测试集 下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
python实现网页链接提取的方法分享
Feb 25 Python
Python控制多进程与多线程并发数总结
Oct 26 Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 Python
Python输出各行命令详解
Feb 01 Python
python 实现在Excel末尾增加新行
May 02 Python
pyspark操作MongoDB的方法步骤
Jan 04 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
python是否适合网页编程详解
Oct 04 Python
Python测试Kafka集群(pykafka)实例
Dec 23 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
Python 编码Basic Auth使用方法简单实例
May 25 #Python
Python 含参构造函数实例详解
May 25 #Python
Python爬虫之模拟知乎登录的方法教程
May 25 #Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 #Python
Python操作使用MySQL数据库的实例代码
May 25 #Python
python爬虫入门教程--快速理解HTTP协议(一)
May 25 #Python
用生成器来改写直接返回列表的函数方法
May 25 #Python
You might like
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
PHPMailer安装方法及简单实例
2008/11/25 PHP
在PHP中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
PHP中echo和print的区别
2014/08/28 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
treepanel动态加载数据实现代码
2012/12/15 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
python 网络编程详解及简单实例
2017/04/25 Python
Python的装饰器使用详解
2017/06/26 Python
python实现教务管理系统
2018/03/12 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
基于python if 判断选择结构的实例详解
2019/05/06 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
Python 实现try重新执行
2019/12/21 Python
Python tkinter模版代码实例
2020/02/05 Python
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
竞选宣传委员演讲稿
2014/05/24 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
超市收银员岗位职责
2015/04/07 职场文书
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis