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: 使用深度学习破解字符验证码

loss和准确率曲线:

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

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

相关文章

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

  1. 楼主,我看你在这篇和27篇里使用的都是sigmoid_cross_entropy_with_logits,但输出的维度MAX_CAPTCHA*CHAR_SET_LEN,其实这些维度并不都是完全独立分布的,使用sigmoid loss是否合适?
    我看了tensorflow最新的softmax loss的接口,只对最后一个维度做softmax。
    所以我觉得正确的做法是把输出的维度做成二维[MAX_CAPTCHA, CHAR_SET_LEN],然后使用softmax loss,不知道楼主怎么看

    1. 这个是一样的,其实sigmoid是可以看成是一个多分类的问题,在这个例子上也能起到比较好的收敛效果。然后我也按照你上面说的方式转成个独立分布的张量,然后softmax,是一样的效果。然而在这个例子里面,好像 sigmoid的收敛速度快些,而且大概6千步就能达到99%的准确率,我用softmax后,今天跑了一天8W步,也才到94.7%,当然在1W步的时候,也达到80%的准确率了

  2. 你好
    請問如果要改圖片大小到200×60的話該怎麼做呢
    我有自己的驗證碼資料庫但是圖片大小是200×60
    單純改圖片大小好像無法辨識啊
    希望能幫個忙 謝謝

  3. 关于
    tensorflow/core/framework/op_kernel.cc:1152] Not found: Key Variable_11 not found in checkpoint
    2017-04-25 10:05:56.119384: W tensorflow/core/framework/op_kernel.cc:1152] Not found: Key Variable_12 not found in checkpoint
    2017-04-25 10:05:56.122724: W tensorflow/core/framework/op_kernel.cc:1152] Not found: Key Variable_14 not found in checkpoint
    2017-04-25 10:05:56.123467: W tensorflow/core/framework/op_kernel.cc:1152] Not found: Key Variable_13 not found in checkpoint
    2017-04-25 10:05:56.124123: W tensorflow/core/framework/op_kernel.cc:1152] Not found: Key Variable_16 not found in checkpoint
    2017-04-25 10:05:56.124680: W tensorflow/core/framework/op_kernel.cc:1152] Not found: Key Variable_15 not found in checkpoint
    2017-04-25 10:05:56.125143: W tensorflow/core/framework/op_kernel.cc:1152] Not found: Key Variable_18 not found in checkpoint
    2017-04-25 10:05:56.126079: W tensorflow/core/framework/op_kernel.cc:1152] Not found: Key Variable_17 not found in checkpoint
    2017-04-25 10:05:56.126293: W tensorflow/core/framework/op_kernel.cc:1152] Not found: Key Variable_19 not found in checkpoint
    这个问题不知道楼上解决没有,我在测试代码的时候也碰到问题,解决办法如下:
    在crack_captcha(captcha_image)方法中创建saver时要给定Variable的值,可以用dict或者list的格式,我的修改是saver = tf.train.Saver({“w1”:w_c1,’b1′:b_c1,’w2′:w_c2,’b2′:b_c2,’w3′:w_c3,’b3′:b_c3,’wd’:w_d,’bd’:b_d,’wo’:w_out,’bo’:b_out})

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

  5. 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)]]
    对应不上是为什么呢?

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

    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:)

        1. 哥们,你最终杂解决的呀 ,他跑够2000次 就出来了 还是 调整了 某种模式,如果是调整模式的话 调整哪里呀

  7. 你好,打扰了,这个文章对我非常有帮助,我在我的机器上能成功运行,但当我试图把验证码的大小改成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,我方便联系啊下你。

发表评论

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