实现人脸识别、人脸68个特征点提取,或许这个 Python 库能帮到你

简介: 本次将借助于 dlib 程序包实现人脸区域检测、特征点提取等功能,dlib 封装了许多优秀的机器学习算法, 可实现人脸识别、检测、识别,视频目标追逐等功能,是由由 C++开发的一个开源程序库,目前也提供了 Python 接口,可供我们直接调用。

本次将借助于 dlib  程序包实现人脸区域检测、特征点提取等功能,

dlib 封装了许多优秀的机器学习算法, 可实现人脸识别、检测、识别,视频目标追逐等功能,是由由 C++开发的一个开源程序库,目前也提供了 Python 接口,可供我们直接调用。


1,dilb 安装

dlib 程序包的安装方式也是用 pip 来进行安装的,但不同于其它程序包的是,在输入

pip install dlib


之前,需要安装 Cmake 程序包,该工具主要是对 dlib 进行编译,安装命令与其他包类似

pip install Cmake


2,实现人脸识别

利用 dlib 实现人脸识别功能时,先定义一个检测器和一个 图片预览窗口:

detector = dlib.get_frontal_face_detector()
win = win = dlib.image_window()


之后利用  load_rgb_image()  函数读取图像:

img = dlib.load_rgb_image(f)


接下来进行核心功能人脸检测的实现,这里需要借助于上面定义得到的检测器

dets,score,idx = detector.run(img,1,-1)


img 就是我们读取后的图像,第二个参数 1 代表的是图片上采样倍数,值越大,最终识别得到的结果越好,-1 代表的是调整分割阈值,负值表示将返回更多检测结果


返回的 dets 返回的是一个人脸区域矩形,分别表示左,上、右、下边界,是 tuple 形式,如果检测出一个人脸,则为一个 tuple, 如果是多个人脸,将会把多个 tuple 放置在一个列表中;有个这个矩形坐标就可以做以下事情:

  • 人脸区域裁剪,进行区域提取;
  • 人脸区域线条标记

score  表示的是人脸识结果检测概率,越大代表识别出来的结果越好;如果一幅图有多个人脸,则返回多个检测概率以列表形式储存;idx 是用于在一副图检测出多个人脸是用的索引,可以对其进行索引

win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue


最后我们利用 前面定义的 win 窗口,进行图像预览,结果如下,

微信图片_20220520111926.jpgSnipaste_2020-06-01_23-43-59.png

当然也可以用 OpenCV 进行轮廓勾勒,OpenCV 勾勒结果如下( 有色差的原因是OpenCV 读取的是 BGR 通道顺序 );

微信图片_20220520111928.jpgSnipaste_2020-06-01_23-46-03.png


3,dlib 提取人脸68个特征点


OpenCV 也可以用于人脸识别,但效果不如 dlib ,除了上面提到的线框检测之外,dlib 还可以直接提取人脸上的 68 个特征点,作为坐标形式来返回;

有了这 68 个特征点的坐标,可以很方便地帮助我们实现人脸对齐、融合等应用,先看一下用 dlib 勾勒出来的效果

微信图片_20220520111930.jpgSnipaste_2020-06-02_14-48-24.png

与人脸识别不一样的是,这里需要加上一个形状检测器,形状检测器这里需要官网提供的文件、里面放置已经训练好的权重信息,可以直接使用,上面功能实现代码如下:

import dlib
import os
import cv2
predictor_path  = "E:/shape_predictor_68_face_landmarks.dat"#权重文件路径
png_path = "E:/ceshi.png"
detector = dlib.get_frontal_face_detector()
#相撞
predicator = dlib.shape_predictor(predictor_path)
win = dlib.image_window()
img =  dlib.load_rgb_image(png_path)
win.clear_overlay()
win.set_image(img1)
for k,d in enumerate(dets):
    print("Detection {}  left:{}  Top: {} Right {}  Bottom {}".format(
        k,d.left(),d.top(),d.right(),d.bottom()
    shape = predicator(img,d)
    #Get the landmarks/parts for face in box d
    print("Part 0:{},Part 1 :{}".format(shape.part(0),shape.part(1)))
    win.add_overlay(shape)
win.add_overlay(dets)
dlib.hit_enter_to_continue()


坐标点的获取可以通过 part(index) 函数获取

上面的坐标点,也可以通过 OpenCV 在原图上勾勒出来,并注释上文字,效果如下:

微信图片_20220520111932.jpgSnipaste_2020-06-02_15-02-38.png

附上完整代码:

import dlib
import os
import cv2
predictor_path  = "E:/shape_predictor_68_face_landmarks.dat"
png_path = "E:/ceshi.png"
detector = dlib.get_frontal_face_detector()
#相撞
predicator = dlib.shape_predictor(predictor_path)
win = dlib.image_window()
img1 = cv2.imread(png_path)
dets = detector(img1,1)
print("Number of faces detected : {}".format(len(dets)))
for k,d in enumerate(dets):
    print("Detection {}  left:{}  Top: {} Right {}  Bottom {}".format(
        k,d.left(),d.top(),d.right(),d.bottom()
    ))
    lanmarks = [[p.x,p.y] for p in predicator(img1,d).parts()]
    for idx,point in enumerate(lanmarks):
        point = (point[0],point[1])
        cv2.circle(img1,point,5,color=(0,0,255))
        font = cv2.FONT_HERSHEY_COMPLEX_SMALL
        cv2.putText(img1,str(idx),point,font,0.5,(0,255,0),1,cv2.LINE_AA)
        #对标记点进行递归;
cv2.namedWindow("img",cv2.WINDOW_NORMAL)
cv2.imshow("img",img1)
cv2.waitKey(0)


4,小总结

以上就是对 dlib 程序包的简单介绍,在人脸识别应用方面上 dlib 的表现相当不错的,有兴趣的同学可以去官网看关于 dlib 的详细介绍,自己闲余时间动手跟着敲一下。

相关文章
|
2月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
45 5
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
1月前
|
机器学习/深度学习 数据格式 Python
将特征向量转化为Python代码
将特征向量转化为Python代码
|
1月前
|
机器学习/深度学习 数据格式 Python
将特征向量转化为Python代码
将特征向量转化为Python代码
|
2月前
|
机器学习/深度学习 数据格式 Python
将特征向量转化为Python代码
将特征向量转化为Python代码
|
1月前
|
机器学习/深度学习 开发者 Python
Python中进行特征重要性分析的9个常用方法
在Python机器学习中,特征重要性分析是理解模型预测关键因素的重要步骤。本文介绍了九种常用方法:排列重要性、内置特征重要性(如`coef_`)、逐项删除法、相关性分析、递归特征消除(RFE)、LASSO回归、SHAP值、部分依赖图和互信息。这些方法适用于不同类型模型和场景,帮助识别关键特征,指导特征选择与模型解释。通过综合应用这些技术,可以提高模型的透明度和预测性能。
111 0
|
3月前
|
机器学习/深度学习 分布式计算 大数据
几行 Python 代码就可以提取数百个时间序列特征
几行 Python 代码就可以提取数百个时间序列特征
|
3月前
|
机器学习/深度学习 存储 算法
【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索Python代码baseline
本文通过可视化分析,总结了2024年考研国家分数线的变化趋势,指出管理类MBA降低5分,哲学、历史学、理学、医学等10个专业分数线上涨,而经济学等专业出现下降,反映出不同专业分数线受考生数量、竞争情况和政策调整等因素的影响。
66 2
【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索Python代码baseline
|
3月前
|
机器学习/深度学习 存储 算法
【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索Python代码实现
本文提供了2024泰迪杯B题“基于多模态特征融合的图像文本检索”的Python代码实现,包括问题分析、多模态特征提取、特征融合模型和算法的构建,以及如何使用召回率作为评价标准进行模型性能评估的详细说明。
51 2
【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索Python代码实现
|
3月前
|
数据采集 存储 算法
【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索20页论文及Python代码
本文介绍了2024年泰迪杯B题的解决方案,该题目要求构建基于多模态特征融合的图像文本检索模型和算法,通过深入分析和预处理数据集,构建了OFA、BertCLIP和ChineseCLIP三种多模态特征融合模型,并通过投票融合机制优化检索效果,实验结果表明所提模型在图像与文本检索任务中显著提高了检索准确性和效率。
105 2
|
3月前
|
机器学习/深度学习 人工智能 监控
利用Python和OpenCV实现实时人脸识别系统
【8月更文挑战第31天】本文将引导您了解如何使用Python结合OpenCV库构建一个简易的实时人脸识别系统。通过分步讲解和示例代码,我们将探索如何从摄像头捕获视频流、进行人脸检测以及识别特定个体。本教程旨在为初学者提供一条明晰的学习路径,帮助他们快速入门并实践人脸识别技术。