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 相关文章推荐
python判断、获取一张图片主色调的2个实例
Apr 10 Python
测试、预发布后用python检测网页是否有日常链接
Jun 03 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
May 20 Python
Python回调函数用法实例详解
Jul 02 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
python线程池(threadpool)模块使用笔记详解
Nov 17 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
浅谈Python的条件判断语句if/else语句
Mar 21 Python
python实现集中式的病毒扫描功能详解
Jul 09 Python
python字符串的拼接方法总结
Nov 18 Python
python实现单张图像拼接与批量图片拼接
Mar 23 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
php生成随机数的三种方法
2014/09/10 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
python脚本后台执行方式
2019/12/21 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
keras导入weights方式
2020/06/12 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
财务人员个人自荐信范文
2013/09/26 职场文书
党员政治学习材料
2014/05/14 职场文书
企业文化标语口号
2014/06/09 职场文书
假期安全教育广播稿
2014/10/04 职场文书
个人作风建设自查报告
2014/10/22 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
小学运动会加油词
2015/07/18 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery
关于 Python json中load和loads区别
2021/11/07 Python
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
海弦WR-800F
2022/04/05 无线电