云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
本文将介绍图像处理中的一些重要概念,除了具体解释每个步骤之外,还将提供G 6 W #一个p } 5 } 8 c : {在Python中使用Cv2和DLib库轻松进行人脸识别的项目。
感兴趣区域
在使用图像进行面部分析时,最重要的概念之一是定v y t D ;义p 2 n ^感兴趣区域(ROI),我们k / o V F A h必须在图像中定义一个特定的部分,在那里筛选或执行一些操作。
例如,如果我们需要筛选汽车的车牌,我们的感兴趣领域只停留在车牌& Y n i上,那么街道、车身和图片中出现的任何东西都只是辅助部分。在本例中,我们将使用opencv库,该库支持对图像进行分区并帮助我们确. 5 Q p #定感兴趣领域。
Haar库
本项目中% f { A n 9 5 2 Y将使用现成的分类器:级联的Haar分类器,这种特定的分类器将始终适用于灰度图像。
该算法生成了一个几何图形,该几{ K u何图形将识别与我们O x I ` b f所分析的相似点。因此在本例中,它将尝试寻找人脸图案,即眼睛、鼻子和嘴巴。这种分析方法最大的问题是产生幻想性视F v f s错觉。
你看到的是人眼还是几扇窗户?在希腊词源学中,幻想性视错觉是一种人类的特征M Q % H c _ L 5 ?。从童年起,我们的大脑就被编程来识别物体、图像中的人脸。利用我们先前获得的经验,我们自己的大脑会根据我们所认识到的“人类”特征来寻找一种模式,增加新的人脸面孔。
使用Haar人脸特征分类器
用以下图像为例:
来看看识别这张图片中的人脸代码:
import cv2
group_of_people_image = cv2.imreH | Q D -adL Z i Y Z J t('images/image7.jc G H c | W p t Zpg')
frontal_face_classifier = cv2.CascadeClassifier('classifier/haarcascade_frontalface_default.xml')
image_in_gray_C $ x ascale = cv2.cvtC) ~ @ q E ` [ i eolor(group_of_people_image,c3 V D k * , 0v2.COLOR_BGR2GRAY)
faces = frontal_face_classifier.d1 ( a s DetectMultiScale(image=image_in_gray_scale,scaleFactor=1.3, minNeighbors=6), / _
for (x_axis, y_axis, weight,height) in fach U i , : 5 x [ $es:
cv2.rectangle(gj f ? prouh F A Jp_of_people_image,(x_axis, y_axis), (x_axis + weight, y_axis + height), (25P j V s5, 0, 0), 2)
该算法将图像转换为灰度图像,A d 1 x 8 N #如前所述,这是分类器操作的一个基本步骤,然后我们使用dectedMultiScale6 h T 3 @ } 5函数搜索图像中的人脸,并通过绘制矩形来显示图像的位置,当定位人脸时结果如下:
我们能够准确地分析两张出a L F 2现的脸(采用矩形的方式将人脸框起来),有两个人完f N s Y # T t .全正面地露出他们的脸,人脸完全显现,所以我们可以清楚地看到他的脸;另一个人只露出i J | O了面部的一部分,所以我们没有得到准确的信息来确认这是一张完整的人脸。
面部特征检测
Dlib是一个拥有一些分类器的库,可以帮助我们检测人脸的某些部分,例J Y ! s 6如:眼睛、眉毛、鼻子和洋娃娃的区域。以下图为例:
现在,使用算法来识别图像中的面部特征点:
import cv2U # I v
import dlib
import n[ _ g b e ] o ) 0umpy as* p 6 @ ~ np
initial_image = cv2.imread('images/image9.jpg')
iR x e v $ s 3nitial_image_in_rgb = cv2.cvtColor(initial_image,cv2.COLOR_BGR2RGB)
reference_ime i 4 . g qage = initial_image_in_rgb.copy()
classifier_path = dlib.shape_predictor('classifier/shape_predictor_68_face_landI 7 | t U = q d ;marks.dat')
frontal_face_detector = dlib.get_frontal_face_detector()
rectangles =frontal_face_detector(initA O ( e % [ &ial_image,1)i ) { | G Q 0
for k, d inenumerate(rectangles):
cv2.rectangle(reference_image,(d.left(), d.top()), (d.right()| r w, d.bottoJ o 2 C : ~ & b lm()), (255, 255, 0), 2Z B : ?)
landmarks = []
for rectangle in rectangles:
landmarks.append(np.matrix([[p.x, p.y] for p inclassM q f 4 7ifier_path(reference_image,rectangle).parts()]))
for landmark in landmarks:
for index, point inenumerate(landmark):
point_center = (point[0, 0], point[0, 1])
cv2.circle(reference_image,point_center, 3, (255, 255, 0), -1)
cv2.putText(reference_image,str(index), point_center, cv2.FONT_HERSHEY_COMPLEX, 3H d, (255, 255, 255), 2)
我们使用的是人脸68个特征分类器,它试图更精确地理解点面,这` d F给了我们更多的选择去分析结果+ a ? a L Z ! a a,其缺点是速度? g L u d b 5 h u有点慢。所以必须划定一个矩形来确定我们的脸可能在哪里,特征是我们可以识别的人脸特征,包括脸、嘴、眼睛、眉毛。
一旦用矩形的方式框m t 8 ) )出了脸,就可以使用功能部件将这些特征返回,最后将得到一些可视化的东西去生成一个带有面部点的图像。结果是:
这些点对于帮助识别表情很重要,例如我们可以识别出这个男孩睁着眼睛,闭着嘴巴。把这看作是一种情绪的表现,可以说这个男孩很焦虑。当一个人微U : x 4 E V笑时,它可以帮助理解这种情绪可能表达的是幸福。
上述例子向我们展示了,Python可以识别出我们感兴趣的区域,在本文中就是人脸识别。这个项目还可以扩展到使用机器学W 2 a l x习来检测,探究图像中的人是否感到快乐、悲伤或者忧虑。
包含所有内容的项目可从以下网址获得:https://gitB * - p Q V 6 ?hub.com/LimaGuilherme/facial-recognize
【云栖号在线课堂】每天都有产品技术专: M f G家分享!
课程地址:https://yqh.aliyun.com/live
立即加T ? 9 X }入社群,与专家面对面,及时s Z N / v ; d C了解课程最新动态!
【云栖号在线L 8 N F课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2Z w n020-07-30
本文作者:读芯术
本文来自:“51CTO”,了解相关信息可以关注“51CTO”