基於opencv、CNN人臉識別

系統開發環境

硬件:

CUP: INTEL CORE I7-6500U

GPU: NVIDIA GeForce 940M

內存:8G

硬盤:PCIE SSD 256G

軟件:

Python 3.5

系統使用工具

集成開發環境(Anaconda或IDLE)

插件:

opencv3.4.3

numpy1.14.6

keras2.2.4

Tensorflow cpu1.11.0

sklearn0.20.0

獲取人臉數據

首先通過opencv打開攝像頭,獲取視頻流,得到一幀一幀的圖片,用opencv自帶的人臉識別分類器haarcascade_frontalface_alt2檢測出每幀人臉的部分,並保存。將獲取的每幀圖片壓縮成64*64的,並灰度化。

圖像預處理

劃分數據集

按照交叉驗證的原則將數據集劃分成三部分:訓練集、驗證集、測試集;交叉驗證屬於機器學習中常用的精度測試方法,它的目的是提升模型的可靠和穩定性。我們會拿出大部分數據用於模型訓練,小部分數據用於對訓練後的模型驗證,驗證結果會與驗證集真實值(即標籤值)比較並計算出差平方和,此項工作重複進行,直至所有驗證結果與真實值相同,交叉驗證結束,模型交付使用。在這裏我們導入了sklearn庫的交叉驗證模塊,利用函數train_test_split()來劃分訓練集和驗證集。train_test_split()會根據test_size參數按比例劃分數據集,在這裏我們劃分出了30%的數據用於驗證,70%用於訓練模型。參數random_state用於指定一個隨機數種子,從全部數據中隨機選取數據建立訓練集和驗證集,所以你將會看到每次訓練的結果都會稍有不同。測試集也調用了這個函數。

改變圖像數據維度

按照keras庫運行的後端系統要求改變圖像數據的維度順序;因爲keras建立在tensorflow或theano基礎上,換句話說,keras的後端系統可以是tensorflow也可以是theano。後端系統決定了圖像數據輸入CNN網絡時的維度順序,tensorflow的維度順序爲行數(rows)、列數(cols)、通道數(顏色通道,channels);theano則是通道數、行數、列數。所以,我們通過調用image_dim_ordering()函數來確定後端系統的類型(th’代表theano,'tf'代表tensorflow),然後我們再通過numpy提供的reshape()函數重新調整數組維度。

one-hot編碼

將數據標籤進行one-hot編碼,使其向量化,對標籤集進行one-hot編碼的原因是我們的訓練模型採用categorical_crossentropy作爲損失函數,這個函數要求標籤集必須採用one-hot編碼形式。所以,我們對訓練集、驗證集和測試集標籤均做了編碼轉換。那麼什麼是one-hot編碼呢?one-hot有的翻譯成獨熱,有的翻譯成一位有效,個人感覺一位有效更直白一些。因爲one-hot編碼採用狀態寄存器的組織方式對狀態進行編碼,每個狀態值對應一個寄存器位,且任意時刻,只有一位有效。對於我們的程序來說,我們類別狀態只有兩種(nb_classes = 2):0和1,0代表我,1代表others。one-hot編碼會提供兩個寄存器位保存這兩個狀態,如果標籤值爲0,則編碼後值爲[1 0],代表第一位有效;如果爲1,則編碼後值爲[0 1],代表第2爲有效。換句話說,one-hot編碼將數值變成了位置信息,使其向量化,這樣更方便CNN操作。

歸一化圖像數據

數據集先浮點後歸一化的目的是提升網絡收斂速度,減少訓練時間,同時適應值域在(0,1)之間的激活函數,增大區分度。其實歸一化有一個特別重要的原因是確保特徵值權重一致。舉個例子,我們使用mse這樣的均方誤差函數時,大的特徵數值比如(5000-1000)2與小的特徵值(3-1)2相加再求平均得到的誤差值,顯然大值對誤差值的影響最大,但大部分情況下,特徵值的權重應該是一樣的,只是因爲單位不同才導致數值相差甚大。因此,我們提前對特徵數據做歸一化處理,以解決此類問題。

卷積神經網絡結構

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章