人脸识别
最近无人机很火爆,使用无人机可以到处装逼,看着的确高大尚。不能放过这个装逼机会。 近期与同学做了一个基于四轴飞 行器的人脸追踪项目,简单来说就是通过安装在云台上的摄像机获取 图像,然后使用人脸检测与识别算法在图像中定位目标 人物所在位置,有了位置的反馈信息就能够 自动控制飞行器的飞行了。在这个项目中我主要负责的是人脸识别的部分,飞行 器控制部分则由另外 一个组员负责,我们分工很明确,各有所长,绝佳搭配啊。
这次主要完成人脸检测与人脸识别两个任务,人脸检测使用的是基于 haar-like 特征的级联检测算法, 人脸识别则使用 eigen face、fisher face 和 LBPH 算法。下面介绍下各个算法的细节。
人脸检测:haar-like 特征
人脸检测简单来说就是在一幅图像中确定人脸所在位置(如果有的话),换句话来说其实也就是给定一个 区域,判断该区域是人脸还是背景。所以人脸检测也是个 binary classification 问题。 这样一来问题就变得比较清晰了,要做分类问题必须要获得描述对象的特征,好的特征对于分类任务是 极其重要的。好在这些都有前人帮我们铺好路了,Paul Viola and Michael Jones 2001 年在他们的论文 Rapid Object Detection using a Boosted Cascade of Simple Features 中提出了一种 基于 haar-like 特征的高效物体检测算法,提出的 haar 特征如下图。之后 Rainer Lienhart 和 Jochen Maydt 对这一 特征进行了拓展,得到性能更好的分类器,拓展 haar-like 特征 。Haar 特征和卷积核很像,每 个特征值都是白色矩形框内的像素 之和减去黑色矩形框内像素之和。具体可参考 opencv 官方教程 。
人脸识别:LBPH
人脸识别也是一个分类任务,给定一幅人脸图像,判断该图像中人物是谁。那么我们该如何用数 学语言来描述人脸呢?也就是人脸图像的特征向量如何计算得到,这次项目使用的是 LBP 特征。最初 LBP 特征 是 Ojala 等人在论文 A comparative study of texture measures with classification based on featured distributions 中提出的,这种特征对于纹理的描述非常有效,其显著优点是对关照不敏感。 LBP 是定义在像素 3x3 邻域内的,以邻域中心像素为阈值,将相邻的 8 个像素的灰度值与其进行比较, 若周围像素值大于中心像素值,则该像素点的位置被标记为 1,否则为 0。这样,3x3 邻域内的 8 个点经比较可产生 8 位二进制数(通常转换为十进制数即 LBP 码,共 256 种),即得到该邻域中心像素点的 LBP 值, 并用这个值来反映该区域的纹理信息。具体如下图所示:
更加形式化的描述如下:
\begin{equation} LBP(x_c,y_c) = \sum_{p=0}^{p-1}2^ps(i_p,i_c) \end{equation}其中\((x_c,y_c)\)代表 \(3\times3\) 邻域的中心元素,像素值为\(i_c\),邻域的其他像素值为 \(i_p\),\(s(x)\)是符号 函数,定义如下:
基本的 LBP 算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。 为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ahonen 等在论文 Face recognition with local binary patterns 中对 LBP 算子进行了改进,将 \(3\times3\) 邻域扩展到任意邻 域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。 从而得到了诸如半径为 R 的圆形区域内含有 P 个采样点的 LBP 算子。 对于一个给定邻域中心点\((x_c,y_c)\),其邻域采样点的位置通过以下公式计算得到: \begin{eqnarray} x_p = x_c + R \cos(\frac{2\pi p} {P})\\ y_p = y_c + R \sin(\frac{2\pi p}{P}) \end{eqnarray}其中\(R\)是圆半径,\(P\)为采样点数,\(p \in P\)。