deep learning---利用caffe在vgg-face上finetuing自己的人脸数据
来源:互联网 发布:淘宝衣服质检报告 编辑:程序博客网 时间:2024/06/05 12:41
转载:http://blog.csdn.net/hlx371240/article/details/51388022
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所示。
下面分3步来说明如何生成Imdb文件。caffe代码下载出来如图2所示(确保caffe已经编译成功,会出现.build_release文件夹)。就在该目录下建立一个新的文件夹,命名为vggface。
2.1建立数据库和标签文件
数据库和标签文件都保存在vggface文件中。一个命名为train,一个命名为val,表示一个是训练集一个是验证集。标签文件为txt格式的文件,命名为train.txt和val.txt。
train文件夹保存文件如图3(a)所示,train.txt格式如图3(b),保证每一张图片对应的标签正确。(val也如此)
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 dirsEXAMPLE=vggfaceDATA=vggfaceTOOLS=./build/toolsTRAIN_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=trueif $RESIZE; then RESIZE_HEIGHT=224 RESIZE_WIDTH=224else RESIZE_HEIGHT=0 RESIZE_WIDTH=0fiif [ ! -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 1fiif [ ! -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 1fiecho "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_lmdbecho "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_lmdbecho "Done."
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
这个脚本仿写即可。注意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/ilsvrc12EXAMPLE=vggfaceDATA=vggfaceTOOLS=./build/tools$TOOLS/compute_image_mean $EXAMPLE/face_train_lmdb \ $DATA/face_mean.binaryprotoecho "Done."
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
写好上面的脚本文件,保存为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 }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
原文件的第一个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: 500test_interval: 500test_initialization: falsedisplay: 40average_loss: 40base_lr: 0.00005lr_policy: "step"stepsize: 320000gamma: 0.96max_iter: 1000momentum: 0.9weight_decay: 0.0002snapshot: 500snapshot_prefix: "vggface/mymodel"solver_mode: GPU
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
然后再写一个训练的脚本文件就可以了,命名为vgg_training.sh,如下:
#!/usr/bin/env sh./build/tools/caffe train \ --solver=vggface/solver.prototxt \ --weights=vggface/VGG_FACE.caffemodel -gpu=0
- 1
- 2
- 3
- 4
- 5
主要就是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下做的,非常慢,不过效果还行。以后有空再讲讲搭建网络完成其他任务吧。
仰望蓝天,呼吸新鲜空气
- deep learning---利用caffe在vgg-face上finetuing自己的人脸数据
- deep learning---利用caffe在vgg-face上finetuing自己的人脸数据
- deep learning---利用caffe在vgg-face上finetuing自己的人脸数据
- 利用caffe在vgg-face上finetuing自己的人脸数据
- Deep Learning学习 - VGG-Face网络人脸识别
- [人脸识别]使用VGG Face Model微调(Fine tune)自己的数据集
- 在Caffe上利用自己的数据集进行微调
- deep learning for face detection (caffe C++)
- caffe入门3:利用imagenet在caffe上训练自己的数据集
- Face++人脸识别:Learning Deep Face Representation
- 在caffe上跑自己的数据
- 在caffe上跑自己的数据
- 在caffe上跑自己的数据
- 在caffe上跑自己的数据
- 在caffe上跑自己的数据
- 在caffe上跑自己的数据
- 在caffe上跑自己的数据
- A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现
- c语言中,求1到n的阶乘之和
- PyQt5+python3+pycharm开发环境配置
- 3种机器学习算法
- mysql 建立索引的原则
- gitlab安装和迁库
- deep learning---利用caffe在vgg-face上finetuing自己的人脸数据
- git常用命令总结
- 切分表达式——写个tokenizer吧
- upD79F8513A(NEC)或upD78F0511A(NEC)之AD采样
- Wireshark抓包示例
- 100多个基础常用JS函数和语法集合大全
- 全志R16平台SPI0接口的验证V1.1(分色排版)
- eGovResSysDB-delete语句
- redis服务以及phpredis扩展的安装