python3利用Dlib19.7实现人脸68个特征点标定

Python3利用Dlib19.7实现人脸68个特征点标定

简介

本篇攻略将介绍如何使用Python3和Dlib19.7库实现人脸68个特征点标定。Dlib是一个非常强大的机器视觉工具集,其中包含了一些实现基础人脸识别、人脸对齐和特征点检测等功能的算法。本文将使用其中的特征点检测算法,实现68个特征点的标定。首先,需要准备依赖环境。

设计思路

要实现人脸68个特征点的标定,可以分为以下几个步骤:

  1. 安装 Dlib19.7及其依赖包
  2. 下载 shape_predictor_68_face_landmarks.dat 数据文件
  3. 加载待检测的图片
  4. 使用 Dlib19.7 的人脸检测算法找到图像中的人脸
  5. 使用 Dlib19.7 的特征点检测算法找到每张人脸上68个关键点
  6. 将特征点输出到图片上,完成标定过程

详细步骤

步骤1:安装 Dlib19.7及其依赖包

在终端中使用以下命令完成 Dlib19.7 安装:

pip install dlib==19.7

需要注意的是,Dlib19.7依赖于Boost和CMake,需要先安装这些依赖库,否则会安装失败。可以使用以下命令安装:

sudo apt-get install -y build-essential cmake
sudo apt-get install -y libgtk-3-dev
sudo apt-get install -y libboost-all-dev

步骤2:下载 shape_predictor_68_face_landmarks.dat 数据文件

在进行特征点检测时,需要使用训练好的数据文件。可以在官网 http://dlib.net/files/ 找到相关资源。下载完成后,将文件放置到指定目录下即可。

步骤3:加载待检测的图片

使用 OpenCV 加载待检测的图片(需要先安装 OpenCV),如下所示:

import cv2

image = cv2.imread("test.jpg")

步骤4:使用 Dlib19.7 的人脸检测算法找到图像中的人脸

import dlib

detector = dlib.get_frontal_face_detector()

faces = detector(image)

步骤5:使用 Dlib19.7 的特征点检测算法找到每张人脸上68个关键点

predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

for face in faces:
    landmarks = predictor(image, face)
    for n in range(68):
        x = landmarks.part(n).x
        y = landmarks.part(n).y
        # 将检测到的特征点绘制到图片上
        cv2.circle(image, (x, y), 1, (0, 0, 255), -1)

步骤6:将特征点输出到图片上,完成标定过程

cv2.imwrite("result.jpg", image)
cv2.imshow("result.jpg", image)
cv2.waitKey(0)

完整代码可能如下所示:

import cv2
import dlib

# 加载图片
image = cv2.imread("test.jpg")

# 创建人脸检测器
detector = dlib.get_frontal_face_detector()

# 在图像中找到人脸
faces = detector(image)

# 加载特征点检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

# 对每张人脸检测68个特征点
for face in faces:
    landmarks = predictor(image, face)
    for n in range(68):
        x = landmarks.part(n).x
        y = landmarks.part(n).y
        # 将检测到的特征点绘制到图片上
        cv2.circle(image, (x, y), 1, (0, 0, 255), -1)

# 结果展示
cv2.imshow("result.jpg", image)
cv2.waitKey(0)
cv2.destroyWindow("result.jpg")

示例说明

示例1

假设我现在有一张人脸图片 "test.jpg",需要进行68个特征点的标定。可以使用以上步骤进行标定。此时输出的图片将会包含标注了68个特征点的人脸。

import cv2
import dlib

# 加载图片
image = cv2.imread("test.jpg")

# 创建人脸检测器
detector = dlib.get_frontal_face_detector()

# 在图像中找到人脸
faces = detector(image)

# 加载特征点检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

# 对每张人脸检测68个特征点
for face in faces:
    landmarks = predictor(image, face)
    for n in range(68):
        x = landmarks.part(n).x
        y = landmarks.part(n).y
        # 将检测到的特征点绘制到图片上
        cv2.circle(image, (x, y), 1, (0, 0, 255), -1)

# 结果展示
cv2.imshow("result.jpg", image)
cv2.waitKey(0)
cv2.destroyWindow("result.jpg")

示例2

如果要对很多张图片进行特征点检测,需要将以上步骤封装到函数中,以方便复用。

import cv2
import dlib

def mark_faces(image_path, output_path):
    # 加载图片
    image = cv2.imread(image_path)

    # 创建人脸检测器
    detector = dlib.get_frontal_face_detector()

    # 在图像中找到人脸
    faces = detector(image)

    # 加载特征点检测器
    predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

    # 对每张人脸检测68个特征点
    for face in faces:
        landmarks = predictor(image, face)
        for n in range(68):
            x = landmarks.part(n).x
            y = landmarks.part(n).y
            # 将检测到的特征点绘制到图片上
            cv2.circle(image, (x, y), 1, (0, 0, 255), -1)

    # 将结果保存到文件中
    cv2.imwrite(output_path, image)

mark_faces("test.jpg", "result.jpg")

如此,便可以简单地对很多张图片进行68个特征点的标定了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python3利用Dlib19.7实现人脸68个特征点标定 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • pytorch 实现多个Dataloader同时训练

    PyTorch实现多个Dataloader同时训练 在本攻略中,我们将介绍如何使用PyTorch实现多个Dataloader同时训练。我们将提供两个示例,演示如何使用PyTorch实现多个Dataloader同时训练。 问题描述 在深度学习中,我们通常需要使用多个数据集进行训练。在PyTorch中,我们可以使用Dataloader来加载数据集。但是,当我们需…

    python 2023年5月14日
    00
  • numpy的squeeze函数使用方法

    以下是关于“numpy的squeeze函数使用方法”的完整攻略。 numpy的squeeze函数简介 在NumPy中,squeeze()函数用于从数组的形状中删除单维度条目。例如如果数组a的形状为(, 3, 1, 5),则使用squeeze()函数可以将其形状变为(3, 5)。 numpy的squeeze函数使用方法 下面是squeeze()函数的使用方法:…

    python 2023年5月14日
    00
  • NumPy操作数组最常用的7个方法(组合、分裂、运算、广播…)

    NumPy数组支持许多常用的操作方法,包括索引、切片、聚合函数、广播等等。在本文章中将会介绍一些Numpy数组常用的操作方法。 NumPy 数组切片 可以使用切片来访问NumPy数组中的子数组。例如: import numpy as np a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(a[0:2,…

    2023年2月27日
    00
  • Python机器学习三大件之一numpy

    Python机器学习三大件之一numpy 在Python机器学习中,numpy是三大件之一,它是一个用于科学计算的Python库,提供了高效的维数组对象以及用于处理这些数组的工具的主要优势在于它可以处理大量的数据,比Python内置的列表要得多。本攻略将详细讲解numpy的使用,并供两个示例。 安装numpy 在使用numpy之前,我们需要先安装它。可以使用…

    python 2023年5月13日
    00
  • numpy 产生随机数的几种方法

    NumPy 产生随机数的几种方法 NumPy是Python中一个非常强大的数学库,它提供了许多高效的数学和工具,特别对于数组矩阵的处理。在NumPy中,我们可以使用种方法来产生随机数。本攻略将介绍NumPy中产生随机数的几种方法,并提供两个示例。 .random.rand()函数 np.random.rand()函数用于指定形状的随机数组,数组中的元素取值范…

    python 2023年5月13日
    00
  • PyTorch一小时掌握之基本操作篇

    下面是“PyTorch一小时掌握之基本操作篇”的完整攻略。 PyTorch 一小时掌握之基本操作篇 简介 PyTorch 是一个开源的机器学习框架,它允许你通过 Python 编程语言来创建、训练和部署深度学习模型。 本文将介绍 PyTorch 的基本操作,包括张量、自动求梯度和模型构建与训练等。 张量 (Tensors) 张量是 PyTorch 中的核心数…

    python 2023年5月14日
    00
  • pybind11和numpy进行交互的方法

    Pybind11是一个用于将C++代码与Python解释器交互的开源库,而NumPy是Python中用于科学计算的一个重要库。Pybind11和NumPy的结合可以让我们在Python中使用C++代码和NumPy数组。本文将详细讲解“pybind11和numpy进行交互的方法”的完整攻略,包括步骤和示例。 步骤 使用Pybind11和NumPy进行交互的步骤…

    python 2023年5月14日
    00
  • Python之Numpy的超实用基础详细教程

    Python之Numpy的超实用基础详细教程 NumPy模块的基本概念 NumPy是Python中一个非常流行的学计算库,提供了许多常用的数学函数和工具。Py的主要特点是提供高效的多维数组,可以快速进行数学运算和数据处理。 数组的创建 我们可以NumPy库中的np.array()函数来创建数组。下面一个创建一维数组的示例: import numpy as n…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部