opencv人脸检测
opencv人脸检测

opencv人脸检测

opencv当中有自带的级联分类数据集可用于物体检测。以opencv的Android SDK为例,级联分类器数据集存放在opencv目录下的sdk/etc目录下的haarcascadeslbpcascades,前者是基于haar特征训练得到的分类器,后者是基于lbp特征训练得到的分类器。

文件夹当中有众多的分类器,可以用于检测不同类型的物体。举个例子,像haarcascade_frontalface_alt2.xml这种的就用于检测正面的人脸。

物体特征

物体检测当中的三大特征分别是HOG特征LBP特征Haar特征

HOG特征

HOG全称方向梯度直方图(Histogram of Oriented Gradient, HOG)特征。
该特征的基本思想是:分析每个像素以及其周围的像素,根据明暗度画一个箭头,箭头的指向代表了像素逐渐变暗的方向,如果我们重复操作每一个像素,最终像素会被箭头取代。这些箭头被称为梯度(gradients),它们能显示出图像从明亮到黑暗流动的过程。

hog_directo

也可以将图像分割成16×16像素的小方块。在每个小方块中,计算出每个主方向有多少个剃度(有多少指向上,指向右上,指向右等)。然后用指向性最强的那个方向箭头来代替原来那个小方块。

face_fhog_filters

最终结果,我们把原始图像转换成一个非常简单的HOG表达形式,它可以很轻松的捕获面部的基本结构。

为了在HOG图像中找到脸部,我们需要做的是,与已知的一些HOG图案中,看起来最相似的部分。这些HOG图案都是重其他面部训练数据中提取出来的。

LBP特征

LBP全程Local Binary Pattern,局部二值模式。是一种用来描述图像局部纹理特征的算子,它具有旋转不变性和灰度不变性等显著的优点。

原始的LBP算子定义为在3×3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3×3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。

另外LBP还有几种改进版本,包括圆形LBP算子LBP旋转不变模式LBP等价模式。详见参考文章2和4

显而易见的是,上述提取的LBP算子在每个像素点都可以得到一个LBP“编码”,那么,对一幅图像(记录的是每个像素点的灰度值)提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)。LBP的应用中,如纹理分类、人脸分析等,一般都不将LBP图谱作为特征向量用于分类识别,而是采用LBP特征谱的统计直方图作为特征向量用于分类识别。因为,从上面的分析我们可以看出,这个“特征”跟位置信息是紧密相关的。直接对两幅图片提取这种“特征”,并进行判别分析的话,会因为“位置没有对准”而产生很大的误差。后来,研究人员发现,可以将一幅图片划分为若干的子区域,对每个子区域内的每个像素点都提取LBP特征,然后,在每个子区域内建立LBP特征的统计直方图。如此一来,每个子区域,就可以用一个统计直方图来进行描述;整个图片就由若干个统计直方图组成;

例如:一幅100*100像素大小的图片,划分为10*10=100个子区域(可以通过多种方式来划分区域),每个子区域的大小为10*10像素;在每个子区域内的每个像素点,提取其LBP特征,然后,建立统计直方图;这样,这幅图片就有10*10个子区域,也就有了10*10个统计直方图,利用这10*10个统计直方图,就可以描述这幅图片了。之后,我们利用各种相似性度量函数,就可以判断两幅图像之间的相似性了;

Haar特征

哈尔特征(Haar-like features) 是用于物体识别的一种数字图像特征。它们因为与哈尔小波转换极为相似而得名,是第一种即时的人脸检测运算。因为其满足对称性,因此对人脸这种生物对称性良好的对象特别适合用来做检测。

Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。

对于图中的A, B和D这类特征,特征数值计算公式为:v=Sum白-Sum黑,而对于C来说,计算公式如下:v=Sum白-2xSum黑;之所以将黑色区域像素和乘以2,是为了使两种矩形区域中像素数目一致。 通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。

不同特征可以进行多种组合,生成更加复杂的级联特征,特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和,Haar特征值反映了图像的对比度与梯度变化。

联分类器相当于一个决策树,层级判断,更加准确。

训练的时候用的照片一般都是25*25左右的小图片,所以对于大的人脸,还需要进行多尺度的检测,多尺度检测机制一般有两种策略:
1.不改变搜索窗口的大小,而不断缩放图片,这种方法显然需要对每个缩放后的图片进行区域特征值的运算,类似于制作图像金字塔的流程,效率不高;
2.不断初始化搜索窗口size为训练时的图片大小,不断扩大搜索窗口,进行搜索,解决了第一种方法的弱势。

OpenCV中HAAR特征计算是积分图技术,可以非常快速高效的开窗检测, HAAR级联检测器具备有如下特性:
– 高类间变异性
– 低类内变异性
– 局部强度差
– 不同尺度
– 计算效率高

在Python中使用opencv自带的分类器进行人脸检测

下面的python代码展示了一个简单的人脸检测

import cv2 as cv
img = cv.imread("face.jpg")#读入图像
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)#转为灰度图
classifier = cv.CascadeClassifier("E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml")#加载分类器
face = classifer.detectMultiScale(gray)#使用分类器进行检测
for x,y,w,h in face#绘制出检测到的区域
    cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
cv.imshow("result",img)#展示图片
cv.waitKey(0)
cv.destoryAllWindows()

最终结果如下:

参考文章

1.一天搞定人脸识别项目!学不会up直接下跪!(python+opencv)_哔哩哔哩_bilibili
2.图像特征提取三大法宝:HOG特征,LBP特征,Haar特征 – 米罗西 – 博客园 (cnblogs.com)
3.OpenCV人脸检测-Haar级联和LBP – 知乎 (zhihu.com)
4.HOG、LBP 和 Haar 三大特征 – 知乎 (zhihu.com)
5.openCV学习笔记(九) —— 人脸检测_tiankong19999的博客-CSDN博客
6.深入浅出人脸识别原理 · Martin’s Blog (dxyoo7.github.io)

0 0 投票数
打个分吧!
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x