|
|
51CTO旗下网站
|
|
移动端

一种简单而智能的方法:Python也能进行面部识别

本文将介绍图像处理中的一些重要概念,除了具体解释每个步骤之外,还将提供一个在Python中使用Cv2和DLib库轻松进行人脸识别的项目。

作者:读芯术来源:今日头条|2020-07-30 13:00

本文转载自公众号“读芯术”(ID:AI_Discovery)。

本文将介绍图像处理中的一些重要概念,除了具体解释每个步骤之外,还将提供一个在Python中使用Cv2和DLib库轻松进行人脸识别的项目。

感兴趣区域

在使用图像进行面部分析时,最重要的概念之一是定义感兴趣区域(ROI),我们必须在图像中定义一个特定的部分,在那里筛选或执行一些操作。

例如,如果我们需要筛选汽车的车牌,我们的感兴趣领域只停留在车牌上,那么街道、车身和图片中出现的任何东西都只是辅助部分。在本例中,我们将使用opencv库,该库支持对图像进行分区并帮助我们确定感兴趣领域。

Haar库

本项目中将使用现成的分类器:级联的Haar分类器,这种特定的分类器将始终适用于灰度图像。

一种简单而智能的方法:Python也能进行面部识别

该算法生成了一个几何图形,该几何图形将识别与我们所分析的相似点。因此在本例中,它将尝试寻找人脸图案,即眼睛、鼻子和嘴巴。这种分析方法最大的问题是产生幻想性视错觉。

一种简单而智能的方法:Python也能进行面部识别

你看到的是人眼还是几扇窗户?在希腊词源学中,幻想性视错觉是一种人类的特征。从童年起,我们的大脑就被编程来识别物体、图像中的人脸。利用我们先前获得的经验,我们自己的大脑会根据我们所认识到的“人类”特征来寻找一种模式,增加新的人脸面孔。

使用Haar人脸特征分类器

用以下图像为例:

一种简单而智能的方法:Python也能进行面部识别

来看看识别这张图片中的人脸代码:

  1. import cv2 
  2.               group_of_people_image = cv2.imread('images/image7.jpg') 
  3.        frontal_face_classifier = cv2.CascadeClassifier('classifier/haarcascade_frontalface_default.xml') 
  4.        image_in_gray_scale = cv2.cvtColor(group_of_people_image,cv2.COLOR_BGR2GRAY) 
  5.               faces = frontal_face_classifier.detectMultiScale(image=image_in_gray_scale,scaleFactor=1.3, minNeighbors=6
  6.               for (x_axis, y_axis, weight,height) in faces: 
  7.            cv2.rectangle(group_of_people_image,(x_axis, y_axis), (x_axis + weight, y_axis + height), (255, 0, 0), 2) 

该算法将图像转换为灰度图像,如前所述,这是分类器操作的一个基本步骤,然后我们使用dectedMultiScale函数搜索图像中的人脸,并通过绘制矩形来显示图像的位置,当定位人脸时结果如下:

一种简单而智能的方法:Python也能进行面部识别

我们能够准确地分析两张出现的脸(采用矩形的方式将人脸框起来),有两个人完全正面地露出他们的脸,人脸完全显现,所以我们可以清楚地看到他的脸;另一个人只露出了面部的一部分,所以我们没有得到准确的信息来确认这是一张完整的人脸。

面部特征检测

Dlib是一个拥有一些分类器的库,可以帮助我们检测人脸的某些部分,例如:眼睛、眉毛、鼻子和洋娃娃的区域。以下图为例:

一种简单而智能的方法:Python也能进行面部识别

现在,使用算法来识别图像中的面部特征点:

  1. import cv2 
  2.        import dlib 
  3.        import numpy as np 
  4.               initial_image = cv2.imread('images/image9.jpg') 
  5.        initial_image_in_rgb = cv2.cvtColor(initial_image,cv2.COLOR_BGR2RGB) 
  6.        reference_image = initial_image_in_rgb.copy() 
  7.               classifier_path = dlib.shape_predictor('classifier/shape_predictor_68_face_landmarks.dat') 
  8.        frontal_face_detector = dlib.get_frontal_face_detector() 
  9.               rectangles =frontal_face_detector(initial_image,1) 
  10.               for k, d inenumerate(rectangles): 
  11.            cv2.rectangle(reference_image,(d.left(), d.top()), (d.right(), d.bottom()), (255, 255, 0), 2) 
  12.               landmarks = [] 
  13.               for rectangle in rectangles: 
  14.            landmarks.append(np.matrix([[p.x, p.y] for p inclassifier_path(reference_image,rectangle).parts()])) 
  15.               for landmark in landmarks: 
  16.            for index, point inenumerate(landmark): 
  17.                point_center = (point[0, 0], point[0, 1]) 
  18.                cv2.circle(reference_image,point_center, 3, (255, 255, 0), -1) 
  19.                cv2.putText(reference_image,str(index), point_center, cv2.FONT_HERSHEY_COMPLEX, 3, (255, 255, 255), 2) 

我们使用的是人脸68个特征分类器,它试图更精确地理解点面,这给了我们更多的选择去分析结果,其缺点是速度有点慢。所以必须划定一个矩形来确定我们的脸可能在哪里,特征是我们可以识别的人脸特征,包括脸、嘴、眼睛、眉毛。

一旦用矩形的方式框出了脸,就可以使用功能部件将这些特征返回,最后将得到一些可视化的东西去生成一个带有面部点的图像。结果是:

一种简单而智能的方法:Python也能进行面部识别

这些点对于帮助识别表情很重要,例如我们可以识别出这个男孩睁着眼睛,闭着嘴巴。把这看作是一种情绪的表现,可以说这个男孩很焦虑。当一个人微笑时,它可以帮助理解这种情绪可能表达的是幸福。

上述例子向我们展示了,Python可以识别出我们感兴趣的区域,在本文中就是人脸识别。这个项目还可以扩展到使用机器学习来检测,探究图像中的人是否感到快乐、悲伤或者忧虑。

包含所有内容的项目可从以下网址获得:https://github.com/LimaGuilherme/facial-recognize

【编辑推荐】

  1. 如果连这10个Python缩写都不知道,那你一定是Python新手
  2. Python中有趣的Ellipsis对象
  3. 分分钟甩Word几条街,Python编辑公式竟可以如此简单
  4. 通过VSCode RTOS插件使用Python为物联网系统编写程序
  5. 5分钟内搭建你的第一个Python聊天机器人
【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

大数据安全运维实战

大数据安全运维实战

CDH+Ambari
共20章 | 大数据陈浩

91人订阅学习

实操案例:Jenkins持续交付和持续部署

实操案例:Jenkins持续交付和持续部署

微服务架构下的自动化部署
共18章 | freshman411

184人订阅学习

思科交换网络安全指南

思科交换网络安全指南

安全才能无忧
共5章 | 思科小牛

109人订阅学习

精选博文
论坛热帖

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微