python如何實現人臉識別?
翻出我曾經寫的一篇文章來介紹這個問題。
為大家帶來一篇 初步使用Keras深度學習破解驗證碼 的文章。 當然我們這里識別的是普通驗證碼,是Laravel常用的驗證碼庫
Captcha for Laravel 5
如下圖,又5個數字字母所組成的驗證碼。我用PHP一共生成了5萬個驗證碼。后面也會提供給大家
導入所需的庫
這里我們還是使用Keras,底層使用Tensorflow做為底層庫。
本次使用的模型是簡單的卷積神經網絡模型,后面也會使用更加復雜的模型
卷積神經網絡(Convolutional Neural Network,CNN)是一種前饋神經網絡,它的人工神經元可以響應一部分覆蓋范圍內的周圍單元,對于大型圖像處理有出色表現。它包括卷積層(alternating convolutional layer)和池層(pooling layer)。
一般地,CNN的基本結構包括兩層,其一為特征提取層,每個神經元的輸入與前一層的局部接受域相連,并提取該局部的特征。一旦該局部特征被提取后,它與其它特征間的位置關系也隨之確定下來;其二是特征映射層,網絡的每個計算層由多個特征映射組成,每個特征映射是一個平面,平面上所有神經元的權值相等。特征映射結構采用影響函數核小的sigmoid函數作為卷積網絡的激活函數,使得特征映射具有位移不變性。此外,由于一個映射面上的神經元共享權值,因而減少了網絡自由參數的個數。卷積神經網絡中的每一個卷積層都緊跟著一個用來求局部平均與二次提取的計算層,這種特有的兩次特征提取結構減小了特征分辨率。
配置參數
加載數據
訓練模型的時候,我們可以選擇兩種方式來生成我們的訓練數據,一種是直接全部載入內存,然后開始訓練,一種是定義一個數據生成器,然后利用 fit_generator 分批加載數據來訓練。
因為樣本是5萬張,但是只有200多M,可以一次性載入內存。
最后會生成pickle文件。python的pickle模塊實現了基本的數據序列和反序列化。通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲;通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象。
如果使用我保存好的pickle文件,可以不用執行下列步驟
加載數據,讀取pickle文件
創建模型
開始訓練模型
訓練完成,進行驗證
改進
對于這種按順序的文字驗證碼,還有一種更好方法可以使用,那就是循環神經網絡來識別序列。 我會在后面繼續介紹如何用循環神經網絡構建模型。
代碼地址:https://github.com/szpnygo/keras-cnn-captcha
Pickle地址:https://pan.baidu.com/s/1i4JiZOT