在本教程中,我们将看到如何使用OpenCV和Dlib在Python中创建和启动人脸检测算法。
我们还将添加一些功能,以同时检测多张脸上的眼睛和嘴巴。本文将介绍人脸检测的最基本实现,包括级联分类器,HOG窗口和深度学习CNN。
我们将使用以下内容介绍人脸检测:
使用OpenCV的Haar级联分类器
使用Dlib的定向梯度直方图
使用Dlib的卷积神经网络
可以在这里找到本文的Github存储库
介绍
我们将使用OpenCV,这是一个用C / C ++编写的用于计算机视觉的开源库,它具有C ++,Python和Java的接口。它支持Windows,Linux,MacOS,iOS和Android。我们的某些工作还需要使用Dlib,这是一种现代C ++工具箱,其中包含机器学习算法和用于创建复杂软件的工具。
要求
第一步是安装OpenCV和Dlib。运行以下命令:
pip install opencv-python
pip install dlib
根据您的版本,文件将安装在这里:
/usr/local/lib/python3.7/site-packages/cv2
导入和建模路径
我们将创建一个新的Jupyter笔记本/ python文件,并开始于:
import cv2
import matplotlib.pyplot as plt
import dlib
from imutils import face_utils
font = cv2.FONT_HERSHEY_SIMPLEX
I.级联分类器
首先,我们将探索级联分类器。
I.1。理论
级联分类器,即具有类似哈尔特征的增强分类器的级联,是合奏学习的一种特殊情况,称为增强。它通常依赖于Adaboost分类器(以及其他模型,例如Real Adaboost,Gentle Adaboost或Logitboost)。
级联分类器在包含我们要检测的对象的图像的数百个样本图像以及不包含这些图像的其他图像上训练。
我们如何检测面部是否存在?有一种称为Viola–Jones对象检测框架的算法,其中包括活脸检测所需的所有步骤:
Haar特征选择,源自Haar小波的特征
创建完整的图像
Adaboost培训
级联分类器
原始论文发表于2001年。
I.1.a.Haar特征选择
我们在最普通的人脸上发现一些共同的特征:
与上颊比较黑眼圈
与眼睛相比,鼻梁区域明亮
眼睛,嘴巴,鼻子的某些特定位置…
这些特征称为Haar功能。特征提取过程如下所示:
哈尔功能
在此示例中,第一个特征测量的是眼睛区域和上颊之间的强度差。通过将黑色区域中的像素相加,然后减去白色区域中的像素,可以简单地计算出特征值。
然后,我们将此矩形作为卷积核应用到整个图像上。为了详尽无遗,我们应该应用每个内核的所有可能的尺寸和位置。一个简单的24 * 24图像通常会产生超过160’000个特征,每个特征都由像素值的总和/相减构成。对于活脸检测在计算上将是不可能的。那么,我们如何加快这一过程呢?
一旦用矩形标识了好区域,就无法在完全不同的图像区域上运行窗口。这可以通过Adaboost实现。
使用积分图像原理计算矩形特征,速度更快。我们将在下一部分中对此进行介绍。
有几种类型的矩形可用于Haar特征提取。根据原始文件:
二矩形特征是两个矩形区域内像素之和之间的差,主要用于检测边缘(a,b)
三矩形功能可计算从中心矩形的总和中减去两个外部矩形之和,主要用于检测线(c,d)
四矩形功能可计算矩形(e)的对角线对之间的差
哈尔矩形
现在已经选择了特征,我们将使用Adaboost分类将它们应用到训练图像集上,该分类结合了一组弱分类器以创建准确的集成模型。使用200个功能(最初不是160,000个功能),可以达到95%的精度。该论文的作者选择了6’000个特征。
I.1.b.整体形象
以卷积核样式计算矩形特征可能很长,也很长。因此,作者Viola和Jones提出了图像的中间表示形式:积分图像。积分图像的作用是仅使用四个值就可以简单地计算任何矩形和。我们将看看它是如何工作的!
假设我们要确定坐标为(x,y)的给定像素处的矩形特征。然后,在给定像素上方和左侧的像素之和中的像素积分图像。
其中ii(x,y)是积分图像,而i(x,y)是原始图像。
计算整个积分图像时,有一种形式的重复发生,只需要对原始图像进行一次遍历。实际上,我们可以定义以下几对重复:
其中s(x,y)s(x,y)是累积行总和,并且s(x-1)= 0,ii(-1,y)= 0。
那有什么用呢?好吧,考虑一个我们想要估计像素之和的区域D。我们还定义了其他3个区域:A,B和C。
点1处的积分图像的值是矩形A中像素的总和。
点2的值为A + B
点3的值为A + C
点4的值为A + B + C +D。
因此,可以简单地将区域D中的像素之和计算为:4 + 1-(