人脸检测项目实战--理论篇

来源:互联网 发布:淘宝和天猫区别 编辑:程序博客网 时间: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. 需要三个文件
(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


display: 100  #每迭代100次显示一次loss
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进行训练


(3)网络训练脚本文件train.sh
/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
第二个网络的输入 正样本:第一个网络的正确结果
负样本:第一个网络输出的错误的结果
好处是:可以进一步矫正
原创粉丝点击