4位数字验证码图片识别 +tensorflow+CNN

跟着视频写了以下代码,精度设置在0.8的时候保存模型,然后验证结果还不错。有兴趣的同学可以一起讨论

import numpy as np
import tensorflow as tf
from captcha.image import ImageCaptcha
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import random
#只做4位数字的识别
number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']keep_prob = tf.placeholder(tf.float32)  # dropoutdef random_captcha_text(char_set=number, captcha_size=4):captcha_text = []for i in range(captcha_size):c = random.choice(number)captcha_text.append(c)return captcha_textdef gen_captcha_text_and_image():image=ImageCaptcha()  #生成随机图片captcha_text=random_captcha_text()captcha_text=''.join(captcha_text)captcha=image.generate(captcha_text)captcha_image=Image.open(captcha)captcha_image=np.array(captcha_image)return  captcha_text,captcha_imagedef conver2gray(img):if len(img.shape)>2:gray=np.mean(img,-1)return grayelse:return imgdef text2vec(text):text_len=len(text)if text_len>MAX_CAPTCHA:raise ValueError('longer than 4')vector=np.zeros(MAX_CAPTCHA*CHAR_SET_LEN)for i,c in enumerate(text):idx=i*CHAR_SET_LEN+int(c) #[1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0....]一共四十个元素 里面只有四个元素为1vector[idx]=1return vectordef vec2text(vec):text=[]char_pos=vec.nonzero()[0]for i,c in enumerate(char_pos):number=i%10+1text.append(str(number))return ''.join(text)# 测试 nonzero用法
# char_pos=np.array([1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1])
# char_pos =vec2text(char_pos)
# print(char_pos)#测试编码与解码
# text='1234'
# text=text2vec(text)
# print(text)
# text=vec2text(text)
# print(text)#生成训练batchdef 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])def wrap_gen_captcha_text_and_image():while True:text,image=gen_captcha_text_and_image()if image.shape==(60,160,3):return text,imagefor i in range(batch_size):text,image=wrap_gen_captcha_text_and_image()image=conver2gray(image)batch_x[i,:]=image.flatten()/255batch_y[i,:]=text2vec(text)return batch_x,batch_y# batch_x,batch_y=get_next_batch(batch_size=2)
# print(batch_x,batch_y)def cnn(w_alpha=0.01, b_alpha=0.1):x=tf.reshape(X,shape=[-1,IMAGE_HEIGHT, IMAGE_WIDTH, 1])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=tf.nn.max_pool(conv1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')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)# 全连接层w_d=tf.Variable(w_alpha*tf.random_normal([8*20*64,1024]))b_d=tf.Variable(w_alpha*tf.random_normal([1024]))dense=tf.reshape(conv3,shape=[-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)return outdef train_cnn():output = cnn()loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=output,labels=Y))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 = 0while 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',step, loss_)# 每100 step计算一次准确率if step % 10 == 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',step, acc)# 如果准确率大于50%,保存模型,完成训练if acc > 0.80:saver.save(sess, "./model/crack_capcha.model", global_step=step)breakstep += 1def crack_captcha(captcha_image):output = cnn()saver = tf.train.Saver()with tf.Session() as sess:saver.restore(sess, "./model/crack_capcha.model-1440")predict = tf.argmax(tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2)text_list = sess.run(predict, feed_dict={X: [captcha_image], keep_prob: 1})text = text_list[0].tolist()return textif __name__ == '__main__':train = 1if train == 0: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']text, image = gen_captcha_text_and_image()print("验证码图像channel:", image.shape)  # (60, 160, 3)# 图像大小IMAGE_HEIGHT = 60IMAGE_WIDTH = 160MAX_CAPTCHA = len(text)print("验证码文本最长字符数", MAX_CAPTCHA)# 文本转向量# char_set = number + alphabet + ALPHABET + ['_']  # 如果验证码长度小于4, '_'用来补齐char_set = numberCHAR_SET_LEN = len(char_set)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)  # dropouttrain_cnn()if train == 1:number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']IMAGE_HEIGHT = 60IMAGE_WIDTH = 160char_set = numberCHAR_SET_LEN = len(char_set)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()MAX_CAPTCHA = len(text)image = conver2gray(image)image = image.flatten() / 255X = 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)  # dropoutpredict_text = crack_captcha(image)print("正确: {}  预测: {}".format(text, predict_text))

结果如下:

4位数字验证码图片识别 +tensorflow+CNN相关推荐

  1. 记一次 基于 卷积神经网络(CNN)的 验证码图片识别

    前几天搭建好了tensorflow2的环境,今天来试验一下神奇的机器学习. 先简单编写一个java程序,收集了10000多个验证码图片,全部进行人工标注(训练素材点击下载),其中600多个用来检验预测 ...

  2. 数字+字母 通用验证码图片识别 无限识别

    背景 最近在研究验证码图片识别,主要是字母+数字类型的验证码图片,找到了很多方法,但是大多都需要自己去通过深度学习自己训练,而且深度学习代码又看不懂.运气好,找到一个完整的深度学习代码能够去自己训练验 ...

  3. Jmeter验证码图片识别注册接口压力测试实战

    写在前面 前段时间写了一篇博文<Jmeter验证码注册接口压力测试实战>,前两天又登录对应的网站看了一下.发现原来滑动验证的方式改成了图片验证码的方式,防止用户多次发送手机验证码. 看到这 ...

  4. 数字验证码的识别(一)

    数字验证码是最常见的验证码之一,抛却直接写在页面上的验证码,我们用JAVA程序实现一下数字验证码的识别 数字验证码是最常见的验证码之一,抛却直接写在页面上的验证码,我们用JAVA程序实现一下数字验证码 ...

  5. 高效生成6位数字验证码代码

    备用:高效生成6位数字验证码代码 String code = String.valueOf((int)((Math.random()*9+1)*Math.pow(10,5)));

  6. Java 随机生成4位数字验证码

    Java 随机生成4位数字验证码 import java.util.Random; /*** Created with IntelliJ IDEA.** @Author: twx* @Date: 20 ...

  7. 基于Tensorflow和CNN实现验证码图片识别

    卷积神经网络自从被提出开始,就受到人们的广泛欢迎,它在图像识别.语音识别.自然语言处理任务中扮演着重要的角色,在此基础上衍生出的网络模型更是层出不穷.进行验证码识别时,使用传统的Tesseract O ...

  8. 纯6位数字验证码(图片)

    <?php //中文字符集header('content-type:text/html;charset=utf-8'); //设置session,必须处于脚本最顶部session_start() ...

  9. 简单的纯数字图像(如电话号码、数字验证码)识别

    又到岁末,大家都忙着捞年底最后一桶金,我也不例外,忙着采集数据,不过有时候需要付出一点点时间而已. 在本案例中,我遇到了一个纯数字的电话号码变成了图片需要采集过来,在原网页上以<img src= ...

最新文章

  1. 教育培训机构用管理系统能做什么?
  2. nodejs安装及npm模块插件安装路径配置
  3. 查看计算机CPU、内存使用情况
  4. PHP的chunk_split() 函数把字符串分割为一连串更小的部分
  5. 顺序三元组 java_三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)
  6. Redis集群在线分片
  7. (JAVA)Arrays数组工具类
  8. Js 之 递归,闭包
  9. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)
  10. Python 加载二进制文件到 CkByteArray 对象
  11. python 网页转pdf
  12. 广东全国计算机2018年报名时间,2018年3月广东计算机等级考试报名时间
  13. JNI中,getBytes()最好指明UTF-8
  14. 阿里云携手蓝凌软件,打造全球化企业智慧办公平台
  15. Android Binder学习(四)之addService流程分析
  16. 什么是索引?索引有哪几种?什么时候使用索引比较好?
  17. 分门别类刷leetcode——动态规划(C++实现)
  18. 【Markdown Pad 2常见问题3】Markdown Pad 2插入本土图片无法显示
  19. Day6——yaml简介
  20. uniapp根据ui设计图实现新增和删除功能

热门文章

  1. 选择屏幕abap开发
  2. 大一计算机生的生涯探索感悟和日记
  3. BN(Batch Normalization)
  4. springboot中使用jetty服务器
  5. 未来教师是否会被计算机取代,未来老师会被计算机所取代吗?Will The Teacher be Replaced by Computers in the Future?...
  6. 精神心理科医生:抑郁症正在好转的5种表现
  7. ffmpeg视频转码记录
  8. macromedia_Macromedia宣布推出新的Flash视频套件
  9. ACPI Specification 第二章 条款的定义
  10. 炸了!中科大26岁数学家攻克世界难题!12岁读高中,14岁考入中科大少年班.......