系列目录

1,Dlib库安装教程_boxgege的博客-CSDN博客

2,基于dlib的人脸检测识别系列——人脸检测-CSDN博客


目录

前言

一、方法

二、人脸检测

1.dlib库安装

2.人脸检测

三、人脸关键点检测

1.模型下载

2.具体流程

运行结果

四、摄像头关键点检测

五、face_recognition检测关键点

操作步骤

安装

方法

完整代码


前言

在很多场景下,我们要观察人物是否眨眼,很大概率可以根据上下眼皮是否闭合,以此来判断。

那么如果能把人脸打上关键点,是否就可以确认他的一些动作,例如,微笑,眨眼,愤怒。甚至三维人脸重建

那么本章节讲解如何在图片检测到人脸,并绘制出人脸关键点

一、方法

捋思路环节

1)首先我们得找到人脸在哪吧,需要检测到人脸,那么第一步就需要调用到Dlib库里的人脸检测器

2)那么,找到了人脸,就需要在人脸上识别到关键点,调用模型,找到坐标

3)人脸,人脸关键点都找到了,直接绘制出来就行了

二、人脸检测

1.dlib库安装

方法:Dlib库安装教程_boxgege的博客

2.人脸检测

细节部分参考:基于dlib的人脸检测识别系列——人脸检测

直接调用人脸检测器即可

# 调用人脸检测器
detector = dlib.get_frontal_face_detector()
faces = detector(gray,1)

三、人脸关键点检测

关键点的作用在前言中已有解释,但是如何才能检测到呢?

其实dlib本来就有,我们可以去下载下来。

1.模型下载

我们需要下载人脸关键点模型。

下载:http://dlib.net/files/

下载这两个,不过我们只用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()

结果如下:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐