Code Monkey home page Code Monkey logo

captcha-2's Introduction

captchaCnn为改良过后的验证码识别代码,推荐,此处无介绍

captcha

人工智能实验——深度学习基于TensorFlow的CAPTCHA注册码识别实验 此项目文件captcha_recognize中 gen_captcha为生成验证码部分 train_captcha为训练加测试部分 此代码中为节省实验时间,目标准确度设置为0.7 训练数据集合仅限4位数字 部分代码如下:

把彩色图像转为灰度图像(色彩对识别验证码没有什么用)

def convert2gray(img): if len(img.shape) > 2: gray = np.mean(img, -1) # 上面的转法较快,正规转法如下 # r, g, b = img[:,:,0], img[:,:,1], img[:,:,2] # gray = 0.2989 * r + 0.5870 * g + 0.1140 * b return gray else: return img

""" cnn在图像大小是2的倍数时性能最高, 如果你用的图像大小不是2的倍数,可以在图像边缘补无用像素。 np.pad(image,((2,3),(2,2)), 'constant', constant_values=(255,)) # 在图像上补2行,下补3行,左补2行,右补2行 """

文本转向量 这

char_set = number + alphabet + ALPHABET + [''] # 如果验证码长度小于4, ''用来补齐

char_set = number + ['_'] CHAR_SET_LEN = len(char_set) def text2vec(text): text_len = len(text) if text_len > MAX_CAPTCHA: raise ValueError('验证码最长4个字符')

vector = np.zeros(MAX_CAPTCHA*CHAR_SET_LEN)
def char2pos(c):
    if c =='_':
        k = 62
        return k
    k = ord(c)-48
    if k > 9:
        k = ord(c) - 55
        if k > 35:
            k = ord(c) - 61
            if k > 61:
                raise ValueError('No Map')
    return k
for i, c in enumerate(text):
    idx = i * CHAR_SET_LEN + char2pos(c)
    vector[idx] = 1
return vector

向量转回文本

def vec2text(vec): char_pos = vec.nonzero()[0] # 显示vec中非0值的位置 text=[] for i, c in enumerate(char_pos): # enumerate(char_pos)将字符串分离成位置和字符 char_at_pos = i #c/63 char_idx = c % CHAR_SET_LEN if char_idx < 10: char_code = char_idx + ord('0') elif char_idx <36: char_code = char_idx - 10 + ord('A') elif char_idx < 62: char_code = char_idx- 36 + ord('a') elif char_idx == 62: char_code = ord('_') else: raise ValueError('error') text.append(chr(char_code)) return "".join(text)

""" #向量(大小MAX_CAPTCHA*CHAR_SET_LEN)用0,1编码 每63个编码一个字符,这样顺利有,字符也有 vec = text2vec("F5Sd") text = vec2text(vec) print(text) # F5Sd vec = text2vec("SFd5") text = vec2text(vec) print(text) # SFd5 """

生成一个训练batch

def get_next_batch(batch_size=128): batch_x = np.zeros([batch_size, IMAGE_HEIGHTIMAGE_WIDTH]) batch_y = np.zeros([batch_size, MAX_CAPTCHACHAR_SET_LEN])

# 有时生成图像大小不是(60, 160, 3)
def wrap_gen_captcha_text_and_image():
    while True:
        text, image = gen_captcha_text_and_image()
        if image.shape == (60, 160, 3):
            return text, image

for i in range(batch_size):
    text, image = wrap_gen_captcha_text_and_image()
    image = convert2gray(image)

    batch_x[i,:] = image.flatten() / 255 # (image.flatten()-128)/128  mean为0
    batch_y[i,:] = text2vec(text)

return batch_x, batch_y

X = tf.placeholder(tf.float32, [None, IMAGE_HEIGHTIMAGE_WIDTH]) Y = tf.placeholder(tf.float32, [None, MAX_CAPTCHACHAR_SET_LEN]) keep_prob = tf.placeholder(tf.float32) # dropout

定义CNN

def crack_captcha_cnn(w_alpha=0.01, b_alpha=0.1): x = tf.reshape(X, shape=[-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1]) w_c1 = tf.Variable(w_alphatf.random_normal([3, 3, 1, 32])) b_c1 = tf.Variable(b_alphatf.random_normal([32])) conv1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x, w_c1, strides=[1, 1, 1, 1], padding='SAME'), b_c1)) conv1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv1 = tf.nn.dropout(conv1, keep_prob)

w_c2 = tf.Variable(w_alpha*tf.random_normal([3, 3, 32, 64]))
b_c2 = tf.Variable(b_alpha*tf.random_normal([64]))
conv2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv1, w_c2, strides=[1, 1, 1, 1], padding='SAME'), b_c2))
conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
conv2 = tf.nn.dropout(conv2, keep_prob)

w_c3 = tf.Variable(w_alpha*tf.random_normal([3, 3, 64, 64]))
b_c3 = tf.Variable(b_alpha*tf.random_normal([64]))
conv3 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv2, w_c3, strides=[1, 1, 1, 1], padding='SAME'), b_c3))
conv3 = tf.nn.max_pool(conv3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
conv3 = tf.nn.dropout(conv3, keep_prob)

# Fully connected layer
w_d = tf.Variable(w_alpha*tf.random_normal([8*32*40, 1024]))
b_d = tf.Variable(b_alpha*tf.random_normal([1024]))
dense = tf.reshape(conv3, [-1, w_d.get_shape().as_list()[0]])
dense = tf.nn.relu(tf.add(tf.matmul(dense, w_d), b_d))
dense = tf.nn.dropout(dense, keep_prob)

w_out = tf.Variable(w_alpha*tf.random_normal([1024, MAX_CAPTCHA*CHAR_SET_LEN]))
b_out = tf.Variable(b_alpha*tf.random_normal([MAX_CAPTCHA*CHAR_SET_LEN]))
out = tf.add(tf.matmul(dense, w_out), b_out)
#out = tf.nn.softmax(out)
return out

训练

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)) # 最后一层用来分类的softmax和sigmoid有什么不同? # optimizer 为了加快训练 learning_rate应该开始大,然后慢慢衰 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
    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_)

        # 每100 step计算一次准确率
        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)
            # 如果准确率大于50%,保存模型,完成训练
            if acc > 0.8:
                saver.save(sess, "./crack_capcha.model", global_step=step)
                break

        step += 1

#训练 train_crack_captcha_cnn() #验证 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('.'))
    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})
    print(text_list)
    text = text_list[0].tolist()
    print(text)
    vector = np.zeros(MAX_CAPTCHA*CHAR_SET_LEN)
    i = 0
    for n in text:
            vector[i*CHAR_SET_LEN + n] = 1
            i += 1
    print(vector)
    return vec2text(vector)

text, image = gen_captcha_text_and_image() image = convert2gray(image) image = image.flatten() / 255 predict_text = crack_captcha(image) print("正确: {} 预测: {}".format(text, predict_text))

运行结果如下: …… 810 0.29682732 811 0.29735017 812 0.29802948 813 0.29830387 814 0.2964266 815 0.29619786 816 0.2981005 817 0.2968874 818 0.2966752 819 0.29646474 820 0.2965102 821 0.29537976 822 0.29567286 …… 1598 0.14422612 1599 0.15173554 1600 0.13768029 1600 0.81 INFO:tensorflow:Restoring parameters from ./crack_capcha.model-1600 当正确率达到0.8则退出

captcha-2's People

Contributors

arfer-ustc avatar

Watchers

bigx avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.