教程詳解:用卷積神經(jīng)網(wǎng)絡檢測臉部關(guān)鍵點(一)
這是一個手把手教你學習深度學校的教程。一步一步,我們將要嘗試去解決Kaggle challenge中的臉部關(guān)鍵點的檢測問題。
本文引用地址:http://2s4d.com/article/201808/385311.htm這份教程介紹了Lasagne,一個比較新的基于Python和Theano的神經(jīng)網(wǎng)絡庫。我們將用Lasagne去模擬一系列的神經(jīng)網(wǎng)絡結(jié)構(gòu),討論一下數(shù)據(jù)增強(data augmentaTIon)、流失(dropout)、結(jié)合動量(momentum)和預先訓練(pre-training)。這里有很多方法可以將我們的結(jié)果改善不少。
我假設諸位已經(jīng)知道了一些關(guān)于神經(jīng)網(wǎng)絡的只是。所以我們就不介紹神經(jīng)網(wǎng)絡的背景知識了。這里也提供一些好的介紹神經(jīng)網(wǎng)絡的書籍和視頻,如Neural Networks and Deep Learning online book。Alec Radford的演講Deep Learning with Python’s Theano library也是一個快速介紹的好例子。以及ConvNetJS Browser Demos
預先準備
如果你只需要看懂的話,則不需要自己寫一個代碼然后去執(zhí)行。這里提供一些安裝的教程給那些配置好CUDA的GPU并且想要運行試驗的那些人。
我假設你們已經(jīng)安裝了CUDA toolkit, Python 2.7.x, numpy, pandas, matplotlib, 和scikit-learn。安裝剩下的依賴包,比如Lasagne和Theano都可以運行下面的指令
pip install -r https://raw.githubusercontent.com/dnouri/kfkd-tutorial/master/requiremen...
注意,為了簡潔起見,我沒有在命令中創(chuàng)建虛擬環(huán)境,但是你需要的。
譯者:我是在windows10上面配置這個環(huán)境的,安裝anaconda(再用此環(huán)境安裝依賴包)、VS2013(不推薦2015)、CUDA工具即可。
如果一切都順利的話,你將會在你的虛擬環(huán)境下的src/lasagne/examples/目錄中找到mnist.py并運行MNIST例子。這是一個對于神經(jīng)網(wǎng)絡的“Hello world”程序。數(shù)據(jù)中有十個分類,分別是0~9的數(shù)字,輸入時28TImes;28的手寫數(shù)字圖片。
cd src/lasagne/examples/
python mnist.py
此命令將在三十秒左右后開始打印輸出。 這需要一段時間的原因是,Lasagne使用Theano做重型起重; Theano反過來是一個“優(yōu)化GPU元編程代碼生成面向數(shù)組的優(yōu)化Python數(shù)學編譯器”,它將生成需要在訓練發(fā)生前編譯的C代碼。 幸運的是,我們組需要在第一次運行時支付這個開銷的價格。
譯者:如果沒有配置GPU,用的是CPU的話,應該是不用這么久的編譯時間,但是執(zhí)行時間有一些長。如果用GPU,在第一次跑一些程序的時候,會有提示正在編譯的內(nèi)容。
當訓練開始的時候,你會看到
Epoch 1 of 500
training loss: 1.352731
validaTIon loss: 0.466565
validaTIon accuracy: 87.70 %
Epoch 2 of 500
training loss: 0.591704
validation loss: 0.326680
validation accuracy: 90.64 %
Epoch 3 of 500
training loss: 0.464022
validation loss: 0.275699
validation accuracy: 91.98 %
…
如果你讓訓練運行足夠長,你會注意到,在大約75代之后,它將達到大約98%的測試精度。
如果你用的是GPU,你想要讓Theano去使用它,你要在用戶的主文件夾下面創(chuàng)建一個.theanorc文件。你需要根據(jù)自己安裝環(huán)境以及自己操作系統(tǒng)的配置使用不同的配置信息:
[global]
floatX = float32
device = gpu0
[lib]
cnmem = 1
譯者:這是我的配置文件。
[cuba]
root = C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0
[global]
openmp = False
device = gpu
floatX = float32
allow_input_downcast = True
[nvcc]
fastmath = True
flags = -IC:Anaconda2libs
compiler_bindir = C:Program Files (x86)Microsoft Visual Studio 12.0VCbin
base_compiledir = path_to_a_directory_without_such_characters
[blas]
ldflags =
[gcc]
cxxflags = -IC:Anaconda2MinGW
數(shù)據(jù)
面部關(guān)鍵點檢測的訓練數(shù)據(jù)集包括7049(96x96)個灰度圖像。 對于每個圖像,我們應該學習找到15個關(guān)鍵點的正確位置(x和y坐標),例如
left_eye_center
right_eye_outer_corner
mouth_center_bottom_lip
一個臉部標記出三個關(guān)鍵點的例子。
數(shù)據(jù)集的一個有趣的變化是,對于一些關(guān)鍵點,我們只有大約2,000個標簽,而其他關(guān)鍵點有7,000多個標簽可用于訓練。
讓我們編寫一些Python代碼,從所提供的CSV文件加載數(shù)據(jù)。 我們將編寫一個可以加載訓練和測試數(shù)據(jù)的函數(shù)。 這兩個數(shù)據(jù)集的區(qū)別在于測試數(shù)據(jù)不包含目標值; 這是預測這些問題的目標。 這里是我們的load()函數(shù):
# file kfkd.py
import os
import numpy as np
from pandas.io.parsers import read_csv
from sklearn.utils import shuffle
FTRAIN = '~/data/kaggle-facial-keypoint-detection/training.csv'
FTEST = '~/data/kaggle-facial-keypoint-detection/test.csv'
def load(test=False, cols=None):
Loads data from FTEST if *test* is True, otherwise from FTRAIN.
Pass a list of *cols* if you're only interested in a subset of the
target columns.
fname = FTEST if test else FTRAIN
df = read_csv(os.path.expanduser(fname)) # load pandas dataframe
# The Image column has pixel values separated by space; convert
# the values to numpy arrays:
df['Image'] = df['Image'].apply(lambda im: np.fromstring(im, sep=' '))
if cols: # get a subset of columns
df = df[list(cols) + ['Image']]
print(df.count()) # prints the number of values for each column
df = df.dropna() # drop all rows that have missing values in them
評論