- 系統開發環境
2.1系統開發環境
2.1.1硬件
- CUP: INTEL CORE I7-6500U
- GPU: NVIDIA GeForce 940M
- 內存:8G
- 硬盤:PCIE SSD 256G
2.1.2軟件
- Python 3.5
2.2系統使用工具
集成開發環境(Anaconda或IDLE)
插件:
- opencv3.4.3
- numpy1.14.6
- keras2.2.4
- Tensorflow cpu1.11.0
- sklearn0.20.
- 人臉識別技術
-
3.1獲取人臉數據
首先通過opencv打開攝像頭,獲取視頻流,得到一幀一幀的圖片,用opencv自帶的人臉識別分類器haarcascade_frontalface_alt2檢測出每幀人臉的部分,並保存。將獲取的每幀圖片壓縮成64*64的,並灰度化。
3.2圖像預處理
3.2.1劃分數據集
按照交叉驗證的原則將數據集劃分成三部分:訓練集、驗證集、測試集;交叉驗證屬於機器學習中常用的精度測試方法,它的目的是提升模型的可靠和穩定性。我們會拿出大部分數據用於模型訓練,小部分數據用於對訓練後的模型驗證,驗證結果會與驗證集真實值(即標籤值)比較並計算出差平方和,此項工作重複進行,直至所有驗證結果與真實值相同,交叉驗證結束,模型交付使用。在這裏我們導入了sklearn庫的交叉驗證模塊,利用函數train_test_split()來劃分訓練集和驗證集。train_test_split()會根據test_size參數按比例劃分數據集,在這裏我們劃分出了30%的數據用於驗證,70%用於訓練模型。參數random_state用於指定一個隨機數種子,從全部數據中隨機選取數據建立訓練集和驗證集,所以你將會看到每次訓練的結果都會稍有不同。測試集也調用了這個函數。
3.2.2改變圖像數據維度
按照keras庫運行的後端系統要求改變圖像數據的維度順序;因爲keras建立在tensorflow或theano基礎上,換句話說,keras的後端系統可以是tensorflow也可以是theano。後端系統決定了圖像數據輸入CNN網絡時的維度順序,tensorflow的維度順序爲行數(rows)、列數(cols)、通道數(顏色通道,channels);theano則是通道數、行數、列數。所以,我們通過調用image_dim_ordering()函數來確定後端系統的類型(th’代表theano,'tf'代表tensorflow),然後我們再通過numpy提供的reshape()函數重新調整數組維度。
3.2.3 one-hot編碼
將數據標籤進行one-hot編碼,使其向量化,對標籤集進行one-hot編碼的原因是我們的訓練模型採用categorical_crossentropy作爲損失函數,這個函數要求標籤集必須採用one-hot編碼形式。因爲one-hot編碼採用狀態寄存器的組織方式對狀態進行編碼,每個狀態值對應一個寄存器位,且任意時刻,只有一位有效。對於我們的程序來說,我們類別狀態只有兩種(nb_classes = 2):0和1,0代表我,1代表others。one-hot編碼會提供兩個寄存器位保存這兩個狀態,如果標籤值爲0,則編碼後值爲[1 0],代表第一位有效;如果爲1,則編碼後值爲[0 1],代表第2爲有效。換句話說,one-hot編碼將數值變成了位置信息,使其向量化,這樣更方便CNN操作。
3.2.4歸一化圖像數據
數據集先浮點後歸一化的目的是提升網絡收斂速度,減少訓練時間,同時適應值域在(0,1)之間的激活函數,增大區分度。其實歸一化有一個特別重要的原因是確保特徵值權重一致。舉個例子,我們使用mse這樣的均方誤差函數時,大的特徵數值比如(5000-1000)2與小的特徵值(3-1)2相加再求平均得到的誤差值,顯然大值對誤差值的影響最大,但大部分情況下,特徵值的權重應該是一樣的,只是因爲單位不同才導致數值相差甚大。因此,我們提前對特徵數據做歸一化處理,以解決此類問題。
3.3構建卷積神經網絡
3.3.1卷積神經網絡結構
本實驗的其中一層卷積神經網絡的結構如圖:
本程序的神經網絡包含的結構如下:
- 3個卷積層
- 2個池化層
- 3個激活函數層
- 3個Dropout層
- 2個全連接層
- 1個Flatten層
- 1個分類層
- 8,389,120個訓練參數