# coding:utf-8
from captcha.image import ImageCaptcha
import numpy as np
import cv2
import tensorflow as tf
import random, os, sys
import glob
from flask import request
from flask import Flask
import json
app = Flask(__name__)
class CnnOcr:
def __init__(self):
self.epoch_max = 10000 # 最大迭代epoch次数
self.batch_size = 8 # 训练时每个批次参与训练的图像数目,显存不足的可以调小
self.lr = 1e-3 # 初始学习率
self.save_epoch = 1 # 每相隔多少个epoch保存一次模型
self.history=0;
self.im_width = 128
self.im_height = 64
self.im_total_num = 10000 # 总共生成的验证码图片数量,train目录里面的图片数量
self.train_max_num = self.im_total_num # 训练时读取的最大图片数目
self.val_num = 50 * self.batch_size # 不能大于self.train_max_num 做验证集用
self.words_num = 4 # 每张验证码图片上的数字个数
self.words = "23456789abcdefghijkmnpqrstuvwxyz" #字符范围
self.label_num = self.words_num * len(self.words)
self.keep_drop = tf.placeholder(tf.float32)
self.x = None
self.y = None
paths = glob.glob(os.path.join('./dataset/train/', '*.png'))
paths.sort()
self.paths=paths
def captchaOcr(self, img_path):
"""
验证码识别
:param img_path:
:return:
"""
im = cv2.imread(img_path)
im = cv2.resize(im, (self.im_width, self.im_height))
im = [im]
im = np.array(im, dtype=np.float32)
im -= 147
output = self.sess.run(self.max_idx_p, feed_dict={self.x: im, self.keep_drop: 1.})
ret = ''
for i in output.tolist()[0]:
ret = ret + self.words[int(i)]
return ret
def test(self, img_path):
"""
测试接口
:param img_path:
:return:
"""
self.x = tf.placeholder(tf.float32, [None, self.im_height, self.im_width, 3]) # 输入数据
self.pred = self.cnnNet()
self.output = tf.nn.sigmoid(self.pred)
self.predict = tf.reshape(self.pred, [-1, self.words_num, len(self.words)])
self.max_idx_p = tf.argmax(self.predict, 2)
saver = tf.train.Saver()
# tfconfig = tf.ConfigProto(allow_soft_placement=True)
# tfconfig.gpu_options.per_process_gpu_memory_fraction = 0.3 # 占用显存的比例
# self.ses = tf.Session(config=tfconfig)
self.sess = tf.Session()
self.sess.run(tf.global_variables_initializer()) # 全局tf变量初始化
# 加载w,b参数
saver.restore(self.sess, tf.train.latest_checkpoint('./model/'))
im = cv2.imread(img_path)
im = cv2.resize(im, (self.im_width, self.im_height))
im = [im]
im = np.array(im, dtype=np.float32)
im -= 147
output = self.sess.run(self.max_idx_p, feed_dict={self.x: im, self.keep_drop: 1.})
#ss=self.output.eval(session=self.sess)#转换为numpy数组
#print(ss)
ret = ''
for i in output.tolist()[0]:
ret = ret + self.words[int(i)]
print(ret)
def train(self):
x_train_list, y_train_list, x_val_list, y_val_list = self.getTrainDataset()
print('开始转换tensor队列')
x_train_list_tensor = tf.convert_to_tensor(x_train_list, dtype=tf.string)
y_train_list_tensor = tf.convert_to_tensor(y_train_list, dtype=tf.float32)
x_val_list_tensor = tf.convert_to_tensor(x_val_list, dtype=tf.string)
y_val_list_tensor = tf.convert_to_tensor(y_val_list, dtype=tf.float32)
x_train_queue = tf.train.slice_input_producer(tensor_list=[x_train_list_tensor], shuffle=False)
y_train_queue = tf.train.slice_input_producer(tensor_list=[y_train_list_tensor], shuffle=False)
x_val_queue = tf.train.slice_input_producer(tensor_list=[x_val_list_tensor], shuffle=False)
y_val_queue = tf.train.slice_input_producer(tensor_list=[y_val_list_tensor], shuffle=False)
train_im, train_label = self.dataset_opt(x_train_queue, y_train_queue)
train_batch = tf.train.batch(tensors=[train_im, train_label], batch_size=self.batch_size, num_threads=2)
val_im, val_label = self.dataset_opt(x_val_queue, y_val_queue)
val_batch = tf.train.batch(tensors=[val_im, val_label], batch_size=self.batch_size, num_threads=2)
print('开启训练')
self.learning_rate = tf.placeholder(dtype=tf.float32) # 动态学习率
self.x = tf.placeholder(tf.float32, [None, self.im_height, self.im_width, 3]) # 训练数据
self.y = tf.placeholder(tf.float32, [None, self.label_num]) # 标签
self.pred = self.cnnNet()
self.loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=self.pred, labels=self.y))
self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate).minimize(self.loss)
self.predict = tf.reshape(self.pred, [-1, self.words_num, len(self.words)])
self.max_idx_p = tf.argmax(self.predict, 2)
self.y_predict = tf.reshape(self.y, [-1, self.words_num, len(self.words)])
self.max_idx_l = tf.argmax(self.y_predict, 2)
self.correct_pred = tf.equal(self.max_idx_p, self.max_idx_l)
self.accuracy = tf.reduce_mean(tf.cast(self.correct_pred, tf.float32))
tc=0
with tf.Session() as self.sess:
# 全局tf变量初始化
self.sess.run(tf.global_variables_initializer())
coordinator = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=self.sess, coord=coordinator)
# 模型保存
saver = tf.train.Saver(max_to_keep=3,keep_checkpoint_every_n_hours=3)
batch_max = len(x_train_list) // self.batch_size
total_step = 1
for epoch_num in range(self.epoch_max):
#if tc>=0.8:
# lr=lr*0.9
#if tc<0.8:
# lr = self.lr * (1 - (epoch_num/self.epoch_max) ** 2) # 动态学习率
lr = self.lr * (1 - (epoch_num/self.epoch_max) ** 2) # 动态学习率
for batch_num in range(batch_max):
x_train_tmp, y_train_tmp = self.sess.run(train_batch)
# print(x_train_tmp.shape, y_train_tmp.shape)
# sys.exit()
self.sess.run(self.optimizer, feed_dict={self.x: x_train_tmp, self.y: y_train_tmp, self.learning_rate: lr, self.keep_drop: .5})
# 输出评价标准
if total_step % 50 == 0 or total_step == 1:
print()
print('epoch:%d/%d batch:%d/%d step:%d lr:%.10f' % ((epoch_num + 1), self.epoch_max, (batch_num + 1), batch_max, total_step, lr))
# 输出训练集评价
train_loss, train_acc = self.sess.run([self.loss, self.accuracy], feed_dict={self.x: x_train_tmp, self.y: y_train_tmp, self.keep_drop: 1.})
print('train_loss:%.10f train_acc:%.10f' % (np.mean(train_loss), train_acc))
# 输出验证集评价
val_loss_list, val_acc_list = [], []
for i in range(int(self.val_num/self.batch_size)):
x_val_tmp, y_val_tmp = self.sess.run(val_batch)
val_loss, val_acc = self.sess.run([self.loss, self.accuracy], feed_dict={self.x: x_val_tmp, self.y: y_val_tmp, self.keep_drop: 1.})
val_loss_list.append(np.mean(val_loss))
val_acc_list.append(np.mean(val_acc))
print(' val_loss:
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
分为训练端(tensorflow1.9)源码和C#推理端源码,训练完成以后通过toCsharp.py脚本转换为c#可用的模型(35MB左右),C#端源码使用最简单的多维数组详细展示了CNN网络中每一层计算过程,根据.net版本C#端还分为单线程版本和.net4.0的cpu并行版本,区别就在速度上单线程在i5-4570的四核CPU上识别一个4位验证码要3秒左右。多线程的只要0.8秒左右。如果CPU核心越多,速度还会更快。
资源推荐
资源详情
资源评论
收起资源包目录
C#cnn神经网络过验证码.rar (2349个子文件)
cnn.bin 33.5MB
cnn.bin 33.5MB
checkpoint 75B
app.config 161B
cnn.exe.config 161B
cnn.vshost.exe.config 161B
Form1.cs 20KB
Form1.cs 20KB
Form1.Designer.cs 4KB
Form1.Designer.cs 4KB
Resources.Designer.cs 3KB
Resources.Designer.cs 3KB
AssemblyInfo.cs 1KB
AssemblyInfo.cs 1KB
Settings.Designer.cs 1KB
Settings.Designer.cs 1KB
Program.cs 484B
Program.cs 484B
cnn.csproj 4KB
cnn.csproj 4KB
CnnOcr-31.data-00000-of-00001 101.28MB
使用说明.docx 40KB
cnn.vshost.exe 22KB
cnn.vshost.exe 21KB
cnn.exe 17KB
cnn.exe 16KB
CnnOcr-31.index 2KB
cnn.vshost.exe.manifest 490B
cnn.vshost.exe.manifest 490B
CnnOcr-31.meta 1.31MB
cnn.pdb 44KB
cnn.pdb 40KB
1_32ae.png 25KB
1_32ae.png 25KB
1_32ae.png 25KB
2_427c.png 25KB
2_427c.png 25KB
2_427c.png 25KB
1.png 24KB
1.png 24KB
0_222i.png 24KB
2058_swpg.png 11KB
233_eevw.png 11KB
430_sqpa.png 11KB
42_w893.png 11KB
250_8ymc.png 11KB
1022_ubag.png 11KB
1322_w9w4.png 11KB
963_5cp8.png 11KB
720_8ptq.png 11KB
864_g9aq.png 11KB
896_2z8w.png 11KB
1295_sag4.png 11KB
2132_knp8.png 11KB
937_ufa3.png 11KB
704_ygs8.png 11KB
190_hdip.png 11KB
103_wh3p.png 10KB
1436_mge3.png 10KB
76_egg2.png 10KB
1643_7qa6.png 10KB
1141_zzpa.png 10KB
540_n5s9.png 10KB
966_6fyx.png 10KB
343_8qy7.png 10KB
1974_e32c.png 10KB
1009_83na.png 10KB
451_mq8q.png 10KB
1479_5y88.png 10KB
825_ad6g.png 10KB
1939_3muh.png 10KB
2099_2zpj.png 10KB
362_d2eg.png 10KB
2126_69gf.png 10KB
1661_c8q6.png 10KB
142_wnxp.png 10KB
1862_dy5a.png 10KB
1976_hjsv.png 10KB
2091_tk69.png 10KB
1875_uxj5.png 10KB
1106_yzcm.png 10KB
1202_fzqa.png 10KB
2264_zf8a.png 10KB
1264_k5qz.png 10KB
965_es4k.png 10KB
579_bbk8.png 10KB
2010_qsux.png 10KB
2125_jr6q.png 10KB
755_zspp.png 10KB
1727_z6gc.png 10KB
1058_35dw.png 10KB
2003_muay.png 10KB
2171_eg9v.png 10KB
1246_uzxm.png 10KB
1493_ptua.png 10KB
875_s9gh.png 10KB
1222_gsws.png 10KB
995_9mms.png 10KB
696_w8gn.png 10KB
1049_j68p.png 10KB
共 2349 条
- 1
- 2
- 3
- 4
- 5
- 6
- 24
资源评论
kdevilpf
- 粉丝: 1
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功