SVHN是街景數字的數據集,Google在2013年發表的論文「Multi-digit Number Recognition from Street View Imagery using Deep Convolutional Neural Networks」提供瞭解決方法,並聲稱該方法能夠破解全部的驗證碼。python
本篇博客將簡要的總結這篇論文,並使用Keras實現模型並訓練SVHN數據集。git
這篇文章的方法主要做爲訓練SVHN數據集的一個baseline。做者說他的方法能達到百分之96以上的準確率。github
這裏先看一下數據集的樣子,其實也就是Number from Street View(街景數字)。bash
Traditional approaches to solve this problem typically separate out the localization, segmentation, and recognition steps.(過去的作法要經歷三步:定位,分割,而後識別)網絡
Propose a unified approach that integrates these three steps via the use of a deep convolutional neural network that operates directly on the image pixels.(做者把這三個步驟經過一個深度的卷積網絡就能完成)app
圖片中的數字:每張圖片的數字是一個字符串序列: ,如上面的第一張圖片結果爲"379",。學習
字符的長度:定義爲n,絕大多數的長度小於5。做者這裏假設字符的長度最大爲5。測試
做者的方法是對於圖片的label,訓練一個機率模型。這裏做者定義:ui
這裏的目標也就是經過最大化,來學習模型。this
X其實就是輸入的圖片,這裏看一下S,S是:圖片的數字序列 + 數字序列的長度的一個集合。好比上面的"379"是圖片的數字序列,序列的長度len("379")爲3。那麼S就是"3"+"379",也就是"3379"。
這裏能夠定義爲:字符長度的機率再乘以每一個字符取值的機率。(每一個字符取值是獨立的)。
上面的變量都是離散的,的取值有七種:0,1,2,....,5,比5大;有10種:10個數字。
訓練這個模型,就是在訓練集上最大化,做者這裏每一個參數都使用一個Softmax層。
下面,看下做者在論文裏面發表的模型。
首先去ufldl.stanford.edu/housenumber…下載Format 1的數據。
wget http://ufldl.stanford.edu/housenumbers/test.tar.gz
wget http://ufldl.stanford.edu/housenumbers/train.tar.gz
複製代碼
而後對數據進行解壓,解壓後發現會多兩個文件夾:test和train。
tar zvxf test.tar.gz
tar zvxf train.tar.gz
複製代碼
這個數據集可使用h5py讀取。
其中bbox存了圖片數字的框,而name則是圖片的文件名。好比說讀取出來是下面這樣的圖片: 而後經過框框把圖片裁剪一下。網絡模型這裏分爲卷積層+全鏈接層部分,代碼以下。
這裏就是三個卷積層。爲了讓神經網絡接受了參數符合同一分佈,這裏使用了Batch Normalization層,對ConvNet的輸入進行批歸一化。
卷積層最後通過Flatten以後,進入了全鏈接層。全鏈接層最後,輸出了到6個softmax層中,分別表明:字符的長度、第一個字符、第二個字符、第三個字符、第四個字符、第四個字符。
注意:這裏字符的類別是0-10,一共11種,10表明不存在。
接下來調用fit方法訓練就行了,這裏一共有7個loss和6個accuracy。loss的話是每一個softmax輸出層都有一個,還有個總的。accuracy就是6個softmax層的accuracy了。
最後咱們evaluate一下,能夠6個accuracy都達到了85%以上的準確率了。若是想提升的話,可使用VGG16等結構,網上說能夠提高到百分之97,不過訓練的話估計就要很慢了。
另外,筆者這裏還使用該方法給出了新浪微博的登陸驗證碼識別的實現代碼,見:captcha-break/weibo.com。
不過不知道如今新浪微博的驗證碼變了沒有,我當時用雲打碼的時候它的驗證碼長下面這個樣子: