Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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
Esempio n. 4
0
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)
Esempio n. 5
0
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