zoukankan      html  css  js  c++  java
  • tencent_3.2_crack_verification_code

    课程地址:https://cloud.tencent.com/developer/labs/lab/10325/console

    简介

    数据学习

    安装 captcha 库

    pip install captcha
    

    获取训练数据

    本教程使用的验证码由数字、大写字母、小写字母组成,每个验证码包含 4 个字符,总共有 62^4 种组合,所以一共有 62^4 种不同的验证码。

    generate_captcha.py

    #-*- coding:utf-8 -*-
    from captcha.image import ImageCaptcha
    from PIL import Image
    import numpy as np
    import random
    import string
    
    class generateCaptcha():
        def __init__(self,
                     width = 160,#验证码图片的宽
                     height = 60,#验证码图片的高
                     char_num = 4,#验证码字符个数
                     characters = string.digits + string.ascii_uppercase + string.ascii_lowercase):#验证码组成,数字+大写字母+小写字母
            self.width = width
            self.height = height
            self.char_num = char_num
            self.characters = characters
            self.classes = len(characters)
    
        def gen_captcha(self,batch_size = 50):
            X = np.zeros([batch_size,self.height,self.width,1])
            img = np.zeros((self.height,self.width),dtype=np.uint8)
            Y = np.zeros([batch_size,self.char_num,self.classes])
            image = ImageCaptcha(width = self.width,height = self.height)
    
            while True:
                for i in range(batch_size):
                    captcha_str = ''.join(random.sample(self.characters,self.char_num))
                    img = image.generate_image(captcha_str).convert('L')
                    img = np.array(img.getdata())
                    X[i] = np.reshape(img,[self.height,self.width,1])/255.0
                    for j,ch in enumerate(captcha_str):
                        Y[i,j,self.characters.find(ch)] = 1
                Y = np.reshape(Y,(batch_size,self.char_num*self.classes))
                yield X,Y
    
        def decode_captcha(self,y):
            y = np.reshape(y,(len(y),self.char_num,self.classes))
            return ''.join(self.characters[x] for x in np.argmax(y,axis = 2)[0,:])
    
        def get_parameter(self):
            return self.width,self.height,self.char_num,self.characters,self.classes
    
        def gen_test_captcha(self):
            image = ImageCaptcha(width = self.width,height = self.height)
            captcha_str = ''.join(random.sample(self.characters,self.char_num))
            img = image.generate_image(captcha_str)
            img.save(captcha_str + '.jpg')
    
            X = np.zeros([1,self.height,self.width,1])
            Y = np.zeros([1,self.char_num,self.classes])
            img = img.convert('L')
            img = np.array(img.getdata())
            X[0] = np.reshape(img,[self.height,self.width,1])/255.0
            for j,ch in enumerate(captcha_str):
                Y[0,j,self.characters.find(ch)] = 1
            Y = np.reshape(Y,(1,self.char_num*self.classes))
            return X,Y
    View Code

    理解训练数据

    generate_captcha_TEST.py 

    # -*- coding: utf-8 -*
    from captcha.image import ImageCaptcha
    import matplotlib.pyplot as plt
    import numpy as np
    import string
    import random
    
    
    class generate_captcha():
        def __init__(self,
                     width=160,
                     height=60,
                     char_num=4,
                     characters=string.digits + string.ascii_uppercase + string.ascii_lowercase):
            self.width = width
            self.height = height
            self.char_num = char_num
            self.characters = characters
            self.classes = len(characters)
    
        def gen_captcha(self, batch_size=50):
            image = ImageCaptcha(width=self.width, height=self.height)
            X = np.zeros([batch_size, self.height, self.width, 1])
            Y = np.zeros([batch_size, self.char_num, self.classes])
    
            while True:
                for i in range(batch_size):
                    captcha_str = ''.join(random.sample(self.characters, self.char_num))
                    img = image.generate_image(captcha_str).convert('L')
                    img = np.array(img.getdata())
                    X[i] = np.reshape(img, (self.height, self.width, 1)) / 255.0
                    for j, ch in enumerate(captcha_str):
                        Y[i, j, self.characters.find(ch)] = 1
                Y = np.reshape(Y, (batch_size, self.char_num*self.classes))
                yield X, Y
    
    
        def decode_captcha(self, y):  # the type of y is np.array
            y = np.reshape(y, (len(y), self.char_num, self.classes))
            return ''.join(self.characters[x] for x in np.argmax(y, axis=2)[0, :])
    
        def get_parametets(self):
            return self.width, self.height, self.char_num, self.characters, self.classes
    
        def test_gen_captcha(self):
            image = ImageCaptcha(width=self.width, height=self.height)
            captcha_str = ''.join(random.sample(self.characters, self.char_num))
            img = image.generate_image(captcha_str)
            img.save(captcha_str + '.jpg')
    
            X = np.zeros([1, self.height, self.width, 1])
            Y = np.zeros([1, self.char_num, self.classes])
            img = img.convert('L')
            img = np.array(img.getdata())
    
            X[0] = np.reshape(img, (self.height, self.width, 1)) / 255.0
            for j, char in enumerate(captcha_str):
                Y[0, j, self.characters.find(char)] = 1
    
            #### test decode_captcha()
            decode = self.decode_captcha(Y)
            print("captcha_str: %s" % captcha_str)
            print("decode: %s" % decode)
    
            Y = np.reshape(Y, [1, self.char_num * self.classes])
            return X, Y
    
    #### test test_gen_captcha()
    g = generate_captcha()
    X, Y = g.test_gen_captcha()
    # print(X)
    # print(Y)
    
    #### test gen_captcha()
    g_batch = generate_captcha()
    step = 1
    while True:
        X, Y = next(g_batch.gen_captcha(5))
        print(step, X.shape, Y.shape)
        step += 1
        if step > 200:
            break
    View Code

    此文件是我练习时自己打的,加上了其中三个函数功能的测试 

    模型学习

    1.CNN 模型

    captcha_model.py

    # -*- coding: utf-8 -*
    import tensorflow as tf
    import math
    
    class captchaModel():
        def __init__(self,
                     width = 160,
                     height = 60,
                     char_num = 4,
                     classes = 62):
            self.width = width
            self.height = height
            self.char_num = char_num
            self.classes = classes
    
        def conv2d(self,x, W):
            return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
    
        def max_pool_2x2(self,x):
            return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                                  strides=[1, 2, 2, 1], padding='SAME')
    
        def weight_variable(self,shape):
            initial = tf.truncated_normal(shape, stddev=0.1)
            return tf.Variable(initial)
    
        def bias_variable(self,shape):
            initial = tf.constant(0.1, shape=shape)
            return tf.Variable(initial)
    
        def create_model(self,x_images,keep_prob):
            #first layer
            w_conv1 = self.weight_variable([5, 5, 1, 32])
            b_conv1 = self.bias_variable([32])
            h_conv1 = tf.nn.relu(tf.nn.bias_add(self.conv2d(x_images, w_conv1), b_conv1))
            h_pool1 = self.max_pool_2x2(h_conv1)
            h_dropout1 = tf.nn.dropout(h_pool1,keep_prob)
            conv_width = math.ceil(self.width/2)
            conv_height = math.ceil(self.height/2)
    
            #second layer
            w_conv2 = self.weight_variable([5, 5, 32, 64])
            b_conv2 = self.bias_variable([64])
            h_conv2 = tf.nn.relu(tf.nn.bias_add(self.conv2d(h_dropout1, w_conv2), b_conv2))
            h_pool2 = self.max_pool_2x2(h_conv2)
            h_dropout2 = tf.nn.dropout(h_pool2,keep_prob)
            conv_width = math.ceil(conv_width/2)
            conv_height = math.ceil(conv_height/2)
    
            #third layer
            w_conv3 = self.weight_variable([5, 5, 64, 64])
            b_conv3 = self.bias_variable([64])
            h_conv3 = tf.nn.relu(tf.nn.bias_add(self.conv2d(h_dropout2, w_conv3), b_conv3))
            h_pool3 = self.max_pool_2x2(h_conv3)
            h_dropout3 = tf.nn.dropout(h_pool3,keep_prob)
            conv_width = math.ceil(conv_width/2)
            conv_height = math.ceil(conv_height/2)
    
            #first fully layer
            conv_width = int(conv_width)
            conv_height = int(conv_height)
            w_fc1 = self.weight_variable([64*conv_width*conv_height,1024])
            b_fc1 = self.bias_variable([1024])
            h_dropout3_flat = tf.reshape(h_dropout3,[-1,64*conv_width*conv_height])
            h_fc1 = tf.nn.relu(tf.nn.bias_add(tf.matmul(h_dropout3_flat, w_fc1), b_fc1))
            h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
    
            #second fully layer
            w_fc2 = self.weight_variable([1024,self.char_num*self.classes])
            b_fc2 = self.bias_variable([self.char_num*self.classes])
            y_conv = tf.add(tf.matmul(h_fc1_drop, w_fc2), b_fc2)
    
            return y_conv
    View Code

    2.训练 CNN 模型

    每批次采用 64 个训练样本,每 100 次循环采用 100 个测试样本检查识别准确度,当准确度大于 99% 时,训练结束,采用 GPU 需要 4-5 个小时左右,CPU 大概需要 20 个小时左右。

    train_captcha.py

    #-*- coding:utf-8 -*-
    import tensorflow as tf
    import numpy as np
    import string
    import generate_captcha
    import captcha_model
    
    if __name__ == '__main__':
        captcha = generate_captcha.generateCaptcha()
        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)
    
        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)
    
        saver = tf.train.Saver()
        with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())
            step = 1
            while True:
                batch_x,batch_y = next(captcha.gen_captcha(64))
                _,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(captcha.gen_captcha(100))
                    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,"./capcha_model.ckpt")
                        break
                step += 1
    View Code

    wget http://tensorflow-1253902462.cosgz.myqcloud.com/captcha/capcha_model.zip
    unzip -o capcha_model.zip
    

    3.识别验证码

    测试数据集:

    我们在腾讯云的 COS 上准备了 100 个验证码作为测试集,使用 wget 命令获取:
    wget http://tensorflow-1253902462.cosgz.myqcloud.com/captcha/captcha.zip
    unzip -q captcha.zip
    

    predict_captcha.py

    #-*- coding:utf-8 -*-
    from PIL import Image, ImageFilter
    import tensorflow as tf
    import numpy as np
    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)
    View Code

    参考博客:

    1.python ,numpy 模块中 resize 和 reshape的区别

    2.Python yield 使用浅析

    3.【Linux】unzip命令,记一次遇到的问题

    4.TensorFlow设置GPU占用量

    5.Tensorflow Session 配置选项解析

  • 相关阅读:
    QT解析和组装json
    linux下磁盘存储空间不足
    linux下的QT打包方法
    linux下编译protobuf
    linux下编译opencv
    linux下的qt串口通信
    QT执行shell脚本及linux指令相关
    windows下QT打包
    启动zookeeper却没有进程
    Linux命令
  • 原文地址:https://www.cnblogs.com/exciting/p/11379644.html
Copyright © 2011-2022 走看看