Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

yizhihongxing

Python+Dlib+Opencv实现人脸采集并表情判别功能需要分为以下几个步骤:

1. 安装必要的依赖库

在开始进行人脸采集并表情判别功能的实现前,需要确保已经安装以下必要的依赖库:

  • Python 3.x
  • Dlib
  • OpenCV

如果没有安装以上依赖库,需要根据实际情况进行安装。

2. 实现人脸采集功能

在实现人脸采集功能前,需要先使用OpenCV和Dlib库来进行人脸检测和人脸特征点定位,代码如下:

import cv2
import dlib

detector = dlib.get_frontal_face_detector()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)

video_capture = cv2.VideoCapture(0)

while True:
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = detector(gray)
    for face in faces:
        landmarks = predictor(gray, face)
        # 进行人脸采集操作

    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()

在代码中,cv2.VideoCapture(0)打开了电脑摄像头,并且通过while循环不断读取每一帧图像,使用dlib的get_frontal_face_detector()函数进行人脸检测,使用dlib的shape_predictor()函数进行关键点检测,定位出人脸的区域和68个特征点后,通过具体的代码来进行人脸采集操作。

3. 实现人脸表情识别功能

在实现人脸表情识别功能前,需要先训练出一个表情识别的模型,代码如下:

import dlib
import cv2
import numpy as np

detector = dlib.get_frontal_face_detector()

predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)


def get_landmarks(im):
    rects = detector(im, 1)

    if len(rects) > 1:
        return 'error'
    if len(rects) == 0:
        return 'error'

    return np.matrix([[p.x, p.y] for p in predictor(im, rects[0]).parts()])


def annotate_landmarks(im, landmarks):
    im = im.copy()
    for idx, point in enumerate(landmarks):
        pos = (point[0, 0], point[0, 1])
        cv2.putText(im, str(idx), pos, fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, fontScale=0.4, color=(0, 0, 255))
        cv2.circle(im, pos, 3, color=(0, 255, 255))
    return im


image = cv2.imread('test.jpg', 1)
landmarks = get_landmarks(image)
image_with_landmarks = annotate_landmarks(image, landmarks)

cv2.imshow('Result', image_with_landmarks)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,通过OpenCV库调用imread()函数加载图片,使用Dlib库中的get_frontal_face_detector()函数进行人脸检测,使用Dlib库中的shape_predictor()函数进行标志物关键点的检测,最后进行图像标记,并将处理结果用OpenCV显示出来。

示例说明

下面给出两个示例,详细讲解"Python+Dlib+Opencv实现人脸采集并表情判别功能的代码":

示例1:
假设您已经在考场内采集到100张表情图片, 并将这些图片保存到到本地文件夹img文件夹中,然后使用下面的代码将高维特征值文件all_features.npy和对应的标签文件all_labels.npy保存到本地文件夹model中。

import dlib
import numpy as np
import cv2
import os

detector = dlib.get_frontal_face_detector()
face_pose_predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
face_encoder = dlib.face_recognition_model_v1('dlib_face_recognition_resnet_model_v1.dat')

train_folder_path = './img'
model_save_path = './model'

if not os.path.exists(model_save_path):
    os.mkdir(model_save_path)

# 加载图像,获取特征向量
def get_image_features(image_path):

    image = cv2.imread(image_path)
    faces = detector(image, 1)
    if len(faces) != 1:
        return None
    face_rect = faces[0]
    pose_landmarks = face_pose_predictor(image, face_rect)
    face_descriptor = face_encoder.compute_face_descriptor(image, pose_landmarks)
    return np.array(face_descriptor)


def get_train_data():
    data = []
    labels = []
    for cls_dir in os.listdir(train_folder_path):
        if not os.path.isdir(os.path.join(train_folder_path, cls_dir)):
            continue
        for img_file in os.listdir(os.path.join(train_folder_path, cls_dir)):
            image_path = os.path.join(train_folder_path, cls_dir, img_file)
            features = get_image_features(image_path)
            if features is None:
                print('跳过图像{}'.format(image_path))
                continue
            data.append(features)
            labels.append(cls_dir)
    return np.array(data), np.array(labels)


if __name__ == '__main__':
    features, labels = get_train_data()
    np.save(os.path.join(model_save_path, 'all_features.npy'), features)
    np.save(os.path.join(model_save_path, 'all_labels.npy'), labels)

示例2:
假设您已经成功保存了特征值文件all_features.npy和对应的标签文件all_labels.npy,现在需要使用这些特征值和标签训练一个SVM分类器,对新采集到的人脸图片进行表情判别, 以下是实现代码:

import numpy as np
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

model_save_path = './model'
features = np.load(os.path.join(model_save_path, 'all_features.npy'))
labels = np.load(os.path.join(model_save_path, 'all_labels.npy'))

X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)

svm = SVC(C=10, kernel='linear', probability=True)
svm.fit(X_train, y_train)

y_pred_train = svm.predict(X_train)
y_pred = svm.predict(X_test)

print('训练集准确率:', accuracy_score(y_train, y_pred_train))
print('测试集准确率:', accuracy_score(y_test, y_pred))

# 在需要表情识别时,先获取特征向量
def get_image_features(image_path):
    # 略去代码
    return np.array(face_descriptor)

# 然后使用训练好的SVM分类器进行表情识别
svm.predict(get_image_features(image_path))    

在示例2中,我们先从all_features.npy和all_labels.npy文件中加载数据,然后使用train_test_split分割训练集和测试集,再使用SVM算法进行训练,最后通过accuracy_score函数计算准确率,以便评估模型的性能。 最后,将特征向量传入分类器,获得该图片的表情分类结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python+Dlib+Opencv实现人脸采集并表情判别功能的代码 - Python技术站

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

相关文章

  • NumPy最常用的两个数组排序方法

    在NumPy中,有多种排序算法可用于对数组进行排序,包括快速排序、堆排序、归并排序等。 NumPy中的排序函数通常包括以下参数: a: 要排序的数组; axis: 沿着哪个轴进行排序,默认为-1,即沿着最后一个轴排序; kind: 排序算法,可选参数有’quicksort'(快速排序)、’mergesort'(归并排序)、’heapsort'(堆排序),默认…

    2023年3月1日
    00
  • Numpy中array数组对象的储存方式(n,1)和(n,)的区别

    在NumPy中,array数组对象的储存方式(n,1)和(n,)的区别在于它们的维度不同。其中,(n,1)表示一个二维数组,有n行和1列,而(n,)表示一个一维数组,有n个元素。 (n,1)和(n,)的区别 (n,1) (n,1)表示一个二维数组,有n行和1列。在NumPy中,可以使用reshape函数将一维数组转换为二维数组。下面一个示例: import …

    python 2023年5月13日
    00
  • Python图像灰度变换及图像数组操作

    Python图像灰度变换及图像数组操作 在Python中,我们可以使用Pillow库对图像进行处理,包括图像灰度变换和图像数组操作。本攻略将详讲解如何实现这些操作。 图像灰度变换 图像灰度变换是将彩色图像转换为灰度图像过程。在Pillow库中,我们可以使用convert函数将彩色图像转换为灰度图像。下面是一个将彩色图转换为灰度像的示例: from PIL i…

    python 2023年5月13日
    00
  • pytorch .detach() .detach_() 和 .data用于切断反向传播的实现

    在PyTorch中,可以使用detach()、detach_()和.data方法来切断反向传播。本攻略将详细介绍这三种方法的用法,并提供两个示例说明。以下是整个攻略的步骤: detach()、detach_()和.data方法 detach()方法 detach()方法用于返回一个新的Tensor,该Tensor与原始Tensor共享相同的数据,但不再与计算…

    python 2023年5月14日
    00
  • 利用numba让python速度提升百倍

    利用 Numba 让 Python 速度提升百倍的完整攻略 Numba 是一个用于 Python 和 NumPy 的即时编译器,可以将 Python 代码转为本地机器代码,从而高代码的执行速度。在本文中,我们将介绍如何使用 Numba 来加速 Python 代码,并供两个示例来演示其效果。 安装 Numba 在使用 Numba 之前,我们需要先安装它。可以使…

    python 2023年5月14日
    00
  • python中numpy包使用教程之数组和相关操作详解

    Python中NumPy包使用教程之数组和相关操作详解 NumPy是Python中一个重要的科学计算库,提供了高效的多维数组和各派生对象以于计算各种函数。本文将入讲解Py中的NumPy包使用教之数组和相关操作详解,包括数组的创建、数组的索引和切片、数组的形状操作、数组的拼接和分裂、数组的复制和视图等。 数组的创建 在NumPy中,可以使用array()函数来…

    python 2023年5月13日
    00
  • pip命令无法使用的解决方法

    以下是pip命令无法使用的解决方法的完整攻略,包括两个示例: pip命令无法使用的解决方法 解决方法1:升级pip 如果pip命令无法使用,可以尝试升级pip。可以使用以下命令升级pip: python -m pip install –upgrade pip 在这个示例中,我们使用python -m pip install –upgrade pip命令升…

    python 2023年5月14日
    00
  • 在import scipy.misc 后找不到 imsave的解决方案

    在导入scipy.misc模块后,有时会出现找不到imsave函数的问题。这通常是由于scipy.misc模块已经被弃用,imsave函数已经被移除导致的。以下是解决这个问题的步骤: 使用imageio库代替scipy.misc imageio是一个用于读写图像和视频的Python库。可以使用imageio库代替scipy.misc。以下是使用imageio…

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