1、将dat模型文件导入程序
回顾是上一章的将xml标注好的通过程序训练成dat模型,接下来我们就通过训练好的模型测试一下可不可以人脸识别
上一节章的连接:
感兴趣的可以跳过去看一下。
现在我们来将训练好的dat模型导入,并且调用dlib的库。
# 导入训练好的模型文件
predictor = dlib.shape_predictor("D:/opencv/predictor.dat")
detector = dlib.get_frontal_face_detector()
2、将读取的图像转换为灰度图片,并且检测人脸
# 读取图像并将其转换为灰度图像
img = cv2.imread(image_path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
dets = detector(img_gray, 1)
print("Number of faces detected: {}".format(len(dets)))
在这里我们浅谈一下为什么要将图片的人脸转为灰度图
- 简化图像处理:灰度图像只包含亮度信息,而不包含颜色信息。这简化了图像处理的过程,因为只需处理单个通道的像素值而不是三个通道的像素值
- 提高计算效率:在人脸检测和关键点预测中,我们主要关注脸部的形状和结构,而不是颜色。通过将图像转换为灰度图像,可以减少计算量,加快算法的执行速度。
- 增强特征信息:灰度图像中的亮度信息更加突出,可以凸显人脸的边缘、纹理和形状信息。这对于人脸检测和关键点预测任务有帮助,因为关键点通常与人脸的边缘和结构相关联。
- 降低数据复杂性:如果图像是彩色的,它包含了大量的冗余信息,例如光照变化和颜色变化。将图像转换为灰度图像可以减少输入数据的复杂性,使算法更容易从中学习和提取有用的特征。
总之,将图像转换为灰度图像是在人脸检测和关键点预测任务中常用的预处理步骤,它简化了处理过程、提高了计算效率,并且可以突出显示人脸的结构和特征信息,有助于实现准确而高效的人脸分析。
3、遍历选中文件夹的检测到的每张人脸
# 遍历检测到的每张人脸
for index, face in enumerate(dets):
print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(), face.bottom()))
# 预测关键点位置
shape = predictor(img, face)
for index, pt in enumerate(shape.parts()):
print('Part {}: {}'.format(index, pt))
pt_pos = (pt.x, pt.y)
cv2.circle(img, pt_pos, 2, (255, 0, 0), 1)
在这里通过for遍历检测到的每张人脸,并且在打印出来先对应的信息
预测人脸关键点的位置,并在图像上绘制关键点这个我们需要来了解一下
首先,predictor
是一个 dlib 的人脸关键点预测器,通过对图像中的人脸区域进行预测,可以得到人脸的关键点位置。
接下来,在 shape = predictor(img, face)
这行代码中,predictor
接受两个参数:img
表示输入的图像,face
表示人脸检测器 detector
检测到的人脸区域。通过调用 predictor
,可以获得一个 shape
对象,其中包含了人脸关键点的位置信息。
然后,使用 for
循环遍历 shape.parts()
,它返回一个包含所有关键点的列表。在每次循环中,pt
表示一个关键点对象,其中包含了关键点的坐标信息。
在循环内部,通过 pt.x
和 pt.y
可以获取关键点的 x 坐标和 y 坐标。然后,使用 cv2.circle()
函数在图像上绘制一个小圆圈来表示关键点的位置。具体地,cv2.circle()
函数的参数依次为:图像 img
、关键点位置 (pt.x, pt.y)
、圆圈的半径大小 2、颜色 (255, 0, 0)
(这里是蓝色,因为 OpenCV 使用的是 BGR 色彩空间),以及圆圈的线宽度 1
4、在窗口显示结果图像
# 在图像窗口中显示结果
cv2.namedWindow(image_path, cv2.WINDOW_AUTOSIZE)
cv2.imshow(image_path, img)
注意:程序里面的文件路径需要修改自己的文件路径
5、源码如下 main.py
import os
import cv2
import dlib
import glob
def detect_and_predict(image_path):
"""
检测人脸并预测关键点位置,并在图像中显示结果。
参数:
image_path:图像文件的路径
"""
# 导入训练好的模型文件
predictor = dlib.shape_predictor("D:/opencv/predictor.dat")
detector = dlib.get_frontal_face_detector()
# 读取图像并将其转换为灰度图像
img = cv2.imread(image_path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
dets = detector(img_gray, 1)
print("Number of faces detected: {}".format(len(dets)))
# 遍历检测到的每张人脸
for index, face in enumerate(dets):
print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(), face.bottom()))
# 预测关键点位置
shape = predictor(img, face)
for index, pt in enumerate(shape.parts()):
print('Part {}: {}'.format(index, pt))
pt_pos = (pt.x, pt.y)
cv2.circle(img, pt_pos, 2, (255, 0, 0), 1)
# 在图像窗口中显示结果
cv2.namedWindow(image_path, cv2.WINDOW_AUTOSIZE)
cv2.imshow(image_path, img)
# 设置图像文件夹的路径
faces_folder = "D:/opencv"
print("Showing detections and predictions on the images in the faces folder...")
# 遍历图像文件夹中的每张图像
for image_path in glob.glob(os.path.join(faces_folder, "*.jpg")):
print("Processing file: {}".format(image_path))
detect_and_predict(image_path)
cv2.waitKey(0)
cv2.destroyAllWindows()
喜欢的可以点个关注,后续会出更多教程
6、效果图
是自己训练的可能效果不是很好,需要的可以评论,后台私信发送