Dlib库人脸关键点检测
在很多场景下,我们要观察人物是否眨眼,很大概率可以根据上下眼皮是否闭合,以此来判断。那么如果能把人脸打上关键点,是否就可以确认他的一些动作,例如,微笑,眨眼,愤怒。甚至三维人脸重建那么本章节讲解如何在图片检测到人脸,并绘制出人脸关键点
系列目录
2,基于dlib的人脸检测识别系列——人脸检测-CSDN博客
目录
前言
在很多场景下,我们要观察人物是否眨眼,很大概率可以根据上下眼皮是否闭合,以此来判断。
那么如果能把人脸打上关键点,是否就可以确认他的一些动作,例如,微笑,眨眼,愤怒。甚至三维人脸重建
那么本章节讲解如何在图片检测到人脸,并绘制出人脸关键点
一、方法
捋思路环节
1)首先我们得找到人脸在哪吧,需要检测到人脸,那么第一步就需要调用到Dlib库里的人脸检测器
2)那么,找到了人脸,就需要在人脸上识别到关键点,调用模型,找到坐标
3)人脸,人脸关键点都找到了,直接绘制出来就行了
二、人脸检测
1.dlib库安装
2.人脸检测
细节部分参考:基于dlib的人脸检测识别系列——人脸检测
直接调用人脸检测器即可
# 调用人脸检测器
detector = dlib.get_frontal_face_detector()
faces = detector(gray,1)
三、人脸关键点检测
关键点的作用在前言中已有解释,但是如何才能检测到呢?
其实dlib本来就有,我们可以去下载下来。
1.模型下载
我们需要下载人脸关键点模型。
下载这两个,不过我们只用68关键点那个。
懒人--->百度云 提取码:z7zh
里面有一些模型,看看自己是否需要吧
接下来我们需要调用这个模型
# 加载人脸关键点的模型
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
名称别打错。打错就报错
2.具体流程
读取我们需要的图片,加载人脸检测器,加载人脸关键点,然后绘制即可。
加载器我这边是直接放在目录上的
实现代码如下:
#导入库
import cv2
import dlib
import numpy as np
import matplotlib.pyplot as plt
# 读取一张图片
image =cv2.imread("face.jpeg")
# 调用人脸检测器
detector = dlib.get_frontal_face_detector()
# 加载人脸关键点的模型
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 灰度转化
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 人脸检测
faces = detector(gray,1)
# 循环,遍历每一张人脸,绘制人脸矩形框和关键点
for face in faces: #(x,y,w,h)
# 绘制矩形框
cv2.rectangle(image,(face.left(),face.top()),(face.right(),face.bottom()),(255,0,0),2)
# 预测关键点
shape = predictor(image,face)
# 获取到关键点的坐标
for pt in shape.parts():
# 获取横纵坐标
pt_position=(pt.x,pt.y)
# 显示/绘制关键点
cv2.circle(image,pt_position,3,(0,0,255),-1)
# 显示整个效果图
image_RGB=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
plt.imshow(image_RGB)
plt.axis("off")
plt.show()
重点讲解for循环部分:
1)我们需要循环遍历每张人脸,给每一张人脸画矩形框和关键点。
2)cv2.rectangle()绘制矩形框,接下来。需要获取关键点的坐标
3)一共有68个点,就是有68个坐标。
所以需要在套个循环。
4)shape.parts():在每一次循环时,获取坐标,
接下来就是获取横纵坐标。
在绘制点, cv2.circle(image,pt_position,3,(0,0,255),-1)。
5)显示整个效果。
运行结果
四、摄像头关键点检测
细节部分参考:基于dlib的人脸检测识别系列——人脸检测(摄像头)
主体方面大同小异,依旧是加载人脸检测器,人脸关键点检测器。
就是不断读取摄像头图片进行检测绘制。
代码如下:
# 导入库
import cv2
import dlib
# 打开摄像头
capture =cv2.VideoCapture(0)
# 获取人脸检测器
detector= dlib.get_frontal_face_detector()
# 获取人脸关键点检测器、
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
while True:
# 读取视频流
ret,frame= capture.read()
# 灰度转化
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
# 人脸检测
faces=detector(gray,1)
# 绘制人脸的矩形框和关键点
for face in faces:
# 绘制矩形框
cv2.rectangle(frame,(face.left(),face.top()),(face.right(),face.bottom()),(0,255,0),2)
# 检测关键点
shape = predictor(gray,face)
# 获取关键点的坐标
for pt in shape.parts(): #parts:获取68个点的坐标
# pt:取出每个点的坐标
pt_position=(pt.x,pt.y)
# 绘制关键点
cv2.circle(frame,pt_position,3,(255,0,0),-1)
if cv2.waitKey(1)==ord('q'):
break
# 显示效果
cv2.imshow("face detection landmark",frame)
# 释放资源
capture.release()
cv2.destroyAllWindows()
五、face_recognition检测关键点
上述中,我们老是要检测到人脸再去定位关键点,要加载两个,而且很死板,没有深度学习功能。那么接下来我们可以运用下面技术。
face_recognition
背景:
face_recognition号称是世界上最简单的基于python
的人脸识别库,它使用dlib人脸识别技术构建而成,并具有深度学习功能。
操作步骤
安装
我们需要安装face_recognition
我比较习惯使用conda,所以在Anaconda Prompt中直接
pip install face_recognition
方法
捋思路环节:
我们需要绘制关键点,那么我们就要找到关键点的坐标,就要调用face_recognition库中的方法:face_landmarks()。那么这到底是什么呢?能返回什么给你?所以,我们可以打印出来看看到底是什么东西。
1)导入图片,灰度转换,再传入face_landmarks中打印看看
import face_recognition
import cv2
def main():
#读取图片
image = cv2.imread("jiangwen.jpeg")
#灰度转换
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#调用face_recognition库中的方法:face_landmarks()
#None:默认找不到脸,程序自找。 如本人知道脸坐标,可以自己输入
face_marks = face_recognition.face_landmarks(gray,None,"large") #large:68个关键点
print(face_marks)
if __name__ == '__main__':
main()
结果:
拖动后发现,其实就是下巴,眼睛,眉毛这些的人脸关键点坐标。
那么我们的任务就明确了,将这里的每个点的坐标一一对应的取出来并绘制。
:字典--->键---->值
#取出关键点坐标并绘制
def show_landmarks(image,landmarks):
for landmarks_dict in landmarks:
for landmarks_key in landmarks_dict.keys():
for point in landmarks_dict[landmarks_key]:
cv2.circle(image,point,5,(0,0,255),-1)
return image
完整代码
#导入库
import face_recognition
import cv2
import matplotlib.pyplot as plt
#显示图片
def show_image(image,title):
image_RGB=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
plt.title(title)
plt.imshow(image_RGB)
plt.axis("off")
#绘制关键点
def show_landmarks(image,landmarks):
for landmarks_dict in landmarks:
for landmarks_key in landmarks_dict.keys():
for point in landmarks_dict[landmarks_key]:
cv2.circle(image,point,5,(0,0,255),-1)
return image
# 主函数
def main():
#读取图片
image = cv2.imread("jiangwen.jpeg")
#灰度转换
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#调用face_recognition库中的方法:face_landmarks()
#None:默认找不到脸,程序自找。 如本人知道脸坐标,可以自己输入
face_marks = face_recognition.face_landmarks(gray,None,"large") #large:68个关键点
print(face_marks)
#绘制关键点
image_result = show_landmarks(image.copy(),face_marks)
#创建画布并显示
plt.figure(figsize=(9,6))
plt.suptitle("face_recognition",fontsize=14,fontweight="bold")
show_image(image_result,"landmarks_f")
plt.show()
if __name__ == '__main__':
main()
结果如下:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)