Windows caffe VGG人脸识别
caffe自带的例子有mnist和cifar10,cifar10和mnist的运行方式类型,下好图片数据文件后,训练例子中的模型,然后测试模型,也可以自己用图片进行预测分类(自己图片最好是cifar10训练的10种类型)。10种类型如下:
airplane
automobile
bird
cat
deer
dog
frog
horse
ship
truck
其他类型的图片也只能是错误识别,没有意义。
进入正题,跑完例子,笔者饥渴的想来点别的分类和识别模型。结合时下热门的人脸识别技术,就决定用知名的VGG人脸模型了。
一、VGG介绍
http://www.robots.ox.ac.uk/~vgg/software/vgg_face/
网站提供了VGGFACE的论文出处,使用的是VGG-VERY-DEEP-16 CNN,它在YouTube网站的人脸识别结果可达到92.8%还是不错的成绩!
网站提供了Torch和caffe两种框架的模型,以及MatConvNet文件。
二、生成数据
使用现有的模型来测试,属于caffe的finetuing(微调模型)。
Windows下要将待测图片生成LEVELDB文件,我使用的是 IMM Face Database (240 images) http://www.imm.dtu.dk/~aam/
可自行下载,数据集包含JPG格式的彩图,每人6张图片,共40人,240图片。
笔者在caffe/examples/目录下新建vggface目录,只要在caffe/目录下都行,在vggface下再分别创建train和val文件夹,存储训练和测试图片:如 D:\caffe\caffe-master\examples\vggface\train D:\caffe\caffe-master\examples\vggface\val
从数据集选择测试图片放入train文件夹,再新建标签文本 train.txt

train.txt存放图片的名称和标签类别,注意类别是从0开始,比如10类就是0-9(有点C数组下标的感觉)
train.txt内容可通过.bat命令生成,笔者部分内容:
-1m.jpg
-2m.jpg
-3m.jpg
-4m.jpg
-5m.jpg
-1m.jpg
-2m.jpg
-3m.jpg
-4m.jpg
-5m.jpg
-1m.jpg
-2m.jpg
-3m.jpg
-4m.jpg
-5m.jpg
-1m.jpg
-2m.jpg
-3m.jpg
-4m.jpg
-5m.jpg
val文件内的图片和val.txt也是同样操作!
接下来是转换为LEVELDB的数据文件,笔者在网上搜索尝试了很多写法,很多都会报错,或者在Windows下使用shell脚本并不是很方便,最后综合了下,如下convertldb.bat可以成功转换。
D:\caffe\caffe-master\Build\x64\Debug\convert_imageset.exe --resize_width= --resize_height= D:\caffe\caffe-master\examples\vggface\train\ D:\caffe\caffe-master\examples\vggface\train\train.txt D:\caffe\caffe-master\examples\vggface\train_leveldb -backend=leveldb
Pause
为了还原真实环境我没有在每个目录参数前面换行以显得美观,有的博客将后面3个目录的参数都换行了,贴出来很好看,但是会出现不是内部程序的错误,去掉换行改为空格间隔即可解决!(代码有点长,请拉完观看)
convert_imageset.exe是自己在caffe工程里生成的,我没有Realease所以Debug也可以的。
--resize_height是为了调整图片的长宽,因为VGG模型要求是224*224大小,如果你自己用OPENCV或MATLAB调整了大小,可以不要这两个参数。
后面3个目录分别是训练图片的文件路径;训练图片的标签文件;生成的LEVELDB文件路径;
-backend=leveldb 很重要,确保生成的是LEVELDB格式,默认是IMDB,Windows使用有问题!
成功执行convertldb.bat后,会生成对应文件夹,看.log文件大小不为0也没报错基本没问题。
val文件夹的图片也做和train文件夹类似的转换,只需要在convertldb.bat里修改为val文件夹路径即可!
有了LEVELDB文件后进入计算均值阶段:
也是脚本执行,如 compute_mean.bat
SET GLOG_logtostderr=
D:\caffe\caffe-master\Build\x64\Debug\compute_image_mean.exe -backend=leveldb D:\caffe\caffe-master\examples\vggface\train_leveldb D:\caffe\caffe-master\examples\vggface\mean.binaryproto
pause
计算均值一般不会出错,compute_image_mean.exe也是在caffe工程里通过VS2013生成的。
后面两个目录参数依次是: LEVELEDB的文件路径; 生成的均值文件路径;caffe的均值文件是xx.binaryproto
三、修改网络
VGG网络可以使用的网络架构模型和某些基本solver参数,但是数据路径,输入层,输出全连接层之类的还是要根据自己的图片类别进行修改。
新建vggface_train_test.protxt,将下载的模型内的VGG_FACE_deploy.prototxt内容复制到vggface_train_test.protxt。对前面的数据层和最后的输出层进行修改:
name: "vggface_train_test.prototxt"
layers {
name: "data"
type: DATA
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size:
mean_value:
mean_value:
mean_value:
}
data_param{
source: "D:/caffe/caffe-master/examples/vggface/train_leveldb"
batch_size:
backend: LEVELDB
}
}
layers {
name: "data"
type: DATA
top: "data"
top: "label"
include {
phase: TEST
}
transform_param{
mirror: false
crop_size:
mean_value:
mean_value:
mean_value:
}
data_param{
source: "D:/caffe/caffe-master/examples/vggface/val_leveldb"
batch_size:
backend: LEVELDB
}
}
layers {
bottom: "data"
top: "conv1_1"
name: "conv1_1"
type: CONVOLUTION
convolution_param {
num_output:
pad:
kernel_size:
}
}
修改到第一个卷积层conv1_1之前,如上所示,中间的网络层不用修改。
最后两层改为如下形式:
layers {
bottom: "fc7"
top: "facefc8"
name: "facefc8"
type: INNER_PRODUCT
inner_product_param {
num_output:
}
}
layers {
bottom: "facefc8"
top: "prob"
name: "prob"
type: SOFTMAX
}
主要是修改两处: 1.name修改,不能使用之前的fc8会报错,笔者改为facefc8; 2.修改num_output分类数我的类别是5个所以改为5!
接下来是建vggface_solver.prototxt,如下:
# The train/test net protocol buffer definition
net: "examples/vggface/vggface_train_test.prototxt"
# test_iter specifies how many forward passes the test should carry out.
test_iter:
test_interval:
test_initialization: false
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.00005
momentum: 0.9
weight_decay: 0.0002
lr_policy: "step"
stepsize:
gamma: 0.3
average_loss:
# Display every iterations
display:
max_iter:
# snapshot intermediate results
snapshot:
snapshot_prefix: "examples/vggface/vggmodel"
solver_mode: CPU
其中迭代次数,学习率,权值衰减都可以自己修改,学习率一开始要小点,笔者电脑渣为了快速看到结果迭代次数都比较少,建议大家迭代次数都是上百上千比较好!
vggface_solver.prototxt写好后,写一个训练finetuing脚本就行,笔者为 vgg_train.bat
cd ../../
"Build/x64/Debug/caffe.exe" train --solver=examples/vggface/vggface_solver.prototxt --weights=examples/vggface/VGG_FACE.caffemodel
pause
几点说明:caffe.exe路径自己修改
训练网络所以使用 train 关键字,若是测试则为 test
要加上--weigths 后面为下载的VGGcaffe模型,表示只是对网络finetuing,如果不加就是训练新的网络了!
最后还可以带一个参数 -gpu=0 表示使用GPU加速,笔者电脑仅CPU所以没写。
成功训练模型后会出现下图的optimization Done 表示结束!

同时也会生成对应的 .caffemodel和 .solverstate文件,按迭代次数出现多个如:

有了finetuing后的自己模型后就可以使用测试数据进行结果测试,也可以使用C++调用模型进行分类识别操作。
测试结果步骤与mnist例子类似,先写到这!
Windows caffe VGG人脸识别的更多相关文章
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【二】人脸预处理
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 人脸识别(基于Caffe)
人脸识别(基于Caffe, 来自tyd) 人脸识别(判断是否为人脸) LMDB(数据库, 为Caffe支持的分类数据源) mkdir face_detect cd face_detect mkdir ...
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- PyQt5+Caffe+Opencv搭建人脸识别登录界面
PyQt5+Caffe+Opencv搭建人脸识别登录界面(转载) 最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的 ...
- 人脸识别ArcfaceDemo for Windows 分享
Demo_for_Windows https://github.com/ArcJonSnow/Demo_for_Windows Arcsoft ArcfaceDemo for Windows, VS2 ...
- 人脸识别 ArcFace Demo [Windows]
Arcsoft ArcfaceDemo for Windows, VS2013 C++ 使用虹软技术开发完成 使用步骤: 1.下载SDK包,32位Windows平台将五个SDK包里lib中的文件到 ...
- 基于人脸识别+IMDB-WIFI+Caffe的性别识别
本文用记录基于Caffe的人脸性别识别过程.基于imdb-wiki模型做finetune,imdb-wiki数据集合模型可从这里下载:https://data.vision.ee.ethz.ch/cv ...
随机推荐
- Linux命令(二十五) 磁盘管理命令(三) fdisk
一.fdisk命令介绍 fdisk 为Linux系统下的分区管理工具,类型windows下的 分区助手等工具软件.分过区装过操作系统的人都知道硬盘分区是必要和重要的.fdisk 的帮助如下所示: [r ...
- [转帖] Linux 下面栈空间大小的实验
比如局部变量是保存在栈空间中的,今天突然在想栈的上限是多大呢,什么时候才会栈溢出? ulimit 命令 linux下使用ulimit 命令可以查看系统的很多上限值. ulimit -a 查看所有 ul ...
- 随web应用启动而自启动的后台线程
当前遇到一个需求: 需要在web应用启动的时候就启动一个线程定时的来做某项工作. 有两种解决方法: 1.增加一个监听器Listener来实现相关功能. 2.增加一个随项目启动的servlet来实现相关 ...
- Bootstrap-table学习笔记
| 引入CSS文件 <link rel="stylesheet" href="bootstrap.min.css"> <link rel=&q ...
- 【agc001e】BBQ HARD(动态规划)
[agc001e]BBQ HARD(动态规划) 题面 atcoder 洛谷 题解 这些agc都是写的整场的题解,现在还是把其中一些题目单独拿出来发 这题可以说非常妙了. 我们可以把这个值看做在网格图上 ...
- 洛谷 P2527 [SHOI2001]Panda的烦恼 解题报告
P2527 [SHOI2001]Panda的烦恼 题目描述 panda是个数学怪人,他非常喜欢研究跟别人相反的事情.最近他正在研究筛法,众所周知,对一个范围内的整数,经过筛法处理以后,剩下的全部都是质 ...
- 个推基于Consul的配置管理
作者:个推应用平台基础架构高级研发工程师 阿飞 在微服务架构体系中,由于微服务众多,服务之间又有互相调用关系,因此,一个通用的分布式配置管理是必不可少的.一般来说,配置管理需要解决配置集中管理.在系统 ...
- Eclipse Neon安装指导
[下载] 前往Eclipse官网:http://www.eclipse.org/,点击DOWNLOAD: 进入下载页面后,会显示如下下载界面: 找到 Get Eclipse Neon,然后点击下面的” ...
- SQL Server 查询性能优化——覆盖索引
覆盖索引又可以称为索引覆盖. 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一个方法,当能通过检索索引 ...
- [六字真言]4.叭.SpringMVC异常痛苦
"叭",除畜生道劳役之苦: 在学过的三阶段的时候,我们对SpringMVC的异常处理,一直可以算是简单中透着暴力,不要不重视异常!真的很重要,不要让它处在尴尬的位置! 在二阶段或者 ...