tensorflow1.x及tensorflow2.x不同版本实现验证码识别
近一个假期,入坑深度学习,先从能看得着的验证码识别入门。从B站看了几天的黑马程序员的“3天带你玩转python深度学习后“,一是将教程中提到的代码一一码出来;二是针对不同的tensorflow版本,结合网络上其它文章,重新利用tensorflow2.x的keras实现同样的功能。两遍代码写完后,深感深度学习的恐怖。
一、Anaconda安装。
1.为了一些不必要的麻烦,还是先安装anaconda。下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

(这个版本支持python3.8.3)
2.下载完成后,啥也不说了,直接安装即可,能选择的一般都选择上,特别是一些环境变量的设置等。
3.安装完成后,在“Anaconda prompt"里,使用如下命令安装tensorflow
pip install tensorflow-cpu==2.2.0 -i https://pypi.doubanio.com/simple/
(注意:本机没有nvidia显卡,所以只能使用cpu版本;另,至于网上说防止出现“avx2“啥的警告,到Github上下载avx版本,去了之后会发现……木法下载,还是用这个版本吧)
4.如上,安装tensorflow完成,你可以测试一下下了。
import tensorflow as tf
print(tf.__version__)
如果提示“Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2”,禁用警告吧。方法如下:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']=2
二、因为我们的代码需要分别在tensorflow的不同版本上跑,而tensorflow1.x和2.x几乎是断代的,所以需要在anaconda中再配置一个低版本的环境。
1.先设置一下conda的国内源,找到用户文件夹下的.condarc文件,编辑如下:
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
show_channel_urls: true
ssl_verify: true
2.进入anaconda prompt,在conda中新建一个python3.5的环境,并进入这个环境,然后安装tensorflow1.8,pandas。
conda create -n python3.5 python=3.5
conda activate python3.5
pip install tensorflow==1.8 -i https://pypi.doubanio.com/simple/
pip install pandas -i https://pypi.doubanio.com/simple/
三、验证码识别的代码如下:
1.tensorflow1.8版本:

import tensorflow as tf
import glob, os,io,sys
import pandas as pd
import numpy as np
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' def read_pic():
file_list=glob.glob("./code_imgs/*.png")
file_queue=tf.train.string_input_producer(file_list)
reader=tf.WholeFileReader()
filename,image=reader.read(file_queue)
decoded=tf.image.decode_png(image,channels=3)
decoded.set_shape([28,96,3])
image_cast=tf.cast(decoded,tf.float32)
filename_batch,image_batch=tf.train.batch([filename,image_cast],batch_size=40,num_threads=2,capacity=40)
return filename_batch,image_batch def parse_csv():
csv_data=pd.read_csv('labels.csv',names=['file_num','chars'],index_col='file_num')
labels=[]
for label in csv_data["chars"]:
letter=[]
for word in label:
letter.append(ord(word)-ord('a'))
labels.append(letter)
csv_data['labels']=labels
return csv_data def filename2label(filenames,csv_data):
labels=[]
for filename in filenames:
file_num="".join(filter(str.isdigit,str(filename)))
target=csv_data.loc[int(file_num),"labels"]
labels.append(target)
return np.array(labels) def create_weights(shape):
return tf.Variable(initial_value=tf.random_normal(shape=shape,stddev=0.01)) def create_model(x):
with tf.variable_scope('conv1'):
conv1_weights=create_weights(shape=[5,5,3,32])
conv1_bias=create_weights(shape=[32])
conv1_x=tf.nn.conv2d(input=x,filter=conv1_weights,strides=[1,1,1,1],padding='SAME')+conv1_bias
relu1_x=tf.nn.relu(conv1_x)
pool1_x=tf.nn.max_pool(value=relu1_x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') with tf.variable_scope('conv2'):
conv2_weights=create_weights(shape=[5,5,32,64])
conv2_bias=create_weights(shape=[64])
conv2_x=tf.nn.conv2d(input=pool1_x,filter=conv2_weights,strides=[1,1,1,1],padding='SAME')+conv2_bias
relu2_x=tf.nn.relu(conv2_x)
pool2_x=tf.nn.max_pool(value=relu2_x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') with tf.variable_scope('full_connection'):
x_fc=tf.reshape(pool2_x,shape=[-1,7*24*64])
weights_fc=create_weights(shape=[7*24*64,104])
bias_fc=create_weights(shape=[104])
y_predict=tf.matmul(x_fc,weights_fc)+bias_fc return y_predict def list2text(textlist):
tm=[]
for i in textlist:
tm.append(chr(97+i))
return "".join(tm) def train():
filename,image=read_pic()
csv_data=parse_csv()
x=tf.placeholder(tf.float32,shape=[None,28,96,3])
y_true=tf.placeholder(tf.float32,shape=[None,104])
y_predict=create_model(x)
loss_list=tf.nn.sigmoid_cross_entropy_with_logits(labels=y_true,logits=y_predict)
loss=tf.reduce_mean(loss_list)
optimizer=tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)#优化损失
equal_list=tf.reduce_all(tf.equal(tf.argmax(tf.reshape(y_predict,shape=[-1,4,26]),axis=2), tf.argmax(tf.reshape(y_true,shape=[-1,4,26]),axis=2)),axis=1)
accurary=tf.reduce_mean(tf.cast(equal_list,tf.float32))
init=tf.global_variables_initializer()
saver=tf.train.Saver()
with tf.Session() as sess:
sess.run(init)
coord=tf.train.Coordinator()
threads=tf.train.start_queue_runners(sess=sess,coord=coord)
try:
for i in range(10000):
filename_val,image_val=sess.run([filename,image])
labels=filename2label(filename_val,csv_data)
labels_value=tf.reshape(tf.one_hot(labels,depth=26),[-1,104]).eval()
_,error,accurary_value=sess.run([optimizer,loss,accurary],feed_dict={x:image_val,y_true:labels_value})
print("The %d Train Result---loss:%f,accurary:%f" % (i+1,error,accurary_value))
if accurary_value>0.99:
saver.save(sess,'model/crack_captcha.model99',global_step=i)
break
except tf.errors.OutOfRangeError:
print("done ,now let's kill all threads")
finally:
coord.request_stop()
print("all threads ask stop")
coord.join(threads)
print("all thread stopped") def crackcaptcha():
truetext=[]
with open('a.txt','r') as f:
for filename in f.readlines():
truetext.append(filename.strip('\r\n'))
dis='False'
goodnum=0 x=tf.placeholder(tf.float32,shape=[None,28,96,3])
y_true=tf.placeholder(tf.float32,shape=[None,104])
keep_prob = tf.placeholder(tf.float32)
y_predict=create_model(x)
saver=tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
checkpoint=tf.train.get_checkpoint_state('model')
if checkpoint and checkpoint.model_checkpoint_path:
saver.restore(sess,checkpoint.model_checkpoint_path)
print("successfully loaded:",checkpoint.model_checkpoint_path)
else:
print("Could not found model files") for i in range(1,201):
image=tf.read_file('crackimgs/'+str(i)+'.png')
decoded=tf.image.decode_png(image,channels=3)
decoded.set_shape([28,96,3])
decoded_val=sess.run(decoded)
image=np.array(decoded_val) predict=tf.argmax(tf.reshape(y_predict,[-1,4,26]),2)
outtext=sess.run(predict,feed_dict={x:[image],keep_prob:1})
cracktext=list2text(outtext[0].tolist())
if cracktext==truetext[i-1]:
goodnum+=1
dis='True'
else:
dis='False'
print('The {} Image Content is:{},Your Crack Word is :{},Result:{}'.format(i,truetext[i-1],cracktext,dis))
print('The End accurary is:{}%'.format(goodnum/200*100)) if __name__=='__main__':
train()
crackcaptcha()
在运行上面的代码时,如果出现:“dtypes.py:521: FutureWarning: Passing (type, 1) or '1type' as a synonym”等警告信息,打开dtypes.py这个文件,修改如下:
np_resource = np.dtype([("resource", np.ubyte, 1)])修改为:np_resource = np.dtype([("resource", np.ubyte, (1,))])
2.tensorflow2.3版本:

import tensorflow as tf
import pandas as pd
import glob,random,os
import numpy as np
from PIL import Image
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'
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']
def text2vec(text):
vector = np.zeros([4, 26])
for i, c in enumerate(text):
idx = alphabet.index(c)
vector[i][idx] = 1.0
return vector def vec2text(vec):
text = []
for i, c in enumerate(vec):
text.append(alphabet[c])
return "".join(text) def read_pic(batch_size):
batch_x = np.zeros([batch_size, 28, 96,3])
batch_y = np.zeros([batch_size, 4, 26])
file_list=glob.glob('code_imgs2/*.png')
batchfile=np.random.choice(file_list,batch_size)#随机取出batch_size个图片
for i,filename in enumerate(batchfile):
text=filename.replace('code_imgs2\\','').replace('.png','')
image=tf.io.read_file(filename)
image_ar=tf.io.decode_png(image)
image_ar=tf.cast(image_ar,tf.float32)
batch_x[i,:]=image_ar
batch_y[i,:]=text2vec(text)
return batch_x,batch_y def crack_captcha_cnn():
model=tf.keras.Sequential() model.add(tf.keras.layers.Conv2D(filters=32,kernel_size=(3,3),activation="relu",input_shape=(28,96,3),padding="same"))
model.add(tf.keras.layers.PReLU())
model.add(tf.keras.layers.MaxPool2D((2,2),strides=2)) model.add(tf.keras.layers.Conv2D(filters=64,kernel_size=(5,5),activation="relu",input_shape=(28,96,3),padding="same"))
model.add(tf.keras.layers.PReLU())
model.add(tf.keras.layers.MaxPool2D((2,2),strides=2)) model.add(tf.keras.layers.Conv2D(filters=128,kernel_size=(5,5),activation="relu",input_shape=(28,96,3),padding="same"))
model.add(tf.keras.layers.PReLU())
model.add(tf.keras.layers.MaxPool2D((2,2),strides=2)) model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(4*26))
model.add(tf.keras.layers.Reshape([4,26])) model.add(tf.keras.layers.Softmax())
return model def train():
model=crack_captcha_cnn()
model.compile(optimizer='Adam',metrics=['accuracy'],loss='categorical_crossentropy')
for i in range(200):
batch_x,batch_y=read_pic(256)
model.fit(batch_x,batch_y,epochs=4)
if i%20==0 and i>0:
model.save('slj_tf2_model') def predict():
model=tf.keras.models.load_model('slj_tf2_model')
file_list=glob.glob('crackimgs2/*.png')
true_count=0
for filename in file_list:
data_x = np.zeros([1, 28, 96,3])
image=tf.io.read_file(filename)
image_ar=tf.io.decode_png(image)
image_ar=tf.cast(image_ar,tf.float32)
data_x[0,:]=image_ar
prediction_value = model.predict(data_x)
predict=tf.argmax(tf.reshape(prediction_value,[-1,4,26]),2)
index_ar=predict.numpy().tolist()
crack_text=vec2text(index_ar[0])
true_text=filename.replace('crackimgs2\\','').replace('.png','')
if crack_text==true_text:
true_count+=1
print('原验证码:{};破解后结果:{}'.format(true_text,crack_text))
print('共破解200个,其中正确{}个,正确率为{}%'.format(true_count,true_count/200*100))
if __name__=='__main__':
# train()
predict()
四、程序所需要的图片文件及csv文件,在此下载。
链接: https://pan.baidu.com/s/15npPVXnUEmRCNo1KfqeLOQ 提取码: kpr1
tensorflow1.x及tensorflow2.x不同版本实现验证码识别的更多相关文章
- Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR tensorflow-1.13.1和1.14windows版本目前不支持CUDA10.0
报错出现 Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR tensorflow-1.13.1和1.14windows版本目前不支持 ...
- atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本
atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本 1. 去除边框思路原理 1 2. Thumbnailator 是一个用来生成图像缩略图.裁切. ...
- win10 安装tensorflow2.0 GPU版本遇到的坑
背景:我的机器上tensorflow 1.14 & 2.0,这俩版本都有,之前都是用1.14版本,今天试一下2.0尝尝鲜, 结果就掉坑去了 把CUDA10.1 和 cudnn 安装 ...
- Python 3.6 版本-使用Pytesseract 模块进行图像验证码识别
环境: (1) win7 64位 (2) Idea (3) python 3.6 (4) pip install pillow < >pip install pytesse ...
- 虹软2.0版本离线人脸识别C#类库分享
目前只封装了人脸检测部分的类库,供大家交流学习,肯定有问题,希望大家在阅读使用的时候及时反馈,谢谢!使用虹软技术开发完成 戳这里下载SDKgithub:https://github.com/dayAn ...
- linux-基于tensorflow2.x的手写数字识别-基于MNIST数据集
数据集 数据集下载MNIST 首先读取数据集, 并打印相关信息 包括 图像的数量, 形状 像素的最大, 最小值 以及看一下第一张图片 path = 'MNIST/mnist.npz' with np. ...
- tensorflow-gpu版本安装及深度神经网络训练与cpu版本对比
tensorflow1.0和tensorflow2.0的区别主要是1.0用的静态图 一般情况1.0已经足够,但是如果要进行深度神经网络的训练,当然还是tensorflow2.*-gpu比较快啦. 其中 ...
- 学习笔记TF046:TensoFlow开发环境,Mac、Ubuntu/Linux、Windows,CPU版本、GPU版本
下载TensorFlow https://github.com/tensorflow/tensorflow/tree/v1.1.0 .Tags选择版本,下载解压. pip安装.pip,Python包管 ...
- utuntu16.04安装tensorflow1.4-gpu
之前一直在windows下使用tensorflow,对cpu和gpu的安装都是比较顺利,都是使用anaconda环境下,创建虚拟conda环境,这样方便不同python版本的管理. 一直也想尝试使用u ...
随机推荐
- P2569 [SCOI2010]股票交易 dp 单调队列优化
LINK:股票交易 题目确实不算难 但是坑点挺多 关于初值的处理问题我就wa了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...
- P5468 [NOI2019]回家路线 斜率优化 dp
LINK:回家路线 (文化课 oi 双爆炸 对 没学上的就是我.(我错了不该这么丧的. 不过还能苟住一段时间.当然是去打NOI了 这道题去年同步赛的时候做过.不过这里再次提醒自己要认真仔细的看题目 不 ...
- 4.17 省选模拟赛 远行 LCT 启发式合并 倍增
容易写出nQ的暴力 由于数据是期望的时间 所以直接dfs可以跑的很快 可以拿到70分. 当然 可以进一步优化暴力 使用换根dp 然后可以将暴力优化到n^2. const int MAXN=300010 ...
- VMware 虚拟机开机黑屏解决方法
# 调整VMware硬盘启动优先级 第一步:打开电源时进入固件,也就是BIOS 设置界面. 第二步:找到Main-最下面的Boot-time Diagnostic Screen,敲“Enter”,弹出 ...
- 使用idea maven打包项目 Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.0.2:resources
超级折磨人 在网上搜到的解决方案: 技术交流群 : 816227112 修改 和 <plugin> <groupId>org.apache.maven.plugins</ ...
- Spring的事务抽象
Spring提供了一致的事务管理抽象,该抽象能实现为不同的事务API提供一致的编程模型.无视我们使用jdbc.hibernate.mybatis哪种方式来操作数据,无视事务是jta事务还是jdbc事务 ...
- 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践
写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 可能很多新手都会遇到同样的问题:我要我的Asp.net ...
- ios 淘宝评论详情、朋友圈布局masony实现
最近做项目,用到了类似于淘宝的朋友圈的功能,然后自己抽出了一个小demo,与大家分享 介绍:用的是masony布局的cell这样的话,文本,以及图片可以自适应,不用人工再去计算高度,很方便. 注:该d ...
- Python笔试——毕业旅行问题
毕业旅行问题 小明目前在做一份毕业旅行的规划.打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次.由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的 ...
- 基于.NetCore3.1系列 —— 日志记录之日志核心要素揭秘
一.前言 在上一篇中,我们已经了解了内置系统的默认配置和自定义配置的方式,在学习了配置的基础上,我们进一步的对日志在程序中是如何使用的深入了解学习.所以在这一篇中,主要是对日志记录的核心机制进行学习说 ...