deep learning---利用caffe在vgg-face上finetuing自己的人脸数据
2016-05-12 22:17
603 查看
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所示。
[align=center]图1 AR数据库[/align]
下面分3步来说明如何生成Imdb文件。caffe代码下载出来如图2所示(确保caffe已经编译成功,会出现.build_release文件夹)。就在该目录下建立一个新的文件夹,命名为vggface。
[align=center]图2 编译后的caffe文件夹,里面新建了一个vggface文件夹[/align]
2.1建立数据库和标签文件
数据库和标签文件都保存在vggface文件中。一个命名为train,一个命名为val,表示一个是训练集一个是验证集。标签文件为txt格式的文件,命名为train.txt和val.txt。
train文件夹保存文件如图3(a)所示,train.txt格式如图3(b),保证每一张图片对应的标签正确。(val也如此)
[align=center]图3 (a)train文件夹中的图片,(b)train.txt为标签文件,包括图片名称和图片的标签。[/align]
2.2建立生成lmdb格式的脚本
先把代码贴出来,这个生成imagenet的lmdb一样。
这个脚本仿写即可。注意RESIZE_HEIGHT=224,因为vgg处理的图片的尺寸是224*224的。
现在脚本文件写好了,保存为vggface.sh。我们只需要执行sh vggface.sh(注意自己的执行目录)就可以生成两个新的文件夹,分别为face_train_lmdb和 face_val_lmdb。
2.2生成均值的脚本文件
写好上面的脚本文件,保存为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的所有的复制过来,然后加入数据层。代码如下
原文件的第一个layer之前添加即可。拉到文件的最底部,有个num_output: 2622的那一层,这一层主要是概率输出层,就是softmax分类器层。因为vgg训练这个网络,用了2622个人,所以就是2622,现在可以根据自己的人的个数来设置,我用了92个人,把num_output: 2622改为了num_output: 92,并且把name:改为了facefc8。
好了,现在网络搭建好。
现在就开始改solver文件了。如果没有就写一个solver文件,保存为solver.prototxt。如下:
然后再写一个训练的脚本文件就可以了,命名为vgg_training.sh,如下:
主要就是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下做的,非常慢,不过效果还行。以后有空再讲讲搭建网络完成其他任务吧。
仰望蓝天,呼吸新鲜空气
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所示。
[align=center]图1 AR数据库[/align]
下面分3步来说明如何生成Imdb文件。caffe代码下载出来如图2所示(确保caffe已经编译成功,会出现.build_release文件夹)。就在该目录下建立一个新的文件夹,命名为vggface。
[align=center]图2 编译后的caffe文件夹,里面新建了一个vggface文件夹[/align]
2.1建立数据库和标签文件
数据库和标签文件都保存在vggface文件中。一个命名为train,一个命名为val,表示一个是训练集一个是验证集。标签文件为txt格式的文件,命名为train.txt和val.txt。
train文件夹保存文件如图3(a)所示,train.txt格式如图3(b),保证每一张图片对应的标签正确。(val也如此)
[align=center]图3 (a)train文件夹中的图片,(b)train.txt为标签文件,包括图片名称和图片的标签。[/align]
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下做的,非常慢,不过效果还行。以后有空再讲讲搭建网络完成其他任务吧。
仰望蓝天,呼吸新鲜空气
相关文章推荐
- 我是运营,我没有假期
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 修复mysql数据库
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- 简述MySQL分片中快速数据迁移
- MySQL数据备份之mysqldump的使用详解
- C#实现窗体间传递数据实例
- C#中的委托数据类型简介
- SQL Server删除表及删除表中数据的方法
- 给你的数据库文件减肥
- Oracle数据更改后出错的解决方法
- Oracle数据库数据丢失恢复的几种方法总结
- C#将Sql数据保存到Excel文件中的方法
- C#实例代码之抽奖升级版可以经表格数据导入数据库,抽奖设置,补抽
- MFC实现在文件尾追加数据的方法
- 把excel表格里的数据导入sql数据库的两种方法
- 用文本作数据处理