如何使用深度學習破解驗證碼 keras 連續驗證碼

在實現網絡爬蟲的過程當中,驗證碼的出現老是會阻礙爬蟲的工做。本期介紹一種利用深度神經網絡來實現的端到端的驗證碼識別方法。經過本方法,能夠在不切割圖片、不作模板匹配的狀況下實現精度超過90%的識別結果。算法

本文分爲兩個部分,第一個部分介紹如何利用深度神經網絡實現驗證碼的訓練和識別,第二個部分介紹在實現過程當中須要克服的工程問題。網絡

一. 基於深度神經網絡的驗證碼識別機器學習

驗證碼的識別是從圖片到文字的過程。傳統的算法如OCR正是爲了解決此類問題而設計的。然而,在真實情形中,驗證碼一般並不以規則的文字出現,即文字一般會有不一樣程度的變形,圖像自己也一般會被添加或多或少的噪聲。這些干擾的出現,使得文字分割、模板匹配再也不有效,進而OCR算法也很難解析出結果。函數

近年來,深度神經網絡(DNN)在圖像識別領域已經被證實了強大的識別能力。單個文字的識別是典型的分類問題。一般的作法爲訓練一個深度神經網絡,網絡的最後一層分爲N種類別,表明字符的數目。好比對於英文字母,最後一層的分類器即是26個。好比經典的LeNet(http://yann.lecun.com/exdb/lenet/)即爲解決單個文字識別的網絡:學習

然而驗證碼一般包含多個字符,如何利用現有的網絡實現這類分類問題呢?實際上這個問題再機器學習中被稱爲多標籤訓練問題。和上述每一個圖片輸入只對應一個標籤類別對比,這類分類的輸出是多個標籤。咱們一樣能夠對傳統的神經網絡稍做改變以適應這種狀況。字體

咱們以最簡單的英文字母爲例介紹這個過程。如圖一所示,此種驗證碼由5個字母組成;每一個字母只取大寫,共有26種類別;圖片中有干擾線貫穿文字,使得文字分割比較困難。優化

圖一. 驗證碼實例編碼

 

接下來,咱們設計如圖二卷積神經網絡:設計

圖二. 卷積神經網絡3d

圖二中的網絡和通常的CNN網絡沒有什麼特殊之處,前部均是卷積、Pooling層,只有最後在分類時,將26個類別擴增到26*5=130個類別。對於每幅圖片的標籤而言,在這130維的向量中,每26個維度中有一個1,其他爲0,編碼了五個字母。接着依然使用交叉熵做爲代價函數進而優化此網絡。就這樣,只要對原先的分類網絡作簡單的改變便可解決驗證碼的識別問題。

再如對於數學表達式類型的驗證碼,咱們的網絡也只是在編碼上把26分類問題變成了13分類問題。下例中(見圖三)最後一層的分類器便設計爲3*13=39個類別。

 

圖三. 數學式類型驗證碼的識別

 

按照此種思路咱們破解了不少風格的驗證碼,如圖四所示:

圖四. 不一樣風格驗證碼破解實例

 

二. 一些須要解決的實際工程問題

(1) 合成訓練數據

前文提到訓練的前提是已經擁有了大量的訓練數據,而實際在識別驗證碼時咱們很難獲取足夠多的標註過的訓練數據。因此,咱們不得不人工合成訓練數據。這一部分一般能夠調用Java或者C#的文字渲染庫來完成。

訓練的數據並非越多越好,主要的問題在於人工合成的數據未免和真實驗證碼在形態上有些差距,咱們都很難合成出如出一轍的結果。字體、字號及變形程度都或多或少與真實數據不一樣,而這種不一樣可能直接致使訓練出的網絡面對真實數據時沒法發揮做用。

咱們的經驗是,針對真實數據的特色,在沒法很類似地合成出訓練數據的狀況下,要增大樣本的多樣性,實際上也是遵循了深度學習中數據加強(Data Augmentation)的思想。如圖五所示,左邊爲真實數據,咱們在合成數據時特地增長了每一個文字的旋轉、平移,加大了噪聲,使得訓練出的網絡能應對數據足夠的變化,從而能夠識別出左圖中真實的例子。不然即使在合成數據上達到了很高的精度,在真實數據上也依然可能精度極低(即在合成數據上過擬合)。

圖五. 合成數據實例

 (2) 網絡大小的選擇

針對不一樣的任務,網絡大小對結果的影響也是巨大的。並不是全部的任務都得使用很深的網絡來訓練。理論上說,越深的網絡自由度越大,同時也很是容易過擬合。雖然有weight_decay這樣參數能夠必定程度的對抗過擬合,但一般難度依然是很大的。因此通常來講,對於不太複雜的驗證碼應該選擇較小的網絡,只有遇到比較複雜的驗證碼如中文的成語等,咱們的經驗纔是複雜的網絡下效果才更好。

總之,驗證碼識別能夠做爲深度學習的一個練手項目來學習,在這個實際項目中能夠更容易理解到深度學習理論中諸多概念。

轉載於:http://www.saluzi.com/t/topic/16027

相關文章
相關標籤/搜索