4位数字验证码图片识别 +tensorflow+CNN
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相关推荐
- 记一次 基于 卷积神经网络(CNN)的 验证码图片识别
前几天搭建好了tensorflow2的环境,今天来试验一下神奇的机器学习. 先简单编写一个java程序,收集了10000多个验证码图片,全部进行人工标注(训练素材点击下载),其中600多个用来检验预测 ...
- 数字+字母 通用验证码图片识别 无限识别
背景 最近在研究验证码图片识别,主要是字母+数字类型的验证码图片,找到了很多方法,但是大多都需要自己去通过深度学习自己训练,而且深度学习代码又看不懂.运气好,找到一个完整的深度学习代码能够去自己训练验 ...
- Jmeter验证码图片识别注册接口压力测试实战
写在前面 前段时间写了一篇博文<Jmeter验证码注册接口压力测试实战>,前两天又登录对应的网站看了一下.发现原来滑动验证的方式改成了图片验证码的方式,防止用户多次发送手机验证码. 看到这 ...
- 数字验证码的识别(一)
数字验证码是最常见的验证码之一,抛却直接写在页面上的验证码,我们用JAVA程序实现一下数字验证码的识别 数字验证码是最常见的验证码之一,抛却直接写在页面上的验证码,我们用JAVA程序实现一下数字验证码 ...
- 高效生成6位数字验证码代码
备用:高效生成6位数字验证码代码 String code = String.valueOf((int)((Math.random()*9+1)*Math.pow(10,5)));
- Java 随机生成4位数字验证码
Java 随机生成4位数字验证码 import java.util.Random; /*** Created with IntelliJ IDEA.** @Author: twx* @Date: 20 ...
- 基于Tensorflow和CNN实现验证码图片识别
卷积神经网络自从被提出开始,就受到人们的广泛欢迎,它在图像识别.语音识别.自然语言处理任务中扮演着重要的角色,在此基础上衍生出的网络模型更是层出不穷.进行验证码识别时,使用传统的Tesseract O ...
- 纯6位数字验证码(图片)
<?php //中文字符集header('content-type:text/html;charset=utf-8'); //设置session,必须处于脚本最顶部session_start() ...
- 简单的纯数字图像(如电话号码、数字验证码)识别
又到岁末,大家都忙着捞年底最后一桶金,我也不例外,忙着采集数据,不过有时候需要付出一点点时间而已. 在本案例中,我遇到了一个纯数字的电话号码变成了图片需要采集过来,在原网页上以<img src= ...
最新文章
- 教育培训机构用管理系统能做什么?
- nodejs安装及npm模块插件安装路径配置
- 查看计算机CPU、内存使用情况
- PHP的chunk_split() 函数把字符串分割为一连串更小的部分
- 顺序三元组 java_三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)
- Redis集群在线分片
- (JAVA)Arrays数组工具类
- Js 之 递归,闭包
- 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)
- Python 加载二进制文件到 CkByteArray 对象
- python 网页转pdf
- 广东全国计算机2018年报名时间,2018年3月广东计算机等级考试报名时间
- JNI中,getBytes()最好指明UTF-8
- 阿里云携手蓝凌软件,打造全球化企业智慧办公平台
- Android Binder学习(四)之addService流程分析
- 什么是索引?索引有哪几种?什么时候使用索引比较好?
- 分门别类刷leetcode——动态规划(C++实现)
- 【Markdown Pad 2常见问题3】Markdown Pad 2插入本土图片无法显示
- Day6——yaml简介
- uniapp根据ui设计图实现新增和删除功能
热门文章
- 选择屏幕abap开发
- 大一计算机生的生涯探索感悟和日记
- BN(Batch Normalization)
- springboot中使用jetty服务器
- 未来教师是否会被计算机取代,未来老师会被计算机所取代吗?Will The Teacher be Replaced by Computers in the Future?...
- 精神心理科医生:抑郁症正在好转的5种表现
- ffmpeg视频转码记录
- macromedia_Macromedia宣布推出新的Flash视频套件
- ACPI Specification 第二章 条款的定义
- 炸了!中科大26岁数学家攻克世界难题!12岁读高中,14岁考入中科大少年班.......