人脸检测

目的:检测到人脸框
Tensorflow源码:

  1. 数据:二分类数据(人脸,非人脸)
    人脸:路径/xxx.jpg (60,80,280,320)
    非人脸:只要不是人脸,都是非人脸数据
  2. 人脸数据从哪来?
    (1)benchmark是一个行业基准数据库,有很多论文及源码可供参考 http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/
    (2)找一些优秀论文,实验部分通常会介绍使用的数据集,公开数据集可以下载。申请数据集的时候,最好使用学校的邮箱。
    (3)论坛或者交流社区,thinkface等
    (4)数据规模越大越好,2w~3w
  3. 正负样本裁剪
    对于正样本:裁剪的操作,根据标注的坐标把人脸裁剪出来。可以用opencv来完成制作人脸数据。
    注意:裁剪之后的数据可能还有问题,如两张人脸在一张图中,将这些数据剔除,这个过程通常是人工操作。
    对于负样本:在原始图像上随机截取图框,使其与人脸区域的重叠率小于30%。
    这里引入概念IOU(intersection of union) ,即在图像上选取的图像区域与人脸图像的重叠率:
    IOU<0.3作为负样本
    IOU>0.7作为正样本
    0.3<IOU<0.7的区域有可能干扰分类结果,要剔除

注意:由于人脸数据集有可能包含多张人脸,因此用人脸数据集采集到的负样本仍然有可能包含人脸信息,解决方法是选用不包含人脸数据的数据集采集负样本。

  1. 本程序采用Caffe实现,首先要制作LMDB数据源
    制作方法:train(0和1),val两个文件夹用于存放图片数据,由于该任务为二分类任务,因此每个文件夹下只包含两个子文件夹,如果是做多分类任务,则要包含多个子文件夹。train.txt指定到train文件夹下,里面包含每个图片的数据的路径及类别,如0/xxx.jpg 0。val.txt指定到val文件夹下,里面包含图片数据的路径及label,如xxx.jpg 1。

  2. 制作LMDB数据源需要用Caffe提供的脚本文件。a. 修改face-lmdb.sh文件夹中的内容,指定数据路径。b. 由于裁剪完的图像大小不一,而网络的输入是固定的,因此需要对图像进行resize操作。由于本文使用AlexNet,因此图片要resize成227*227。c. 该文件中还注明了txt文件的位置。d. 同时该文件夹中还指明了生成数据源的名字。
    Ps: 使用LMDB多用于制作分类问题的数据源,而对于回归等多label问题,则需要使用HDF5制作数据源。

EXAMPLE=/home/popzq/train-face
DATA=/home/popzq/train-face
TOOLS=/home/popzq/caffe/build/tools #Caffe tools安装路径

TRAIN_DATA_ROOT=/home/popzq/train-face/train/
VAL_DATA_ROOT=/home/popzq/train-face/val/
#注意train和val数据源信息都要修改
GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $TRAIN_DATA_ROOT \
    $DATA/train.txt \     #train.txt文件路径
    $EXAMPLE/face_train_lmdb  #生成lmdb数据源的文件名
  1. 训练网络
    本文使用AlexNet,该网络结构本文不再详细描述。由于本文是一个二分类问题,因此要把最后一层全连接改成要分类的个数。
    在train.prototxt中编写网络结构和数据信息。Ps: 在该文件中定义的learning rate是指learning rate的倍数,该参数需要与solver文件中的学习率相乘。
    在solver.prototxt: test_iter设置一次测试时要测试多少个batch,最好test_iter*batch_size=测试集中样本个数。Base_lr基础学习率,不能太大,否则模型无法收敛。
    开始训练模型,在train.sh中设置:

/home/popzq/caffe/build/tools/caffe train --solver=/home/popzq/train-face/solver.prototxt #使用caffe tool中的train工具进行训练,solver指定solver文件的位置

  1. 网络训练的速度跟什么相关
  • 网络的模型大小,网络越大,速度越慢
  • 数据输入的大小,输入越大,速度越慢,输入对最终结果的影响非常大
  1. 运行时发现过拟合或者loss不再下降如何修改?
    首先检查数据是否正常,再检查模型有没有问题,最后检查超参数配置。
  2. 提取人脸数据,采用滑动窗口策略,在原始区域上扫描提取人脸数据。由于人脸数据的大小可变,因此要采用多scale变幻,即对原始图像进行多尺度变幻,形成一个图像金字塔,然后用227227的滑动框逐个寻找人脸。由于scale是不同大小的,因此要将全连接层换成11的全卷积层。
  3. 如何用代码完成多尺度人脸检测
    (1)model转换成全卷积
    (2)多个scale
    (3)前向传播,得到特征图,概率值矩阵
    (4)反变换,映射到原图上的坐标值
    (5)NMS非极大值一致,从多个重叠的人脸框选出概率最大的人脸区域
  4. 问题,速度太慢。
    原因:选取了多个scale,每个scale都进行了一次前向传播
    解决方法:使用几个级联的model,每个model输入一个小分辨率的输入,再加上矫正网络解决人脸框偏移的问题。
  5. 如何提高精度???
    (1)选择一个更深的网络,如把AlexNet用VGG19替换
    (2)进行数据增强,对原始图像进行偏移、翻转等,来达到增加数据量的目的。Keras提供了一个函数可以轻易达到数据增强的目的。
    (3)最优质可能在网络中间层产生,选取中间层网络模型的参数进行网络权重初始化,再选取更小的学习率进行微调。
  6. 模型评估(方法多样)
    IOU,模型截取的人脸图像与人工标注的人脸的重叠率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值