tensorflow的『端到端』的字元型驗證碼識別源碼整理(github源碼分享)

基於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 引用聲明

本文代碼都參考自此文:

blog.topspeedsnail.com/

斗大的熊貓--《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) ……

作者在代碼的注釋中出提出了這樣的疑問:

softmaxsigmoid 的使用方式有疑問。

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

原文中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×4predict = 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源碼地址:

github.com/zhengwh/capt

項目文件介紹:

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

5 小結

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

有朋友在此基礎上,做了個中文漢字驗證碼的分類項目,請移步:

https://github.com/wang5150753/tensorflow

後續交流:

驗證碼識別技術交流


推薦閱讀:

Win10 Tensorflow
NLP(2) Tensorflow 文本- 價格建模 Part2
評論上的情感分析:主題與情感詞抽取
tensor flow dynamic_rnn 與rnn有啥區別?
Tensorflow 在 Android 平台的移植

TAG:TensorFlow | Python | 驗證碼 |