Windows下使用caffe进行VGG人脸识别深度神经网络模型的微调训练.docx
《Windows下使用caffe进行VGG人脸识别深度神经网络模型的微调训练.docx》由会员分享,可在线阅读,更多相关《Windows下使用caffe进行VGG人脸识别深度神经网络模型的微调训练.docx(15页珍藏版)》请在冰豆网上搜索。
Windows下使用caffe进行VGG人脸识别深度神经网络模型的微调训练
Windows下采用caffe进行
VGG人脸识别深度神经网络模型的微调训练
2016-8-29
本文介绍在Windows环境下,采用采用caffe进行VGG人脸识别深度神经网络模型的fine-tune(微调训练)。
运行环境为:
windows7+vs2013+matlab2015a+caffe(微软版)。
1.代码和文件准备
代码caffe:
vgg-face模型:
http:
//www.robots.ox.ac.uk/~vgg/software/vgg_face/。
该网页包括caffe,matconvnet,torch三个版本,下载caffe版本即可。
2.数据准备
收集人脸图像数据及对应的标签数据,vgg处理的图片的尺寸是224*224,因此不符合尺寸要求的要对尺寸进行修正。
然后采用caffe中的convert_imageset工具将人脸图像及对应的标签转换为leveldb格式的库文件。
并采用caffe中的compute_image_mean工具计算leveldb库文件中所包含人脸的均值文件face_mean.binaryproto。
将训练数据和评估数据的库文件分别放置在下述位置:
J:
/caffe-windows/vggface_mycmd/vggface_train_leveldb
J:
/caffe-windows/vggface_mycmd/vggface_val_leveldb
3.训练网络
第三部分就开始训练网络了,首先需要到vggface的官网上下载vggface的caffe模型(官网还包括matconvnet模型,试过finetuning太慢了,torch没有试过),下载好了,就会有两个文件,一个是VGG_FACE_deploy.prototxt,一个是VGG_FACE.caffemodel(深度网络的模型文件)。
先建立一个.prototxt文件,命名为vggface_train_test.prototx(深度网络的模型框架定义文件)即可,把之前VGG_FACE_deploy.prototxt的所有的复制过来,然后加入数据层。
VGG_FACE.caffemodel(深度网络的模型文件)与vggface_train_test.prototx(深度网络的模型框架定义文件)要相配套。
(1).vggface_train_test.prototxt
name:
"VGG_ILSVRC_16_layers"
layers{
name:
"data"
type:
DATA
include{
phase:
TRAIN
}
transform_param{
crop_size:
224
mean_value:
104
mean_value:
117
mean_value:
123
mirror:
true
}
data_param{
source:
"J:
/caffe-windows/vggface_mycmd/vggface_train_leveldb"
batch_size:
3
backend:
LEVELDB
}
top:
"data"
top:
"label"
}
layers{
name:
"data"
type:
DATA
include{
phase:
TEST
}
transform_param{
crop_size:
224
mean_value:
104
mean_value:
117
mean_value:
123
mirror:
false
}
data_param{
source:
"vggface_mycmd/vggface_val_leveldb"
batch_size:
3
backend:
LEVELDB
}
top:
"data"
top:
"label"
}
layers{
bottom:
"data"
top:
"conv1_1"
name:
"conv1_1"
type:
CONVOLUTION
convolution_param{
num_output:
64
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv1_1"
top:
"conv1_1"
name:
"relu1_1"
type:
RELU
}
layers{
bottom:
"conv1_1"
top:
"conv1_2"
name:
"conv1_2"
type:
CONVOLUTION
convolution_param{
num_output:
64
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv1_2"
top:
"conv1_2"
name:
"relu1_2"
type:
RELU
}
layers{
bottom:
"conv1_2"
top:
"pool1"
name:
"pool1"
type:
POOLING
pooling_param{
pool:
MAX
kernel_size:
2
stride:
2
}
}
layers{
bottom:
"pool1"
top:
"conv2_1"
name:
"conv2_1"
type:
CONVOLUTION
convolution_param{
num_output:
128
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv2_1"
top:
"conv2_1"
name:
"relu2_1"
type:
RELU
}
layers{
bottom:
"conv2_1"
top:
"conv2_2"
name:
"conv2_2"
type:
CONVOLUTION
convolution_param{
num_output:
128
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv2_2"
top:
"conv2_2"
name:
"relu2_2"
type:
RELU
}
layers{
bottom:
"conv2_2"
top:
"pool2"
name:
"pool2"
type:
POOLING
pooling_param{
pool:
MAX
kernel_size:
2
stride:
2
}
}
layers{
bottom:
"pool2"
top:
"conv3_1"
name:
"conv3_1"
type:
CONVOLUTION
convolution_param{
num_output:
256
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv3_1"
top:
"conv3_1"
name:
"relu3_1"
type:
RELU
}
layers{
bottom:
"conv3_1"
top:
"conv3_2"
name:
"conv3_2"
type:
CONVOLUTION
convolution_param{
num_output:
256
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv3_2"
top:
"conv3_2"
name:
"relu3_2"
type:
RELU
}
layers{
bottom:
"conv3_2"
top:
"conv3_3"
name:
"conv3_3"
type:
CONVOLUTION
convolution_param{
num_output:
256
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv3_3"
top:
"conv3_3"
name:
"relu3_3"
type:
RELU
}
layers{
bottom:
"conv3_3"
top:
"pool3"
name:
"pool3"
type:
POOLING
pooling_param{
pool:
MAX
kernel_size:
2
stride:
2
}
}
layers{
bottom:
"pool3"
top:
"conv4_1"
name:
"conv4_1"
type:
CONVOLUTION
convolution_param{
num_output:
512
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv4_1"
top:
"conv4_1"
name:
"relu4_1"
type:
RELU
}
layers{
bottom:
"conv4_1"
top:
"conv4_2"
name:
"conv4_2"
type:
CONVOLUTION
convolution_param{
num_output:
512
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv4_2"
top:
"conv4_2"
name:
"relu4_2"
type:
RELU
}
layers{
bottom:
"conv4_2"
top:
"conv4_3"
name:
"conv4_3"
type:
CONVOLUTION
convolution_param{
num_output:
512
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv4_3"
top:
"conv4_3"
name:
"relu4_3"
type:
RELU
}
layers{
bottom:
"conv4_3"
top:
"pool4"
name:
"pool4"
type:
POOLING
pooling_param{
pool:
MAX
kernel_size:
2
stride:
2
}
}
layers{
bottom:
"pool4"
top:
"conv5_1"
name:
"conv5_1"
type:
CONVOLUTION
convolution_param{
num_output:
512
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv5_1"
top:
"conv5_1"
name:
"relu5_1"
type:
RELU
}
layers{
bottom:
"conv5_1"
top:
"conv5_2"
name:
"conv5_2"
type:
CONVOLUTION
convolution_param{
num_output:
512
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv5_2"
top:
"conv5_2"
name:
"relu5_2"
type:
RELU
}
layers{
bottom:
"conv5_2"
top:
"conv5_3"
name:
"conv5_3"
type:
CONVOLUTION
convolution_param{
num_output:
512
pad:
1
kernel_size:
3
}
}
layers{
bottom:
"conv5_3"
top:
"conv5_3"
name:
"relu5_3"
type:
RELU
}
layers{
bottom:
"conv5_3"
top:
"pool5"
name:
"pool5"
type:
POOLING
pooling_param{
pool:
MAX
kernel_size:
2
stride:
2
}
}
layers{
bottom:
"pool5"
top:
"fc6"
name:
"fc6"
type:
INNER_PRODUCT
inner_product_param{
num_output:
4096
}
}
layers{
bottom:
"fc6"
top:
"fc6"
name:
"relu6"
type:
RELU
}
layers{
bottom:
"fc6"
top:
"fc6"
name:
"drop6"
type:
DROPOUT
dropout_param{
dropout_ratio:
0.5
}
}
layers{
bottom:
"fc6"
top:
"fc7"
name:
"fc7"
type:
INNER_PRODUCT
inner_product_param{
num_output:
4096
}
}
layers{
bottom:
"fc7"
top:
"fc7"
name:
"relu7"
type:
RELU
}
layers{
bottom:
"fc7"
top:
"fc7"
name:
"drop7"
type:
DROPOUT
dropout_param{
dropout_ratio:
0.5
}
}
layers{
bottom:
"fc7"
top:
"fnc8"
name:
"fnc8"
type:
INNER_PRODUCT
inner_product_param{
num_output:
6
}
}
layers{
bottom:
"fnc8"
top:
"prob"
name:
"prob"
type:
SOFTMAX
}
所做的修改主要为在原文件的第一个layer之前添加数据层。
拉到文件的最底部,有个num_output:
2622的那一层,这一层主要是概率输出层,就是softmax分类器层。
因为vgg训练这个网络,用了2622个人,所以就是2622,现在可以根据自己的人的个数来设置,我用了6个人,把num_output:
2622改为了num_output:
6,并且把name:
所有的fc8改为了fnc8,即对fc8改名,否则会报错。
好了,现在网络搭建好。
另外,还需修改以下内容:
(2).vgg_solver.prototxt
完成vggface_train_test.prototxt模型框架定义文件后,还需要编制一个对神经网络进行微调训练的参数文件VGG_solver.prototxt。
VGG_solver.prototxt代码如下:
net:
"vggface_mycmd/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:
200
snapshot_prefix:
"vggface_mycmd/mymodel"
solver_mode:
CPU
(3).编写训练的命令文件
打开windows下的cmd命令窗口,然后进入J:
\caffe-windows\目录,在cmd命令窗口下输入以下命令:
Build\x64\Release\caffe.exetrain-solvervggface_mycmd\vggface_solver.prototxt-weightsvggface_mycmd\VGG_FACE.caffemodel
就可以对VGG_FACE.caffemodel进行微调了。
跑结果的模型也会保存在J:
\caffe-windows\vggface_mycmd\目录下。
上述命令中,如果不包含-weightsvggface_mycmd\VGG_FACE.caffemodel,则进行训练一个全新的深度神经网络来进行人脸识别。