def batch_hack_captcha(): output = crack_captcha_cnn() predict = tf.argmax(tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2) saver = tf.train.Saver() with tf.Session() as sess: # saver = tf.train.import_meta_graph(save_model + ".meta") saver.restore(sess, tf.train.latest_checkpoint(model_path)) stime = time.time() task_cnt = 1000 right_cnt = 0 for i in range(task_cnt): text, image = gen_captcha_text_and_image() image = convert2gray(image) image = image.flatten() / 255 predict_text = hack_function(sess, predict, image) if text == predict_text: right_cnt += 1 else: print("标记: {} 预测: {}".format(text, predict_text)) pass # print("标记: {} 预测: {}".format(text, predict_text)) print('task:', task_cnt, ' cost time:', (time.time() - stime), 's') print('right/total-----', right_cnt, '/', task_cnt)
def crack_captcha(captcha_image=random_im): if captcha_image.shape != (IMAGE_HEIGHT, IMAGE_WIDTH, 3): captcha_image = captcha_image.resize((IMAGE_HEIGHT, IMAGE_WIDTH, 3)) plt.imshow(captcha_image) plt.show() # 定义预测计算图 output = crack_captcha_cnn() predict = tf.argmax(tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2) saver = tf.train.Saver() with tf.Session() as sess: saver.restore(sess=sess, save_path=os.path.join(os.getcwd(), 'checkpoints')) captcha_image = convert2gray(captcha_image) captcha_image = captcha_image.flatten() / 255 o, p = sess.run([output, predict], feed_dict={ X: [captcha_image], keep_prob: 1 }) v = np.zeros(MAX_CAPTCHA * CHAR_SET_LEN) for i in p[0]: v1 = np.argwhere(p[0] == i) idx = v1 * CHAR_SET_LEN + i v[idx] = 1 return vec2text(v)
def train_crack_captcha_cnn(): output = crack_captcha_cnn() # loss # loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(output, Y)) 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(max_to_keep=1) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) step = 0 while 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_) if step % 100 == 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) if acc >= 0.98: save_path = saver.save(sess, model_path + "crack_captcha.model", global_step=step) print("Save to path: ", save_path) break step += 1
def crack_captcha(captcha_image): output = crack_captcha_cnn() saver = tf.train.Saver() with tf.Session() as sess: saver.restore(sess, tf.train.latest_checkpoint(os.path.dirname(CKPT_PATH))) 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() vector = np.zeros(MAX_CAPTCHA * CHAR_SET_LEN) i = 0 for n in text: vector[i * CHAR_SET_LEN + n] = 1 i += 1 return vec2text(vector)
def train_crack_captcha_cnn(): output = crack_captcha_cnn() # loss 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 = 0 start = time.time() paths = LOG_PATH.split('.') log_path = '{}.{}.{}'.format('.'.join(paths[:-1]), str(int(start)), paths[-1]) while True: batch_x, batch_y = get_next_batch(BATCH_SIZE) _, loss_ = sess.run([optimizer, loss], feed_dict={ X: batch_x, Y: batch_y, keep_prob: 0.75 }) log('step:{} loss:{}'.format(step, loss_), log_path, start) if step % 100 == 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. }) log('step:{} ----accuracy:{}'.format(step, acc), log_path, start) if acc > STOP_ACC: saver.save(sess, CKPT_PATH, global_step=step) break step += 1 tf.summary.FileWriter(BOARD_PATH, sess.graph)
def train_crack_captcha_cnn(): output = crack_captcha_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)) print("Configuring TensorBoard and Saver...") # 配置 Tensorboard,重新训练时,请将tensorboard文件夹删除,不然图会覆盖 tensorboard_dir = 'tensorboard' if not os.path.exists(tensorboard_dir): os.makedirs(tensorboard_dir) tf.summary.scalar("loss", loss) tf.summary.scalar("accuracy", accuracy) merged_summary = tf.summary.merge_all() writer = tf.summary.FileWriter(tensorboard_dir) # 配置 Saver saver = tf.train.Saver() if not os.path.exists(save_dir): os.makedirs(save_dir) start_time = time.time() best_acc_val = 0.0 # 最佳验证集准确率 last_improved = 0 # 记录上一次提升批次 #require_improvement = 1600 # 如果超过xx轮未提升,提前结束训练 with tf.Session() as sess: writer.add_graph(sess.graph) sess.run(tf.global_variables_initializer()) step = 0 while 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.5 }) # 每100 step计算一次准确率 if step % 100 == 0: batch_x_test, batch_y_test = get_next_batch(100) s, acc, losss = sess.run([merged_summary, accuracy, loss], feed_dict={ X: batch_x_test, Y: batch_y_test, keep_prob: 1. }) # 将训练结果写入tensorboard scalar writer.add_summary(s, step) if acc > best_acc_val: # 保存最好结果 best_acc_val = acc last_improved = step saver.save(sess=sess, save_path=save_dir) improved_str = '*' else: improved_str = '' time_dif = get_time_dif(start_time) msg = 'Step: {0:>6}, Train Loss: {1:>6.2}, Val Loss: {2:>6.2}, Val Acc: {3:>7.2%}, Time: {4} {5}' print( msg.format(step, loss_, losss, acc, time_dif, improved_str)) """ if total_batch - last_improved > require_improvement: # 验证集正确率长期不提升,提前结束训练 print("No optimization for a long time, auto-stopping...") break # 跳出循环 else: step += 1 """ step += 1