DSP

初识人脸识别(1) -- 图像Haar变换

2019-07-13 15:25发布

今天用opencv自带的人脸识别库写了一个人脸检测的代码,但是发现效果并不理想,缺点主要为:暗光条件、侧脸、歪斜等状态下的识别效果比较差。再加上眼睛的识别测试,发现总是把我的鼻孔识别为眼睛...难道我拍照的时候真是用鼻孔看人的吗?于是想了解opencv带的人脸检测代码的原理。 1. Haar-like feature: Haar templates是由Micharel Oren等人在 《Pedestrian Detection Using Wavelet Templates》中提出,其由来是参考Haar wavelets《A Teory for Multiresolution Signal Decomposition: The Wavelet Representation》。Haar特征计算使用三种模板(与Haar小波变换计算本质相同)如图1所示。
图1 Haar模板,a为 vetical ,b为 horizontal ,c为corner
与标准Haar变换不同,为了获取更好的分辨率,M.O. 采用"quadruple density dictionary", 简单来说,标准Haar小波变换是两个小波之间的距离是2^{n},M.O.采用距离为 frac{1}{4}2^{n},从而提高Haar变换细节系数的密度。   举例说明,图2所示,在标准Haar变换中,采用垂直haar模板,将所有像素按模板权值求和,可得到一个细节系数V。
图2 标准Haar特征计算
如果采用可变Haar 模板,则Haar变换如图3所示, Haar 模板大小为2^2 × 2^2, 图像中左上角4×4像素区域进行Haar特征计算可以得到一个系数V1, 小波距离间隔像素2^2个宽度,可以计算得到另一个Haar特征V2。同样模板可以进行竖直方向计算Haar特征,最后得到关于垂直Haar模板的四个特征系数:V1~V4。
图3 level n 的 Haar 特征计算(2^n =4)
采用四密度(quadruple density) Haar特征计算如图4所示,在水平方向,每个小波间隔为frac{1}{4}2^{2} = 1 像素,因此可以得到V1~V5 Haar特征系数,同理,在竖直方向也可以分别得到一系列Haar特征系数,最后得到一个5×5的Haar特征矩阵。改变模板,运用水平模板和对角线模板也可以得到相同维度的Haar特征矩阵。
图4 四密度Haar特征计算
在M.O.文献中,对128×64的行人图像,分别采用32×32 和16×16两种大小的模板,分别得到水平、竖直、对角三种Haar特征矩阵。如图5所示:
图5 
采用不同的模板大小进行haar变换实测,原图如图6所示,分别采用4×4, 8×8, 16×16, 32×32 pixels 模板对图6进行Haar变换,得到结果如图7所示。
图6
图6
图7 采用不同大小Haar模板得到的三种特征
从图7可以看出,采样不同尺度和形状的Haar模板会得到不同的Haar特征,如果将模板的样式增多,模板的大小也增多,同时采用的密度也增大,最后得到的特征数量将变得非常庞大,可以参见相关Haar特征数量计算。因此不得不考虑一个问题,这么多Haar特征怎么计算?