学习深度学习已有一段时间了,总想着拿它做点什么,今天终于完成了一个基于caffe的人脸检测,这篇博文将告诉你怎样通过caffe一步步实现人脸检测。本文主要参考唐宇迪老师的教程,在这里感谢老师的辛勤付出。

传统机器学习方法实现人脸检测:

  人脸检测在opencv中已经帮我们实现了,我们要把它玩起来很简单,只需要简简单单的几行代码其实就可以搞定。(haarcascade_frontalface_alt.xml这个文件在opencv的安装目录下能找到,笔者的路径是:E:\opencv2.4.10\opencv\sources\data\haarcascades,大家可根据自己的安装路径找到)

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训 face_detect.cpp

 运行结果:

  大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

caffe实现人脸检测:

  我是在ubuntu16.04环境下完成的实验,渣渣笔记本有不起GPU跑训练,所有实验也是基于CPU的。要想把人脸检测玩起来,首先你得保证你的ubuntu已经安装了opencv和caffe,初次配这两个环境初学者往往会弄到吐血,而且还是吐老血,我自己已经记不清到底花了多久才把它们搞定(估计是我太怂,也许你很快就能弄好哟,加油)。这里给两个参考链接,opencv在ubuntu下的配置和测试:http://blog.csdn.net/a1429331875/article/details/31539129;ubuntu16.04上caffe的配置与安装(CPU ONLY):http://blog.csdn.net/u010402483/article/details/51506616;以上两个链接仅供参考,配置过程出了问题大家就多去网上搜解决方案吧,总会有人也遇到过和你一样的问题。配置好以后大家可以先跑跑MNIST手写字体识别这个案例吧,这个案例算是给自己的一个安慰。  到这里就已经默认大家环境已经配置好了。

  第一步:(这样写感觉很蠢,但还是写得尽量详细吧)在桌面或者你喜欢的路径下建一个文件夹,这个文件夹将用来存放我们实验中用到的所有东西。我自己是在桌面建了一个文件夹,取名:faceDetect

  第二步:获取人脸和非人脸图片当作训练集和验证集。首先我们一定要有样本,在本实验中我们的样本是一个二分类的样本,大家可以自行去网上找数据集,当然也可以给我发邮件(likai_uestc@163.com),我这里有数据集。数据集我们分训练集(trainData20000_20000)和验证集(testData1600_1600),trainData20000_20000文件夹和testData1600_1600文件夹我们把它们两个都放在faceDetect文件夹下,trainData20000_20000文件夹和testData1600_1600文件夹下又都放两个文件夹face和noface,人脸图片我们放在face文件夹下,非人脸图片我们放在noface文件夹下。此时的目录结构如下:

  大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

  第三步:给样本打标签。本实验中是人脸我们给的标签是1,不是人脸给标签0.训练样本的标签我们写入train.txt,验证样本的标签我们写入test.txt.  train.txt和test.txt文件我们放在faceDetect目录下。 txt文件中的内容如下:

  大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

  生成txt文件的内容的参考代码如下:(仅供参考)

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训 getTxt.cpp

   第四步:制作LMDB数据源。通过shell脚本制作,脚本文件名 face-lmdb.sh,face-lmdb.sh也放在faceDetect路径下。脚本的内容:

  重点关注第5,6,7,9,10,14,16,17,44,45,54,55行。第5第6行就是你faceDetect的路径,第7行是你caffe中tools的路径,第9第10行是训练样本和验证样本的路径,第14行为true表示对图片进行resize操作,第16,17行填写resize的大小,第44行和54行就是填标签文件,第45和55行是生成的lmdb文件存放的文件夹名,这两个文件夹不能自己手动提前建立。

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训 face-lmdb.sh

 

  现在在终端执行 ./face-lmdb.sh 命令即可,执行截图如下:

  大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

  第五步:准备网络模型文件(train.prototxt)及超参数文件(solver.prototxt)。train.prototxt和solver.prototxt文件也放在faceDetect路径下。网络模型各层参数详解及超参数文件详解可参考:https://wenku.baidu.com/view/f77c73d02f60ddccdb38a025.html。

  网络模型文件:

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训 train.prototxt

  超参数文件:

  第1行网络模型文件的路径,第15行训练得到的模型的保存路径,在本实验中自己在faceDetect文件夹下建一个model文件夹用于保存得到的模型文件。net: "/home/kobe/Desktop/faceDetect/train.prototxt"

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

test_iter: 50
test_interval: 500
# lr for fine-tuning should be lower than when starting from scratch
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
# stepsize should also be lower, as we're closer to being done
stepsize: 20000
display: 100
max_iter: 100000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "
/home/kobe/Desktop/faceDetect/model/"

# uncomment the following to default to CPU mode solving

solver_mode: CPU

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

 

   第六步:开始训练。运行train.sh脚本进行训练,train.sh也放在faceDetect路径下。脚本的内容:(根据自己的实际路径进行修改)

1 #!/usr/bin/env sh2 3 /home/kobe/caffe/build/tools/caffe train --solver=/home/kobe/Desktop/faceDetect/solver.prototxt #\4 #--weights=models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel \5 #--gpu 0

 

   在终端中运行 ./train.sh 就可以开始训练了,训练很花时间的,根据机器配置不同所花时间也不同。训练截图如下:

  大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

  训练结束后,我们得到以下的文件(model下的文件),caffemodel结尾的文件就是我们最终需要的文件了:

  大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

 

  第七步:实现多尺度人脸检测。基于滑动窗口的人脸检测,在训练的时候样本已经resize成227*227,所以对于输入图片,我们在输入图片中截取227*227大小的窗口放入模型进行分类,依次这样进行窗口滑动,最终找出其中的人脸区域。但是图片中人脸并不一定就是227*227大小的,所以我们需要进行多尺度变换,所谓多尺度变换就是指对于输入图片我们进行放大和缩小变换,这样输入一张图片,就可以得到很多经过放大或缩小的图片了,把所有图片当作一组输入进行人脸检测。那么现在问题又来了,我们输入的是不同大小的图片,网络中有一个全连接层,全连接层的存在导致输入的图片大小必须一样大小,要解决这个问题我们的解决方法是把全连接层转换成全卷积层(可参考caffe官网进行操作)。

  转换过程中需要用到的两个deploy文件。

  全连接时使用(deploy.prototxt):

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训 deploy.prototxt

   全卷积时使用(deploy_full_conv.prototxt):

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训 deploy_full_conv.prototxt

  全连接转全卷积参考代码:

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训 innerToConv.py

  转换后得到另一个模型(alexnet_iter_50000_full_conv.caffemodel).

  实现多尺度人脸检测代码:

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训 face_detect.py

 

运行结果:

 大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训


http://www.cnblogs.com/418ks/p/7221185.html