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


1   Abstract

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

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

2   Introduction

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

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

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

具體的區別如下圖:


端到端 的識別方法顯然更具備優勢,因為目前的字符型驗證碼為了防止被識別,多位字符已經完全融合粘貼在一起了,利用傳統的技術基本很難實現分割了。本文重點推薦的就是 端到端 的方法。

3   引用聲明

本文代碼都參考自此文:

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

斗大的熊貓--《WTF Daily Blog》

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

輸入內容:


模型預測結果:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM