seetaface 人脸检测算法简析

一、前言

    使用opencv的lbp人脸检测算法准确率、误检率表现均不是很好,另外算法需跑在ARM上,虽然深度学习一些算法如mtcnn效果很好,但速度很难保证。最终,查阅了seetaface的人脸检测算法论文及源码,并做记录总结于此。


二、算法思想概述

    整个算法框架是呈漏斗型的,即先用计算量小的特征、分类方式快速过滤大量非人类窗口(图像上滑窗),然后用复杂特征、分类方式逐层筛选人脸。需要注意的是,论文上描述的是3个特征、3个分类模型(特征:LAB、SURF、SIFT,分类:boosted、MLP、MLP);而github上的源码并没有用到SIFT,最后几个MLP模型使用的都是SURF特征,MLP的输入维数分别为128、256、512,一共是4个分类模型(特征:LAB、SURF、SURF、SURF,分类:boosted、MLP-128、MLP-256、MLP-512)。

    算法框架看起来并没有什么新意,都是用判别能力较弱、速度快的模型快速过滤掉大量非人脸,后采用精度更高、计算量大的模型。并且第一层特征LAB实际上就是opencv中的MB-LBP特征,只是LAB的lbp特征cell宽高都是固定3x3像素,opencv的MB-LBP特征cell有多种宽高。


三、算法步骤

    主要描述源码的算法步骤,github上seetaface的模型参数文件seeta_fd_frontal_v1.0.bin中保存了算法用到的所有参数,包括LAB特征位置、boosted权重/阈值、MLP权重/偏置。

    1.第一层LAB boosted分类模型

        1)一共有左侧脸、正脸、右侧脸三个LAB boosted模型。即有三份不同的特征、权重、阈值参数。

        2)每个LAB boosted模型中,包括150个弱分类器。可以理解为,40x40的滑窗中,不考虑边界情况共有1600个点,选取其中150个作为LAB特征的计算起点;每个LAB特征为9x9像素,3x3cell,cell宽高是3x3像素,计算输出为0~255;每个计算输出值对应一个累计权重值,用于分类器判断。因此,一个LAB boosted模型的参数为Point feat_[150],float thresh_[150],float weight_[150][256]。

       3)LAB的计算与opencv的稍有差异,在于lbp的9个顺序不一样、判断符号为大于等于号。

       4)弱分类器工作时,以10个为一组进行权重值累计,如果小于对应的累加权重值,则为非人脸窗口,继续下一个滑窗判断;如果15次累加结束(即150个弱分类器),大于对应的权重值,则判断为人脸窗口。


    2.第二~四层SURF MLP分类模型

      1)一共有三个SURF MLP分类模型,每个模型在SURF窗口数、MLP神经网络层数、权重/偏置参数有不同,体现在模型文件中。

      2)SURF特征,均是2x2的cells,但特征的宽高比有5种(1:1 1:2 2:1 2:3 3:2)。比如(0,0,16,16)为1:1、(0,0,32,16)为2:1。每个cells计算得到8维数据[dx+、|dx|+、dx-、|dx|-、dy+、|dy|+、dy-、|dy|-],2x2cells即为2x2x8=32维数据,因此一个SURF特征为32维数据。三个模型在每个40x40滑窗中分别需计算4、8、16个SURF特征,即对应MLP的输入位数4x32=128、8x32=256、16x32=512。

      3)MLP的使用激活函数均为Relu,最后一层激活函数为Sigmoid。

      4)MLP输出结果为4维数据,0:score, 1:x回归,  2:y回归, 3:w/h回归。 所有MLP模型score > 0.5,且经过NMS后score累加大于默认阈值2,才判断为人脸。(可以理解为NMS前,这个位置至少要有3个窗口叠加,单个人脸窗口score一般为0.9多)


    3.NMS非极大值抑制

       1)nms主要根据设置iou值(重叠区域/合并区域)来判断两个区域是否需合并。
       2)首先,先按score对人脸位置队列排序,高分放在最前面。并设置一个标记位mask_merged来判断对应区域是否已被合并。
       3)遍历人脸位置队列,分别与后面mask_merged为0的区域进行判断,如果重叠比例大于设定的iou值,则累加score,并将被合并的区域标记位置1。
       4)nms实际是根据iou值删除需被合并的人脸位置。






你可能感兴趣的:(seetaface 人脸检测算法简析)