人脸检测项目实战--理论篇
来源:互联网 发布:淘宝和天猫区别 编辑:程序博客网 时间:2024/05/18 02:20
人脸检测的目的:准确的定位人脸位置。挑战? 1.遮蔽 2.扭曲现象 3.光照
(一): Benchmark:
找Benchmark,看上面论文,找出来那么两篇作为参考(最近发表)
人脸检测的Benchmark :FDDB(Benchmark之一)
(二):数据
1数据收集:
(1)Benchmark(数据库) AFLW FDDB
(2)最新论文(2016)
(3)Thinkface论坛
2.数据量:庞大数据量支撑(可以融合不同数据库的数据)
数据库中的图片是包含人脸的图片类似测试图片,其中给出了人脸区域位置。我们要做的工作是裁剪出人脸图片作为正样本,背景图片作为负样本,正负样本数量相同总数不少于1万张图片。下面是数据库中的图片及其给定的人脸坐标。
xxxxx.jpg x1,y1,x2,y2
xxxxx.jpg x1,y1,w,h
需求:正负样本
做法:这对有遮蔽的人脸具有较好的鲁棒性,构造具有挑战的样本
IOU(重叠率) >0.7当做正样本
IOU(重叠率) <0.3当做负样本
推荐负样本的时候找一个物体检测数据集,随便截只要没有人脸
(三):选择一个卷积神经网络
Alexnet VGG 推荐使用:VGG
Caffe model zoo,通过论文找到合适的网络。
训练网络:Caffe
写一个网络配置文件:复制一份过来,然后从底到上去书写网络的结构,按自己的想法
去修改卷积结构的配置。
(四)制作LMDB格式数据:
第一部:train.txt(训练集) val.txt(验证集)
Caffe 命名习惯:标定Label 从0开始 不同名字文件夹下(相当于类别)装着自己的数据(参考另一篇博客)
Train.txt 1/23039_nonface_0image30595.jpg 1
Val.txt 39830_nonface_0image49143.jpg 1
做好两个TXT 两个文件夹(分别存T和V的数据)然后调用脚本制作LMDB
#sh face-lmdb.sh
数据增强做法:opencv做一个仿射变换
LMDB 目前是只支持单label(分类问题)
HDF5 支持多label(回归问题)
(1)网络结构 :train.prototxt
(2)超参数配置 solver. prototxt
net: "/home/admin01/51CTO/train-face/train.prototxt"
test_iter: 100 #测试的时候需要迭代的次数,test_iter*bach_size>=val总数
test_interval: 500 #每训练迭代多少次后进行一次测试。caffe是边训练边测试的,测试的作用是观察loss变化确认网络是否收敛。
gamma: 0.1
max_iter: 100000 #训练集的最大迭代次数
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000 #每迭代10000次保存下一模型
snapshot_prefix: "/home/admin01/51CTO/train-face/model/" #模型的保存路径
/home/matt/Documents/caffe/build/tools/caffe
train --solver=/home/admin01/51CTO/train-face/solver.prototxt #\
--weight 网络的微调,在使用别人训练好的网络时用到
准备好这三个文件后就可以训练网络:sh train.sh
2.如果发生过拟合现象:
*调节学习率 适当降低
*增大batch_size
*增大dropout比例
3.用不同的学习率去调节网络使得最终的test loss能达到最小。
4.保存模型的时候,记录不同保存的模型的loss值,保存最好的那个待用
(六)利用训练好的网络(测试网络)
1.必要的依赖:numpy :矩阵运算库 Opencv:图像处理库 Caffe:核心迭代计算
2.Deploy.prototxt:使用网络的时候需要配置的文件。用于指定输入的图片格式。
input: "data"
input_dim: 1(输入图片个数)
input_dim: 3(图片的通道数)
input_dim: 227(图片的长
input_dim: 227 和宽)
3.测试代码详解
第一步:导入训练好的模型(caffemodel)和deploy文件(Deploy.prototxt)
第二步:对图像做scale变换构建图像金字塔,获取不同感受野与特征图目的是检测出不同尺度的人脸大小。
第三步:模仿Caffe官网的例子,对数据层做初始化操作
第四步:前往传播一次,走一遍训练好的网络 得到OUT,这个OUT就是代表了所有层的结果数据,选择需要的层的结果数据。
第五步:利用特征图结果,遍历特征图上所有点(对应于原始输入图像的一部分),设定一个阀值(0.95),找到所有可能的区域(大于阀值的区域),作为候选框。
第六步:非极大值抑制(NMS)
第七步:候选框画出来
缺点:速度慢,因为做了SCALE变换以及使用ALEXNET网络本身就比较大
改进的做法:找一些发的比较好的论文
思想1:Cascade (很重要!)
级联几个小的网络,每个网络的输入时前一个网络的输出。
思想2:calibration
输出的结果进行一个微调的操作(45分类),对于X,Y,S要进行一个整体的变换。
思想3:hard mining
第二个网络的输入 正样本:第一个网络的正确结果
负样本:第一个网络输出的错误的结果
好处是:可以进一步矫正
(一): Benchmark:
找Benchmark,看上面论文,找出来那么两篇作为参考(最近发表)
人脸检测的Benchmark :FDDB(Benchmark之一)
(二):数据
1数据收集:
(1)Benchmark(数据库) AFLW FDDB
(2)最新论文(2016)
(3)Thinkface论坛
2.数据量:庞大数据量支撑(可以融合不同数据库的数据)
数据库中的图片是包含人脸的图片类似测试图片,其中给出了人脸区域位置。我们要做的工作是裁剪出人脸图片作为正样本,背景图片作为负样本,正负样本数量相同总数不少于1万张图片。下面是数据库中的图片及其给定的人脸坐标。
xxxxx.jpg x1,y1,x2,y2
xxxxx.jpg x1,y1,w,h
需求:正负样本
做法:这对有遮蔽的人脸具有较好的鲁棒性,构造具有挑战的样本
IOU(重叠率) >0.7当做正样本
IOU(重叠率) <0.3当做负样本
推荐负样本的时候找一个物体检测数据集,随便截只要没有人脸
(三):选择一个卷积神经网络
Alexnet VGG 推荐使用:VGG
Caffe model zoo,通过论文找到合适的网络。
训练网络:Caffe
写一个网络配置文件:复制一份过来,然后从底到上去书写网络的结构,按自己的想法
去修改卷积结构的配置。
(四)制作LMDB格式数据:
第一部:train.txt(训练集) val.txt(验证集)
Caffe 命名习惯:标定Label 从0开始 不同名字文件夹下(相当于类别)装着自己的数据(参考另一篇博客)
Train.txt 1/23039_nonface_0image30595.jpg 1
Val.txt 39830_nonface_0image49143.jpg 1
做好两个TXT 两个文件夹(分别存T和V的数据)然后调用脚本制作LMDB
#sh face-lmdb.sh
数据增强做法:opencv做一个仿射变换
LMDB 目前是只支持单label(分类问题)
HDF5 支持多label(回归问题)
(五):网络的训练
(1)网络结构 :train.prototxt
(2)超参数配置 solver. prototxt
net: "/home/admin01/51CTO/train-face/train.prototxt"
test_iter: 100 #测试的时候需要迭代的次数,test_iter*bach_size>=val总数
test_interval: 500 #每训练迭代多少次后进行一次测试。caffe是边训练边测试的,测试的作用是观察loss变化确认网络是否收敛。
base_lr: 0.001
#base_lr是适用于所有层的学习率,而针对单个层,可以通过增加两个blobs_lr,用来调整该层的学习率.
一个调整weight的学习率,一个是调整偏执b的学习率。那么该层的学习率就变成了,base_lr*blobs_lr,base_lr*blobs_lr了。
base_lr用于设置基础学习率,在迭代的过程中,可以对基础学习率进行调整。怎么样进行调整,就是调整的策略,由lr_policy来设置。
lr_policy: "step"gamma: 0.1
stepsize: 20000
max_iter: 100000 #训练集的最大迭代次数
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000 #每迭代10000次保存下一模型
snapshot_prefix: "/home/admin01/51CTO/train-face/model/" #模型的保存路径
# solver_mode: CPU #使用cpu进行训练
/home/matt/Documents/caffe/build/tools/caffe
train --solver=/home/admin01/51CTO/train-face/solver.prototxt #\
--weight 网络的微调,在使用别人训练好的网络时用到
准备好这三个文件后就可以训练网络:sh train.sh
2.如果发生过拟合现象:
*调节学习率 适当降低
*增大batch_size
*增大dropout比例
3.用不同的学习率去调节网络使得最终的test loss能达到最小。
4.保存模型的时候,记录不同保存的模型的loss值,保存最好的那个待用
(六)利用训练好的网络(测试网络)
1.必要的依赖:numpy :矩阵运算库 Opencv:图像处理库 Caffe:核心迭代计算
2.Deploy.prototxt:使用网络的时候需要配置的文件。用于指定输入的图片格式。
input: "data"
input_dim: 1(输入图片个数)
input_dim: 3(图片的通道数)
input_dim: 227(图片的长
input_dim: 227 和宽)
3.测试代码详解
第一步:导入训练好的模型(caffemodel)和deploy文件(Deploy.prototxt)
第二步:对图像做scale变换构建图像金字塔,获取不同感受野与特征图目的是检测出不同尺度的人脸大小。
第三步:模仿Caffe官网的例子,对数据层做初始化操作
第四步:前往传播一次,走一遍训练好的网络 得到OUT,这个OUT就是代表了所有层的结果数据,选择需要的层的结果数据。
第五步:利用特征图结果,遍历特征图上所有点(对应于原始输入图像的一部分),设定一个阀值(0.95),找到所有可能的区域(大于阀值的区域),作为候选框。
第六步:非极大值抑制(NMS)
第七步:候选框画出来
缺点:速度慢,因为做了SCALE变换以及使用ALEXNET网络本身就比较大
改进的做法:找一些发的比较好的论文
思想1:Cascade (很重要!)
级联几个小的网络,每个网络的输入时前一个网络的输出。
思想2:calibration
输出的结果进行一个微调的操作(45分类),对于X,Y,S要进行一个整体的变换。
思想3:hard mining
第二个网络的输入 正样本:第一个网络的正确结果
负样本:第一个网络输出的错误的结果
好处是:可以进一步矫正
阅读全文
0 0
- 人脸检测项目实战--理论篇
- 人脸检测项目实战--实战篇
- 人脸检测实战①
- ROS实战之人脸检测
- [项目实战]信号强度检测app
- UI设计培训-理论授课+上机实战+项目实习
- 人脸检测和识别 源代码 下载-opencv3+python3.6完整实战项目源代码 识别视频《欢乐颂》中人物
- android性能优化实战理论篇
- 【项目基础】SSO理论篇
- Android实战技巧之三十:人脸检测-静态
- Android实战技巧之三十:人脸检测-静态
- 基础、理论、实践、实战
- OpenCV项目实战机器视觉之零件缺陷检测(1)
- 【项目基础】容器、AOP理论篇
- shiro入门实战笔记(1)--理论篇
- 实用嵌入式C Linux程序设计从入门到精通(理论讲解+实际演示+项目实战)
- Code Review理论与实战
- 实战分析江恩理论
- 测鬼记(上)——女人(九)
- 20171009心情总结
- JavaScript框架之AngularJS学习——表单校验
- 二进制、十进制和十六进制转换
- javascript开发:AMD与CMD的本质区别分析
- 人脸检测项目实战--理论篇
- 线段树模板(点修改)
- 测鬼记(上)——回岗(十)
- 304不锈钢缸筒毛坯Halcon测量效果
- 6.5OpenCV漫水填充
- Cocos2dx3.2学习准备(一):C++11新特性
- myeclipse2014破解步骤
- java.lang.IllegalStateException: Cannot create a session after the response has been committed
- bzoj 3462: DZY Loves Math II 动态规划+组合数