TensorFlow练习20: 使用深度学习破解字符验证码

验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水、发垃圾广告等等 。

验证码的作用是验证用户是真人还是机器人;设计理念是对人友好,对机器难。

TensorFlow练习20: 使用深度学习破解验证码

上图是常见的字符验证码,还有一些验证码使用提问的方式。

我们先来看看破解验证码的几种方式:

  1. 人力打码(基本上,打码任务都是大型网站的验证码,用于自动化注册等等)
  2. 找到能过验证码的漏洞
  3. 最后一种是字符识别,这是本帖的关注点

我上网查了查,用Tesseract OCR、OpenCV等等其它方法都需把验证码分割为单个字符,然后识别单个字符。分割验证码可是人的强项,如果字符之间相互重叠,那机器就不容易分割了。

本帖实现的方法不需要分割验证码,而是把验证码做为一个整体进行识别。

相关论文

使用深度学习+训练数据+大量计算力,我们可以在几天内训练一个可以破解验证码的模型,当然前提是获得大量训练数据。

获得训练数据方法:

  1. 手动(累死人系列)
  2. 破解验证码生成机制,自动生成无限多的训练数据
  3. 打入敌人内部(卧底+不要脸+不要命+多大仇系列)

我自己做一个验证码生成器,然后训练CNN模型破解自己做的验证码生成器。

我觉的验证码机制可以废了,单纯的增加验证码难度只会让人更难识别,使用CNN+RNN,机器的识别准确率不比人差。Google已经意识到了这一点,他们现在使用机器学习技术检测异常流量。

验证码生成器

TensorFlow练习20: 使用深度学习破解字符验证码
左上角文本对应验证码图像

TensorFlow练习20: 使用深度学习破解字符验证码

训练

CNN需要大量的样本进行训练,由于时间和资源有限,测试时我只使用数字做为验证码字符集。如果使用数字+大小写字母CNN网络有4*62个输出,只使用数字CNN网络有4*10个输出。

TensorBoard是个好东西,既能用来调试也能帮助理解Graph。

训练完成时的准确率(超过50%我就不训练了):

TensorFlow练习20: 使用深度学习破解字符验证码

使用训练的模型识别验证码:

TensorFlow练习20: 使用深度学习破解字符验证码

为了成为真正的码农,本熊猫要开始研习TensorFlow源代码了,应该能学到不少玩意。

如要转载,请保持本文完整,并注明作者@斗大的熊猫和本文原始地址: http://blog.topspeedsnail.com/archives/10858

相关文章

《TensorFlow练习20: 使用深度学习破解字符验证码》有24个想法

  1. 楼主,我使用的你模型特别棒,但是,当我多次测验证码的时候,出现NotFoundError (see above for traceback): Key Variable_11 not found in checkpoint 错误,能否告知?

  2. NotFoundError (see above for traceback): Key Variable_101 not found in checkpoint
    [[Node: save_11/RestoreV2_10 = RestoreV2[dtypes=[DT_FLOAT], _device=”/job:localhost/replica:0/task:0/cpu:0″](_recv_save_11/Const_0, save_11/RestoreV2_10/tensor_names, save_11/RestoreV2_10/shape_and_slices)]]
    对应不上是为什么呢?

  3. 训练完了,最后的准确率是百分之五十多,但是当测试的时候,运行第三段代码的时候,有点问题

    from gen_captche import gen_captcha_text_and_image

    import test#这是第二段代码所保存的.py文件的名称

    def crack_captcha(captcha_image):
    output = crack_captcha_cnn()

    saver = tf.train.Saver()
    with tf.Session() as session:
    saver.restore(session, tf.train.latest_checkpoint(‘.’))#crack_capcha.model

    predict = tf.argmax(tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2)
    text_list = session.run(predict, feed_dict={X: [captcha_image], keep_prob: 1})
    # TODO: 转换验证码
    text = text_list[0].tolist()
    return text

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

    在第二段代码执行完毕保存模型的时候,报错说找不到父目录,我就改成这样,saver.save(sess, “my_net/crack_capcha.model”, global_step=step)就可以保存了,

    然后我把保存的模型文件
    checkpoint
    crack_capcha.model-2800.data-00000-of-00001,
    crack_capcha.model-2800.index,
    crack_capcha.model-2800.meta移到与这三段代码同级目录

    然后像上面那样执行第三段代码,他又重新训练,为什么不是使用模型来测试呢,是不是不该导入test,但不导入test,又报错说没convert2gray,crack_captcha_cnn
    三段代码,我分开了

      1. 哦,不,没,1000 0.0520797
        1000 0.1075
        1001 0.052147
        1002 0.0518532
        1003 0.0519402
        1004 0.0522044
        1005 0.0523217
        还是跟有大小写字母的一样总是徘徊在0.05,神经网络不是递增的么,难道是陡增:(

          1. 2288 0.035766
            2289 0.0367045
            2290 0.0371417
            2291 0.0375454
            2292 0.0366892
            2293 0.0353566
            2294 0.038165
            2295 0.0358233
            2296 0.0368601
            2297 0.0387196
            2298 0.0360758
            2299 0.0368539
            2300 0.0371812
            2300 0.56

            恩恩 ,出来了,thank you:)

  4. 你好,打扰了,这个文章对我非常有帮助,我在我的机器上能成功运行,但当我试图把验证码的大小改成300*300时,会提示这行出错:
    dense = tf.reshape(conv3, [-1, w_d.get_shape().as_list()[0]])
    出错提示为:
    Input to reshape is a tensor with 5914624 values, but the requested shape requires a multiple of 10240
    请问这是什么原因引起的呢?谢谢!

      1. 我在window下读取模型,会报错,一直报错,保存模型没问题,错误如下:
        NotFoundError: Unsuccessful TensorSliceReader constructor: Failed to find any matching files for D:\anaconda_script\model\crack_capcha.ckpt
        [[Node: save_31/RestoreV2_2 = RestoreV2[dtypes=[DT_FLOAT], _device=”/job:localhost/replica:0/task:0/cpu:0″](_recv_save_31/Const_0, save_31/RestoreV2_2/tensor_names, save_31/RestoreV2_2/shape_and_slices)]]

        能帮忙看下原因吗,或者留个qq,我方便联系啊下你。

发表评论

电子邮件地址不会被公开。 必填项已用*标注