def get_data(gray_image): tf.reset_default_graph() captcha = captcha_model.captchaModel() width, height, char_num, characters, classes = captcha.get_parameter() img = np.array(gray_image.getdata()) test_x = np.reshape(img, [height, width, 1]) / 255.0 x = tf.placeholder(tf.float32, [None, height, width, 1]) keep_prob = tf.placeholder(tf.float32) model = captcha_model.captchaModel(width, height, char_num, classes) y_conv = model.create_model(x, keep_prob) predict = tf.argmax(tf.reshape(y_conv, [-1, char_num, classes]), 2) init_op = tf.global_variables_initializer() saver = tf.train.Saver() gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95) config = tf.ConfigProto() #config.gpu_options.per_process_gpu_memory_fraction = 0.5 config.gpu_options.allow_growth = True with tf.Session(config=config) as sess: sess.run(init_op) saver.restore(sess, "./capcha_model.ckpt") pre_list = sess.run(predict, feed_dict={x: [test_x], keep_prob: 1}) for i in pre_list: s = '' for j in i: s += characters[j] return s
def __init__( self, width=82, #验证码图片的宽 height=32, #验证码图片的高 char_num=4, #验证码字符个数 characters=string.digits + string.ascii_uppercase + string.ascii_lowercase, modeldir="./capcha_model-5.ckpt"): self.width = width self.height = height self.char_num = char_num self.characters = characters self.classes = len(characters) self.x = tf.placeholder(tf.float32, [None, self.height, self.width, 1]) self.keep_prob = tf.placeholder(tf.float32) model = captcha_model.captchaModel(self.width, self.height, self.char_num, self.classes) y_conv = model.create_model(self.x, self.keep_prob) self.predict = tf.argmax( tf.reshape(y_conv, [-1, self.char_num, self.classes]), 2) self.init_op = tf.global_variables_initializer() self.saver = tf.train.Saver() self.sess = tf.Session() self.sess.run(self.init_op) # 使用的模型 self.modeldir = modeldir self.saver.restore(self.sess, self.modeldir)
def test_captcha(): captcha = generate_captcha.generateCaptcha(width=100, height=30, characters=string.digits) width, height, char_num, characters, classes = captcha.get_parameter() x = tf.placeholder(tf.float32, [None, height, width, 1]) y_ = tf.placeholder(tf.float32, [None, char_num * classes]) keep_prob = tf.placeholder(tf.float32) model = captcha_model.captchaModel(width, height, char_num, classes) y_conv = model.create_model(x, keep_prob) saver = tf.train.Saver() with tf.Session() as sess: # sess.run(tf.global_variables_initializer()) saver.restore(sess, tf.train.latest_checkpoint("./ckpt")) # batch_x, batch_y = captcha.gen_test_captcha() batch_x, batch_y = captcha.gen_api_captcha() loss = sess.run([y_conv], feed_dict={ x: batch_x, y_: batch_y, keep_prob: 0.75 }) print("real == %s, predict = %s, result = %s" % (captcha.decode_captcha(batch_y), captcha.decode_captcha(loss), "Match" if captcha.decode_captcha(batch_y) == captcha.decode_captcha(loss) else "Not Match")) return True if captcha.decode_captcha(batch_y) == captcha.decode_captcha( loss) else False
def extrain(self, filename='./model/model-1.ckpt', restore_file='./capcha_model-5.ckpt'): x = tf.placeholder(tf.float32, [None, self.height, self.width, 1]) y_ = tf.placeholder(tf.float32, [None, self.char_num * self.classes]) keep_prob = tf.placeholder(tf.float32) model = captcha_model.captchaModel(self.width, self.height, self.char_num, self.classes) y_conv = model.create_model(x, keep_prob) cross_entropy = tf.reduce_mean( tf.nn.sigmoid_cross_entropy_with_logits(labels=y_, logits=y_conv)) train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) predict = tf.reshape(y_conv, [-1, self.char_num, self.classes]) real = tf.reshape(y_, [-1, self.char_num, self.classes]) correct_prediction = tf.equal(tf.argmax(predict, 2), tf.argmax(real, 2)) correct_prediction = tf.cast(correct_prediction, tf.float32) accuracy = tf.reduce_mean(correct_prediction) saver = tf.train.Saver() with tf.Session() as sess: sess.run(tf.global_variables_initializer()) saver.restore(sess, restore_file) step = 0 while True: batch_x, batch_y = next(self.get_img(128)) _, loss = sess.run([train_step, cross_entropy], feed_dict={ x: batch_x, y_: batch_y, keep_prob: 0.75 }) print('step:%d,loss:%f' % (step, loss)) if step % 100 == 0: batch_x_test, batch_y_test = next(self.get_img(512)) acc = sess.run(accuracy, feed_dict={ x: batch_x_test, y_: batch_y_test, keep_prob: 1. }) print( '###############################################step:%d,accuracy:%f' % (step, acc)) if acc > 0.99: # 保存模型的名字,名字同样会进行覆盖 saver.save(sess, filename) break step += 1 print('train success')
def test_captcha(file_path): captcha = generate_captcha.generateCaptcha(width=100, height=30, characters=string.digits) width, height, char_num, characters, classes = captcha.get_parameter() x = tf.placeholder(tf.float32, [None, height, width, 1]) y_ = tf.placeholder(tf.float32, [None, char_num * classes]) keep_prob = tf.placeholder(tf.float32) model = captcha_model.captchaModel(width, height, char_num, classes) y_conv = model.create_model(x, keep_prob) saver = tf.train.Saver() with tf.Session() as sess: saver.restore(sess, tf.train.latest_checkpoint("./ckpt")) batch_x, batch_y = captcha.gen_local_captcha(file_path) loss = sess.run([y_conv], feed_dict={x: batch_x, y_: batch_y, keep_prob: 0.75}) return captcha.decode_captcha(loss)
import string import sys import generate_captcha import captcha_model if __name__ == '__main__': captcha = generate_captcha.generateCaptcha() width, height, char_num, characters, classes = captcha.get_parameter() gray_image = Image.open(sys.argv[1]).convert('L') img = np.array(gray_image.getdata()) test_x = np.reshape(img, [height, width, 1]) / 255.0 x = tf.placeholder(tf.float32, [None, height, width, 1]) keep_prob = tf.placeholder(tf.float32) model = captcha_model.captchaModel(width, height, char_num, classes) y_conv = model.create_model(x, keep_prob) predict = tf.argmax(tf.reshape(y_conv, [-1, char_num, classes]), 2) init_op = tf.global_variables_initializer() saver = tf.train.Saver() gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95) with tf.Session(config=tf.ConfigProto(log_device_placement=False, gpu_options=gpu_options)) as sess: sess.run(init_op) saver.restore(sess, "capcha_model.ckpt") pre_list = sess.run(predict, feed_dict={x: [test_x], keep_prob: 1}) for i in pre_list: s = '' for j in i: s += characters[j] print s
import string import sys import os import captcha_model BASE_DIR = os.path.dirname(os.path.abspath(__file__)) if __name__ == '__main__': characters = string.digits + string.ascii_uppercase gray_image = Image.open(sys.argv[1]).convert('L') img = np.array(gray_image.getdata()) test_x = np.reshape(img, [25, 80, 1]) / 255.0 x = tf.placeholder(tf.float32, [None, 25, 80, 1]) keep_prob = tf.placeholder(tf.float32) model = captcha_model.captchaModel(80, 25, 6, 36) y_conv = model.create_model(x, keep_prob) predict = tf.argmax(tf.reshape(y_conv, [-1, 6, 36]), 2) init_op = tf.global_variables_initializer() saver = tf.train.Saver() gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95) with tf.Session(config=tf.ConfigProto(log_device_placement=False, gpu_options=gpu_options)) as sess: sess.run(init_op) saver.restore(sess, BASE_DIR + os.sep + "capcha_model.ckpt") pre_list = sess.run(predict, feed_dict={x: [test_x], keep_prob: 1}) for i in pre_list: s = '' for j in i: s += characters[j] print(s)
def test_model(): # width = 160 # height = 120 width = 120 height = 32 char_num = 5 characters = range(10) classes = 10 # dirpath = "D:\\support\\watermeter\\image_enhance" dirpath = "D:\\support\\watermeter\\image3" dirpath = "G:\\0" x = tf.placeholder(tf.float32, [None, height, width, 1], name="x") keep_prob = tf.placeholder(tf.float32, name="keep_prob") model = captcha_model.captchaModel(width, height, char_num, classes) y_conv = model.create_model(x, keep_prob) predict = tf.argmax(tf.reshape(y_conv, [-1, char_num, classes]), 2, name="out") init_op = tf.global_variables_initializer() saver = tf.train.Saver() # gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95) # with tf.Session(config=tf.ConfigProto(log_device_placement=False, gpu_options=gpu_options)) as sess: with tf.Session() as sess: sess.run(init_op) # ckpt = tf.train.get_checkpoint_state('./model-watermeter/') ckpt = tf.train.get_checkpoint_state('./model-watermeter/') save_path = str(ckpt.model_checkpoint_path) saver.restore(sess, save_path) tf.train.write_graph(sess.graph_def, 'output_model/pb_model', 'model.pb') print(save_path) freeze_graph.freeze_graph('output_model/pb_model/model.pb', '', False, save_path, 'out', 'save/restore_all', 'save/Const:0', 'output_model/pb_model/frozen_model.pb', False, "") for (root, dirs, files) in os.walk(dirpath, False): for filename in files: # if not filename.endswith(".jpg"): if not filename.endswith(".bmp"): continue file_path = os.path.join(root, filename) image = cv2.imread(file_path) image_src = np.copy(image) image = pre_precess_img(image, width, height) if image is None: continue # image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) # image = cv2.resize(image, (160, 120)) # cv2.imshow("image", image) test_x = np.reshape(image, [height, width, 1]) / 255.0 pre_list = sess.run(predict, feed_dict={x: [test_x], keep_prob: 1}) for i in pre_list: s = '' for j in i: s += str(characters[j]) print(filename, s) # image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) cv2.putText(image_src, s, (0, 10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 1) cv2.imshow("image", image_src) cv2.waitKey(-1)
def train(train_batch_size=64): captcha = generate_watermeter_label.WaterWaterData(dirpath="/home/test/WMImages") width = 120 #160 height = 32 # 120 char_num = 5 characters = range(10) classes = 10 # width,height,char_num,characters,classes = captcha.get_parameter() x = tf.placeholder(tf.float32, [None, height, width, 1]) y_ = tf.placeholder(tf.float32, [None, char_num * classes]) keep_prob = tf.placeholder(tf.float32) model = captcha_model.captchaModel(width, height, char_num, classes) y_conv = model.create_model(x, keep_prob) cross_entropy = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y_, logits=y_conv)) train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) # tf.summary.histogram('train_step', train_step) predict = tf.reshape(y_conv, [-1, char_num, classes]) real = tf.reshape(y_, [-1, char_num, classes]) correct_prediction = tf.equal(tf.argmax(predict, 2), tf.argmax(real, 2)) correct_prediction = tf.cast(correct_prediction, tf.float32) accuracy = tf.reduce_mean(correct_prediction) # tf.summary.histogram('accuracy', accuracy) saver = tf.train.Saver() with tf.Session() as sess: step = 1 sess.run(tf.global_variables_initializer()) # ckpt = tf.train.get_checkpoint_state('./model/') ckpt = tf.train.get_checkpoint_state('./model-watermeter/') if ckpt and ckpt.model_checkpoint_path: save_path = str(ckpt.model_checkpoint_path) saver.restore(sess, save_path) step = int(save_path[save_path.rfind("-") + 1:]) + 1 print(save_path, str(step)) # log_dir = 'summary/graph2' # train_writer = tf.summary.FileWriter(log_dir + '/train', sess.graph) # test_writer = tf.summary.FileWriter(log_dir + '/test', sess.graph) while True: # batch_x, batch_y = next(generate_random_number.keras_label_generator(64)) batch_x, batch_y = next(captcha.keras_label_generator(train_batch_size)) _, loss = sess.run([train_step, cross_entropy], feed_dict={x: batch_x, y_: batch_y, keep_prob: 0.75}) print('step:%d,loss:%f' % (step, loss)) if step % 10 == 0: # saver.save(sess, "./model/capcha_model.ckpt-" + str(step)) saver.save(sess, "./model-watermeter/capcha_model.ckpt-" + str(step)) # batch_x_test, batch_y_test = next(generate_random_number.keras_label_generator(64)) batch_x_test, batch_y_test = next(captcha.keras_label_generator(train_batch_size*8)) acc = sess.run(accuracy, feed_dict={x: batch_x_test, y_: batch_y_test, keep_prob: 1.}) print('###############################################step:%d,accuracy:%f' % (step, acc)) if acc > 0.999: saver.save(sess, "./model-watermeter/capcha_model.ckpt-" + str(step)) break step += 1 # save freeze graph file tf.train.write_graph(sess.graph_def, 'output_model/pb_model', 'model.pb') print(save_path) freeze_graph.freeze_graph('output_model/pb_model/model.pb', '', False, save_path, 'out', 'save/restore_all', 'save/Const:0', 'output_model/pb_model/frozen_model.pb', False, "")