如今,计算机视觉在机器学习和深度学习中风靡一时。该领域最简单的应用是人脸检测。
这就是我们将在这里讲解的内容。但是在开始之前,让我们看一下两个实际的用例:
1. 使汽车更安全。世界各地的汽车制造商,都越来越关注使汽车更具个性和安全性,以供驾驶员驾驶。在尝试构建更智能的汽车功能时,制造商可以使用AI/ML帮助他们更好地理解人类的情感。使用面部检测智能汽车可以在驾驶员疲劳时向驾驶员发出警报。
与驾驶有关的错误导致大约95%的致命道路事故。面部情绪检测可以发现睡意之前面部微表情的细微变化,并向驾驶员发送个性化警报,要求驾驶员停车休息、改变音乐或改变温度等。
2.面试中的面部情绪检测。候选人与面试者之间的互动会受到太多类别的判断和某种误解的影响。这种判断使得很难确定候选人是否真的适合这份工作。由于语言解释,认知偏见和介于两者之间的多层语言,因此无法确定候选人要传达的内容。这就是AI的用武之地,它可以测量候选人的面部表情以捕获他们的情绪并进一步评估其人格特质。
通过保持并记录工作中的互动,也可以使用该技术来感知员工的情绪。作为人力资源工具,它不仅可以帮助制定招聘策略,还可以帮助设计可以使员工获得最佳绩效的人力资源政策。
正如我们已经看到的面部检测技术如何有效地帮助做出更好的决策一样,让我们深入研究并了解什么是面部检测以及如何创建可以检测面部的简单模型。
什么是面部检测?
面部检测是计算机技术在数字图像中识别人脸的能力。面部检测应用程序采用的算法专注于在可能包含风景,物体等的较大图像中检测人脸。
为了工作,面部检测应用程序使用机器学习算法来检测任何大小的图像中的人脸。较大的图像可能包含许多不同类型的物体,例如风景,物体,动物,建筑物和人的其他部位(例如,腿,肩膀和手臂)。
面部检测/识别技术以前仅与安全部门相关联,但如今已积极扩展到其他行业,包括零售,营销,医疗保健等。
面部检测如何工作?
尽管该过程有些复杂,但是面部检测算法通常始于搜索人眼。眼睛构成了所谓的山谷区域,是最容易发现的特征之一。一旦检测到眼睛,该算法便可以尝试检测包括眉毛,嘴巴,鼻子,鼻孔在内的面部区域。一旦算法推测出已检测到脸部区域,就可以应用其他测试来验证它是否实际上已检测到脸部。
OpenCV
OpenCV(开源计算机视觉库),它是图像和视频处理库,具有C ++,C,Python和Java的绑定。OpenCV用于各种图像和视频分析,例如面部识别和检测,车牌读取,照片编辑,高级机器人视觉,光学字符识别等。
OpenCV具有三个内置的人脸识别器,并且由于其清晰的编码,您只需更改一行代码即可使用其中任何一个。以下是这些面部识别器及其OpenCV调用的名称:
- EigenFaces - cv2.face.createEigenFaceRecognizer()
- FisherFace - cv2.face.createFisherFaceRecognizer()
- 局部二进制编码直方图(LBPH) - cv2.face.createLBPHFaceRecognizer()
如何使用OpenCV查找面部?
基本上有两种使用OpenCV查找面部的主要方法:
- Haar分类器
- LBP级联分类器
大多数开发人员使用Haar是因为它更准确,但也比LBP慢得多。我将在本文中使用Haar分类器。实际上,OpenCV软件包包含有效使用Haar所需的所有数据。基本上,您只需要一个包含正确面孔数据的XML文件。(https://github.com/opencv/opencv)具体的opencv文件都在这里共享的。
现在我们将编写一个简单的python程序,该程序将样本图像作为输入,并尝试使用OpenCV 检测面部和眼睛。在这里我们将使用用于面部检测和眼睛检测的Haar分类器XML文件haarcascade_frontalface_default.xml和haarcascade_eye.xml。
具体步骤如下:
步骤一:导入numpy,matplotlib,open-cv和glob
<code>import cv2 import numpy as np from matplotlib import pyplot as plt import glob/<code>
步骤二:使用glob循环遍历当前工作目录中存在的每个.jpg文件,并将它们存储在“ txtfiles”列表中。
<code>txtfiles = [] for file in glob.glob('*.jpg'): txtfiles.append(file)/<code>
步骤三:使用cv2.imread()读取每个.jpg文件。函数cv2.imread()需要两个参数:第一个是图像本身的路径,第二个指定应读取图像的方式。我们可以使用以下三个中的任何一个作为第二个参数。
- cv2.IMREAD_COLOR - 用于加载彩色图像。它用于没有Alpha通道的8位图像。
- cv2.IMREAD_GRAYSCALE - 负责以灰度加载图像。
- cv2.IMREAD_UNCHANGED - 它使用alpha通道(RGBA)加载图像。
使用OpenCV加载图像时,默认情况下会将其加载到BGR颜色空间中。
之后,复制通过的图像,以使通过的图像不被更改。
<code>img = cv2.imread(ix,cv2.IMREAD_COLOR) imgtest1 = img.copy()/<code>
步骤四:将图像转换为灰度图像,因为OpenCV面部检测器需要灰度图像。
<code>imgtest = cv2.cvtColor(imgtest1,cv2.COLOR_BGR2GRAY)/<code>
步骤五:现在,我们必须加载用于面部检测和眼睛检测的Haar分类器(两个XML文件),该输入将Haar分类器的训练文件作为输入。
<code>facecascade = cv2.CascadeClassifier('opencv-master/opencv-master/data/haarcascades/haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('opencv-master/opencv-master/data/haarcascades/haarcascade_eye.xml')/<code>
步骤六:使用detectMultiScale()可以准确地检测到我们需要的面部信息。
detectMultiScale(image, scaleFactor, minNeighbors) 这是检测对象的常规函数,在这种情况下,由于我们在面部级联中调用了面部,因此它将检测面部。如果找到面部,则以“ Rect(x,y,w,h)”的形式返回该面部的位置列表。如果没有,则返回“无”。
<code>faces = facecascade.detectMultiScale(imgtest, scaleFactor=1.2, minNeighbors=5)/<code>
步骤七:输出检测到的图像的面部数量。
<code>print('Total number of Faces found',len(faces))/<code>
步骤八:遍历面的列表,并画上了矩形图像。这里基本上我们发现面孔,锁定面孔,判断它们的大小,并绘制矩形。
<code>for (x, y, w, h) in faces: face_detect = cv2.rectangle(imgtest, (x, y), (x+w, y+h), (255, 0, 255), 2) roi_gray = imgtest[y:y+h, x:x+w] roi_color = imgtest[y:y+h, x:x+w] plt.imshow(face_detect)/<code>
步骤九:接下来,我们将进行眼部检测,最有趣的部分是它可能不会找到一个眼球。大部分的人眼检测算法使用周围的皮肤,眼睑,睫毛和眉毛也做检测。
<code> eyes = eye_cascade.detectMultiScale(roi_gray) for (ex,ey,ew,eh) in eyes: eye_detect = cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(255,0,255),2) plt.imshow(eye_detect)/<code>
最后我们的输出:
结论:
因此,我们可以看到只有几行代码,我们就开始了面部检测。从这里开始,我们可以继续使用openCV创建人脸识别模型,该模型将预测姓名和与该特定人有关的其他信息。本文适用于想要使用此令人惊叹的Python编程语言构建有趣内容的初学者。还有许多可用的Haar分类器来检测人体的各个部位。