deep learning—利用caffe在vgg-face上finetuing自己的人臉資料

deep learning—利用caffe在vgg-face上finetuing自己的人臉資料

Abstract:本文將講解如何利用自己的人臉資料在vgg-face上finetuing,主要包括資料的生成和檔案的設定,以及最後的執行。

1.程式碼和檔案準備
程式碼caffe:http://caffe.berkeleyvision.org/,這個只要編譯好就可以用了,配置編譯不用講,網上有大量的教程。
vgg-face模型:http://www.cppblog.com/guijie/archive/2015/10/14/212015.html。該網頁包括caffe,matconvnet,torch三個版本,下載caffe版本即可。

2.資料準備
為了簡單我們就用AR資料庫作為例子。AR資料庫樣本如圖1所示。
這裡寫圖片描述

圖1 AR資料庫

下面分3步來說明如何生成Imdb檔案。caffe程式碼下載出來如圖2所示(確保caffe已經編譯成功,會出現.build_release資料夾)。就在該目錄下建立一個新的資料夾,命名為vggface。
這裡寫圖片描述

圖2 編譯後的caffe資料夾,裡面新建了一個vggface資料夾

2.1建立資料庫和標籤檔案
資料庫和標籤檔案都儲存在vggface檔案中。一個命名為train,一個命名為val,表示一個是訓練集一個是驗證集。標籤檔案為txt格式的檔案,命名為train.txt和val.txt。
train資料夾儲存檔案如圖3(a)所示,train.txt格式如圖3(b),保證每一張圖片對應的標籤正確。(val也如此)
這裡寫圖片描述這裡寫圖片描述

圖3 (a)train資料夾中的圖片,(b)train.txt為標籤檔案,包括圖片名稱和圖片的標籤。

2.2建立生成lmdb格式的指令碼
先把程式碼貼出來,這個生成imagenet的lmdb一樣。

#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train   val data dirs
EXAMPLE=vggface
DATA=vggface
TOOLS=./build/tools
TRAIN_DATA_ROOT=vggface/train/
VAL_DATA_ROOT=vggface/val/
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true
if $RESIZE; then
RESIZE_HEIGHT=224
RESIZE_WIDTH=224
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi
if [ ! -d "$TRAIN_DATA_ROOT" ]; then
echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet training data is stored."
exit 1
fi
if [ ! -d "$VAL_DATA_ROOT" ]; then
echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet validation data is stored."
exit 1
fi
echo "Creating train lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/face_train_lmdb
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/face_val_lmdb
echo "Done."

這個指令碼仿寫即可。注意RESIZE_HEIGHT=224,因為vgg處理的圖片的尺寸是224*224的。
現在指令碼檔案寫好了,儲存為vggface.sh。我們只需要執行sh vggface.sh(注意自己的執行目錄)就可以生成兩個新的資料夾,分別為face_train_lmdb和 face_val_lmdb。
2.2生成均值的指令碼檔案

#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
EXAMPLE=vggface
DATA=vggface
TOOLS=./build/tools
$TOOLS/compute_image_mean $EXAMPLE/face_train_lmdb \
$DATA/face_mean.binaryproto
echo "Done."

寫好上面的指令碼檔案,儲存為make_mean.sh就可以了,一樣的執行sh make_mean.sh就生成了face_mean.binaryproto。
通過三步就生成了caffe可以finetuing的檔案了。

3.訓練網路
第三部分就開始訓練網路了,首先需要到vggface的官網上下載vggface的caffe模型(官網還包括matconvnet模型,試過finetuning太慢了,torch沒有試過),下載好了,就會有兩個檔案,一個是VGG_FACE_deploy.prototxt,一個是VGG_FACE.caffemodel。
先建立一個.prototxt檔案,命名為vggface_train_test.prototxt即可,把之前VGG_FACE_deploy.prototxt的所有的複製過來,然後加入資料層。程式碼如下

name: "vggface_train_test.prototxt"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 224
mean_file: "vggface/face_mean.binaryproto"
}
data_param {
source: "vggface/face_train_lmdb"
batch_size: 20
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 224
mean_file: "vggface/face_mean.binaryproto"
}
data_param {
source: "vggface/face_val_lmdb"
batch_size: 20
backend: LMDB
}
}

原檔案的第一個layer之前新增即可。拉到檔案的最底部,有個num_output: 2622的那一層,這一層主要是概率輸出層,就是softmax分類器層。因為vgg訓練這個網路,用了2622個人,所以就是2622,現在可以根據自己的人的個數來設定,我用了92個人,把num_output: 2622改為了num_output: 92,並且把name:改為了facefc8
好了,現在網路搭建好。
現在就開始改solver檔案了。如果沒有就寫一個solver檔案,儲存為solver.prototxt。如下:

net: "vggface/vggface_train_test.prototxt"
test_iter: 500
test_interval: 500
test_initialization: false
display: 40
average_loss: 40
base_lr: 0.00005
lr_policy: "step"
stepsize: 320000
gamma: 0.96
max_iter: 1000
momentum: 0.9
weight_decay: 0.0002
snapshot: 500
snapshot_prefix: "vggface/mymodel"
solver_mode: GPU

然後再寫一個訓練的指令碼檔案就可以了,命名為vgg_training.sh,如下:

#!/usr/bin/env sh
./build/tools/caffe train \
--solver=vggface/solver.prototxt \
--weights=vggface/VGG_FACE.caffemodel -gpu=0

主要就是weights=vggface/VGG_FACE.caffemodel,這個代表在VGG_FACE.caffemodel上finetuing了。
現在只要執行sh vgg_training.sh就可以在vggface上finetuing了,跑結果模型也會儲存在vggface資料夾中,以後方法模型的使用。對模型使用可以用c 呼叫,也可以用matlab呼叫,都有例程。訓練新模型可以參見:http://blog.csdn.net/hlx371240/article/details/52980104

其他圖片分類或者其他任務都可以按照這樣的步驟來做。有空再講講在matconvent的finetuing吧,因為matconvent主要是在matlab下做的,非常慢,不過效果還行。以後有空再講講搭建網路完成其他任務吧。

這裡寫圖片描述
仰望藍天,呼吸新鮮空氣