基於python語言的tensorflow的‘端到端’的字符型驗證碼識別源碼整理(github源碼分享)

基於python語言的tensorflow的‘端到端’的字符型驗證碼識別

1   Abstract

驗證碼(CAPTCHA)的誕生自己是爲了自動區分 天然人 和 機器人 的一套公開方法, 可是近幾年的人工智能技術的發展,傳統的字符驗證已經形同虛設。 因此,你們一方面研究和學習此代碼時,另一方面也要警戒本身的互聯網系統的web安全問題。python

Keywords: 人工智能,Python,字符驗證碼,CAPTCHA,識別,tensorflow,CNN,深度學習git

2   Introduction

全自動區分計算機和人類的公開圖靈測試(英語:Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),俗稱驗證碼,是一種區分用戶是計算機或人的公共全自動程序 [1]github

得益於基於卷積神經網絡CNN的人工智能技術的發展,目前基於主流的深度學習框架的直接開發出 端到端不分割 的識別方式,並且在沒有通過太多trick的狀況下,已經能夠達到95%以上的識別率。web

傳統的機器學習方法,對於多位字符驗證碼都是採用的 化整爲零 的方法:先分割成最小單位,再分別識別,而後再統一。 卷積神經網絡方法,直接採用 端到端不分割 的方法:輸入整張圖片,輸出整個圖片的標記結果,具備更強的通用性。安全

具體的區別以下圖:網絡


端到端 的識別方法顯然更具有優點,由於目前的字符型驗證碼爲了防止被識別,多位字符已經徹底融合粘貼在一塊兒了,利用傳統的技術基本很難實現分割了。本文重點推薦的就是 端到端 的方法。框架

3   引用聲明

本文代碼都參考自此文:機器學習

http://blog.topspeedsnail.com/archives/10858

斗大的熊貓--《WTF Daily Blog》web安全

本項目主要解決的問題是對某一模式的字符型驗證進行端到端的識別。學習

輸入內容:


模型預測結果:

4   本文工做

  • 解釋了原做者代碼註釋中提到的關於sigmoid選型的困惑問題並應用到代碼中
  • 將原做者的代碼進行模塊工程化,成爲總體項目,方便研究的同窗直接進行模式套用

原做者代碼中:

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

做者在代碼的註釋中出提出了這樣的疑問:

對 softmax 和 sigmoid 的使用方式有疑問。

而後在文章下面讀者評論區也都提到了此問題,在此進行總體解釋一下。

原文中CNN的輸出的維度是 MAX_CAPTCHA*CHAR_SET_LEN ,其實這些維度並不都是徹底獨立分佈的, 可是使用sigmoid loss也是仍然能夠的,至關於先用sigmoid進行了一次歸一化,而後再將各個維度的值向目標值進行 迴歸 , 最後loss越小,兩個向量的對應的值也越接近。 其實sigmoid是能夠當作是一個多分類的問題,在這個例子上也能起到比較好的收斂效果

固然,關於分類的問題,看全部的機器學習框架裏面,都是建議使用softmax進行最後的歸一化操做,這其實至關因而一種 馬太效應 : 讓可能性大的分類的值變得更大,讓可能性小的份量值變得更小。可是這有個前提,就是參與到softmax運算的一組數據,必須是 相關聯 的, 因此若是要使用 softmax_cross_entropy_with_logits ,只須要將網絡進行簡單修改便可。把輸出的維度作成二維[MAX_CAPTCHA, CHAR_SET_LEN], 而後使用softmax loss。

output = crack_captcha_cnn()#36×4
predict = tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN])  # 36行,4列
label = tf.reshape(Y, [-1, MAX_CAPTCHA, CHAR_SET_LEN])

最後使用GPU訓練的實驗結果對比:

  • sigmoid方式。訓練6000個step就能達到95%的準確率。
  • softmax方式。訓練8千個step,達到90%的準確率;訓練8萬個step,達到94.7%(跑了大半天)

使用tensorboard對accuracy進行監控:

sigmoid-6千個step:


softmax-8千個step:


softmax-8萬個step:


總體來講,在這個例子裏面,好像 sigmoid的收斂速度快些,固然這個多是本項目裏面的外界因素有利於sigmoid吧,至於具體緣由,等後續再進行研究和解釋吧,固然有可能根本解釋不了,由於對於CNN,目前主流的意見都是:,反正效果就是好,可是不知道爲啥, 科幻得近於玄幻 的一種技術。

github源碼地址:

https://github.com/zhengwh/captcha-tensorflow

項目文件介紹:

  • cfg.py 配置信息文件
  • cnn_sys.py CNN網絡結構
  • data_iter.py 可迭代的數據集
  • gen_captcha.py 驗證碼生成器,直接使用程序生成帶標記的數據
  • predict.py 加載訓練好的模型,而後對輸入的圖片進行預測
  • train.py 對模型進行訓練
  • utils.py 一些公共使用的方法

5   小結

本文主要只寫原做者沒有提到的內容,想了解原文的,能夠直接去原做者頁面。

6   Reference

[1] wiki-CAPTCHA https://en.wikipedia.org/wiki/CAPTCHA

7   後續交流

若是有對相關技術有持續關注的興趣的同窗,歡迎加入QQ羣: 592109504

或者手機QQ掃碼加入:

相關文章
相關標籤/搜索