关键词:人脸识别、Caffe、VGG Face Model
一、准备数据集
对于一个未经加工的数据集,基本情况如下图所示
图中每一个文件夹内是该类别的所有图像。我们需要对每一类划分训练集与测试集。这里可以写个脚本进行划分,训练集与测试集的比例自己把握,一般来说是训练集:测试集=4:1。
需要注意的是,最终只需要生成两个文件夹:train与val。train文件夹中包含所有训练图片,换句话说,就是把所有训练图片都放在一个文件夹内。val同理。
我们在使用脚本划分数据集时,同时需要新建两个文本:train.txt与val.txt,用来记录训练集与测试集中图片名称,以及类别。如下图所示:
需要注意的非常重要的一点是,train.txt和val.txt中的名称与类别中间分隔符是一个空格,其次,类别号要从0开始,否则后续处理会出现错误。
二、数据处理
经过上一步后,我们会得到两个文件夹:train与val、以及相对应的train.txt和val.txt。
接下来,我们需要将上述数据集处理成caffe能读取的数据格式LMDB。这部分有标准的处理脚本。
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
EXAMPLE= #修改
DATA= #修改
TOOLS= #修改
TRAIN_DATA_ROOT=$DATA/train/
VAL_DATA_ROOT=$DATA/val/
DBTYPE=lmdb
# Set RESIZE=true to resize the images to 224×224. 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 \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/train_lmdb
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/val_lmdb
echo "Computing image mean..."
$TOOLS/compute_image_mean -backend=$DBTYPE \
$EXAMPLE/train_lmdb $EXAMPLE/mean.binaryproto
echo "Done."
你需要更改的地方有:
1.EXAMPLE后面的路径,尽量设置为第一步中的train与test文件夹的父路径;
2.DATA为第一步中的train与test文件夹的父路径;
3.TOOLS的标准格式为:(caffe路径)/build/tools;
4.TRAIN_DATA_ROOT与VAL_DATA_ROOT不需要改变,分别对应train与val文件夹的路径。
其他参数的意义解释可参考:http://www.cnblogs.com/dupuleng/articles/4370236.html
确保上述路径设置正确后,便可将脚本拖入终端运行。
运行完成后,在你设置的EXAMPLE路径中会产生train_lmdb与val_lmdb两个文件夹,以及mean.binaryproto文件。
三、caffe训练相关配置文件修改
下载VGG Face Model,并解压,移动到(caffe路径)/models中:
接下来,我们需要修改vgg_face_caffe中的VGG_FACE_deploy.prototxt 文件,推荐你直接复制下面的文件
name: "VGG_FACE_16_Net"
layer {
name: "data"
type: "Data" #这里注意
top: "data"
top: "label"
data_param {
source: "$/train_lmdb" #这里修改
backend:LMDB
batch_size: 100 #这里修改
}
transform_param {
mean_file: "$/mean.binaryproto" #这里修改
mirror: true
}
include: { phase: TRAIN }
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
data_param {
source: "$/val_lmdb" #这里修改
backend:LMDB
batch_size: 25 #这里修改
}
transform_param {
mean_file: "$/mean.binaryproto" #这里修改
mirror: true
}
include: {
phase: TEST
}
}
layer {
name: "conv1_1"
type: "Convolution"
bottom: "data"
top: "conv1_