After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 6.6 KiB |
After Width: | Height: | Size: 9.3 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 7.2 MiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 6.3 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 9.9 KiB |
@ -0,0 +1,110 @@
|
||||
# 6.2.2 人脸位置检测
|
||||
|
||||
`OpenCV`的人脸检测,使用`Harr分类器`。该分类器采用的`Viola-Jones人脸检测算法`。它是在 `2001`年由`Viola`和`Jones`提出的基于机器学习的人脸检测算法。
|
||||
|
||||
算法首先需要大量的积极图片(包含人脸的图片)和消极图片(不包含人脸的图片)。然后从中提取类`Harr特征( Harr-like features)`,之所以称为`Harr`分类器,是正是因为它使用了类`Harr`特征。最后,训练出一个级联检测器,用其来检测人脸。
|
||||
|
||||
## 类Harr特征
|
||||
|
||||
图像中的特征通常是指,图片的像素点经过一系列的运算之后得到的结果,这些结果可能是向量、矩阵和多维数据等等。类`Harr`特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。
|
||||
|
||||
## Harr特征类别
|
||||
|
||||
它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑色两种矩形框组成为特征模板。
|
||||
|
||||
`1`.边缘特征
|
||||
|
||||
![](8.jpg)
|
||||
|
||||
`2`.线性特征
|
||||
|
||||
![](9.jpg)
|
||||
|
||||
`3`.中心特征和对角线特征
|
||||
|
||||
![](10.jpg)
|
||||
|
||||
## 特征值计算
|
||||
|
||||
特征模板的特征值计算的方式,是用黑色矩形像素总和的均值减去白色矩形像素总和的均值。
|
||||
|
||||
$$ \Delta = \frac{1}{n}\sum_{dark}^{n}I(x)-\frac{1}{n}\sum_{white}^{n}I(x) $$
|
||||
|
||||
例如,对于`4x4`的像素块。
|
||||
|
||||
理想情况下,黑色和白色的像素块分布如下:
|
||||
|
||||
![](11.jpg)
|
||||
|
||||
符合边缘特征的情况(`a`)。
|
||||
|
||||
但是通常情况,一张灰阶照片的黑白分布并非如此的明显,例如:
|
||||
|
||||
![](12.jpg)
|
||||
|
||||
根据公式,第一张图特征值为`1`,第二张图特征值为`0.75-0.18=0.56`。
|
||||
|
||||
一张图中,对于识别人脸,只有部分特征是有效的。例如,用下图中的特征模板可以看出,眉毛区域比额头要亮,鼻梁区域比眼镜区域要亮。嘴唇区域比牙齿区域要暗。这样的类`Harr`特征能很好的识别出人脸。
|
||||
|
||||
![](13.jpg)
|
||||
|
||||
为简化特征值计算,可以使用积分图算法。得到类`Harr`特征后,使用`AdaBoost`的方法选择出有效特征。最后再使用瀑布型级联检测器提高检测速度。其中,瀑布的每一层都是一个由`Adaboost算法`训练得到的强分类器。
|
||||
|
||||
`Harr`人脸检测一个简单的动画过程如下:
|
||||
|
||||
![](14.gif)
|
||||
|
||||
红色的搜索框不断移动,检测出是否包含人脸。一般来说,输入的图片会大于样本,为了检索出不同大小的目标,分类器可以按比例的改变自己的尺寸,对输入图片进行多次的扫描。
|
||||
|
||||
## 训练Harr分类器
|
||||
|
||||
训练`Harr`分类器的主要步骤如下:
|
||||
|
||||
- 搜集制作大量的“消极”图像
|
||||
- 搜集制作大量“积极”图像,确保这些图像中包含要检测的对象
|
||||
- 创建“积极”向量文件
|
||||
- 使用`OpenCV`训练`Harr`分类器
|
||||
|
||||
因为训练需要花费较多的资源和时间,所以我们学习时,先使用`OpenCV`中已经训练好的`Harr`分类器。
|
||||
|
||||
## 使用Harr分类器检测人脸
|
||||
|
||||
声明分类器:
|
||||
|
||||
CascadeClassifier(模型文件路径)
|
||||
|
||||
调用分类函数:
|
||||
|
||||
|
||||
detectMultiScale(图片对象,scaleFactor, minNeighbors, minSize)
|
||||
|
||||
参数说明:
|
||||
|
||||
1. 图片对象:待识别图片对象;
|
||||
2. `scaleFactor`:图像缩放比例;
|
||||
3. `minNeighbors`:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太小而导致遗漏;
|
||||
4. `minSize`:特征检测点的最小尺寸,可选参数。
|
||||
|
||||
示例如下:
|
||||
|
||||
```
|
||||
import numpy as np
|
||||
import cv2 as cv
|
||||
# 读取图片
|
||||
img = cv.imread('face.jpg')
|
||||
# 转换为灰度图片
|
||||
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
|
||||
# 人脸检测器
|
||||
face_cascade = cv.CascadeClassifier('Harrcascade_frontalface_default.xml')
|
||||
|
||||
# 识别人脸
|
||||
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
|
||||
|
||||
for (x,y,w,h) in faces:
|
||||
print(x,y,w,h)
|
||||
```
|
||||
|
||||
其中,图片坐标系以左上角为原点,`x,y`代表人脸区域左上角坐标,`w`代表宽度,`h`代表高度。
|
||||
|
||||
![](14.jpg)
|
||||
|