deepface:实现人脸的识别和分析

news2024/12/23 23:46:45

deepface介绍

deepface能够实现的功能

人脸检测:deepface 可以在图像中检测出人脸的位置,为后续的人脸识别任务提供基础。

人脸对齐:为了提高识别准确性,deepface 会将检测到的人脸进行对齐操作,消除姿态、光照和表情等因素对识别结果的影响。

特征提取:deepface 使用卷积神经网络(CNN)对齐后的人脸图像进行特征提取,将人脸转换为高维特征向量。

人脸识别:通过比较特征向量之间的相似度,deepface 可以识别出图像中的人脸是否属于同一个人。

人脸验证:deepface 可以用于人脸验证任务,即判断给定的两张人脸图像是否属于同一个人。

人脸搜索:deepface 可以在大型人脸数据库中搜索特定人物,通过比较特征向量找到与目标人物最相似的人脸。

人脸跟踪:deepface 可以在视频序列中跟踪人脸,实现实时的人脸识别和分析。

人脸年龄分析:deepface 可以估计图像中的人脸年纪。

人脸表情识别:deepface 可以估计图像中的人脸表情。

人种识别:deepface 可以识别出图像中的人脸属于什么人种。

性别分析:deepface 可以识别出图像中的人脸是什么性别。

deepface功能的具体实现

1.人脸识别:识别两个人人脸是否属于同一个人

api:

各个参数的含义如下:

img1_path 和 img2_path:就是两张图片的路径,当然除了路径,还可以是 numpy 数组或 base64 字符串。verify 函数会将图像上的人脸部分表示为向量,然后计算相似度。如果其中一张图片出现了多张脸,比如 img1_path 里面有一张脸,但 img2_path 里面有三张脸,那么每一张脸都会进行比对,找到最相似的那一个。

model_name:deepface 已经集成了大量顶尖的人脸模型用于训练,比如:

"VGG-Face"、"OpenFace"、"Facenet"、"Facenet512"、"DeepFace"、"DeepID" "Dlib"、"ArcFace"、"SFace"、"Emotion"、"Age"、"Gender"、"Race"

喜欢哪个就用哪个,但是模型需要下载,如果 deepface 检测到当前机器上没有指定的模型,那么会自动下载。所以当前第一次执行上面代码的时候,会下载 VGG-Face 模型(大小有好几百 M)。关于这些模型的区别,有兴趣可以自己了解一下,我们直接使用默认的即可。

detector_backend:检测器后端,负责提供人脸识别算法,因为 deepface 所使用的算法是由其它模块提供的,默认是 opencv。但除了 opencv 之外,还有其它选择。

"opencv", "retinaface", "mtcnn", "ssd", "dlib", "mediapipe"

这些人脸检测器之间的区别,还是很重要的,我们来解释一下。

  • "opencv":最轻量级的人脸检测器,使用不基于深度学习技术的 haar-cascade 算法,因此速度很快,但准确率较低。而为了使 OpenCV 正常工作,需要正面图像,如果脸侧了一下或者局部发生遮挡,准确率就会受到影响。此外也不擅长对眼睛的检测,容易导致对齐问题。目前 DeepFace 使用的默认检测器就是 OpenCV。
  • "dlib":该检测器在后台使用 hog 算法,与 OpenCV 类似,它也不是基于深度学习的,但它的检测和对齐分数相对较高。
  • "ssd":单次检测器,它是一种流行的基于深度学习的检测器,但性能可与 OpenCV 相媲美。只是 SSD 不支持面部特征点,并且依赖于 OpenCV 的眼睛检测模块来对齐,因此尽管其检测性能很高,但对准分数仅为平均水平。
  • "mtcnn":基于深度学习的人脸检测器,并带有面部特征点,所以它的检测和对齐得分都很高但是,但速度比 OpenCV,SSD 和 Dlib 慢。另外 MTCNN 是一种多任务级联卷积神经网络的人脸检测算法,能够同时实现人脸检测、关键点定位和人脸对齐等功能。其对于大尺寸人脸的检测效果较好,并且模型规模相对于 RetinaFace 的较小。
  • "retinaface":一种基于卷积神经网络的人脸检测算法,具有高精度的特点,被公认为是最先进的人脸检测算法,但需要很高的计算能力。相比 MTCNN,检测小尺寸人脸的效果更好。

因此如果你希望结果更加精确,那么使用 RetinaFace 或 MTCNN;如果希望检测速度更快,比如清洗一部分没有人脸的照片,那么可以使用 OpenCV 或 SSD。

  • "opencv":最轻量级的人脸检测器,使用不基于深度学习技术的 haar-cascade 算法,因此速度很快,但准确率较低。而为了使 OpenCV 正常工作,需要正面图像,如果脸侧了一下或者局部发生遮挡,准确率就会受到影响。此外也不擅长对眼睛的检测,容易导致对齐问题。目前 DeepFace 使用的默认检测器就是 OpenCV。
  • "dlib":该检测器在后台使用 hog 算法,与 OpenCV 类似,它也不是基于深度学习的,但它的检测和对齐分数相对较高。
  • "ssd":单次检测器,它是一种流行的基于深度学习的检测器,但性能可与 OpenCV 相媲美。只是 SSD 不支持面部特征点,并且依赖于 OpenCV 的眼睛检测模块来对齐,因此尽管其检测性能很高,但对准分数仅为平均水平。
  • "mtcnn":基于深度学习的人脸检测器,并带有面部特征点,所以它的检测和对齐得分都很高但是,但速度比 OpenCV,SSD 和 Dlib 慢。另外 MTCNN 是一种多任务级联卷积神经网络的人脸检测算法,能够同时实现人脸检测、关键点定位和人脸对齐等功能。其对于大尺寸人脸的检测效果较好,并且模型规模相对于 RetinaFace 的较小。
  • "retinaface":一种基于卷积神经网络的人脸检测算法,具有高精度的特点,被公认为是最先进的人脸检测算法,但需要很高的计算能力。相比 MTCNN,检测小尺寸人脸的效果更好。

因此如果你希望结果更加精确,那么使用 RetinaFace 或 MTCNN;如果希望检测速度更快,比如清洗一部分没有人脸的照片,那么可以使用 OpenCV 或 SSD。

distance_metric:距离(面部嵌入)度量方法,可以是 cosine、euclidean 或 euclidean_l2。

enforce_detection:如果没有检测到人脸时,是否引发异常,可以将其设置为 False。

align:是否执行面部对齐。(使用面部对齐,消除姿态、光照和表情等因素对识别结果的影响。)

normalization:用于预处理图像的归一化技术。

代码实例:
 

results = DeepFace.verify(src_file_path_name,make_file_path_name,model_name="retinaface", detector_backend="retinaface",enforce_detection=False,align=True)
  • results["verified"] 是一个布尔值,如果相似度超过某个阈值则返回True,表示系统认为这两张图片是同一个人。
  • results["distance"] 是一个数值,通常来说,这个值越小,表明两张图片的相似度越高。

采用不同模型和不同的后端算法阈值的大小均有所不同,

  • 对于 FaceNet 模型,阈值可能设置在 0.40 左右。
  • 对于 VGG-Face 模型,阈值可能在 0.60 或更高。

 results["distance"]的值越小,代表两个人脸是同一个值

2.人脸识别:识别图片中存在多少个人脸

  results = DeepFace.extract_faces(
        pic,
        detector_backend="retinaface",
        enforce_detection=False)
    #print("result:", results)
    for result in results:
        face_area = result["facial_area"]
        cv2.rectangle(pic, (face_area['x'], face_area['y']),
                      (face_area['x'] + face_area['w'], face_area['y'] + face_area['h']), (255, 0, 0), 3)
    #判断双头结果
    if len(results)>1:
        cv2.imwrite(output_path_name, pic)
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as excutor:
    futures = []
    for imgname in tqdm(imgs_list):
        #遍历图片排除头的图像
        if "_head_" in imgname:
            continue
        #将图片全部加入任务
        path_filename = os.path.join(origin_path,imgname)
        task = excutor.submit(find_face,path_filename)
        futures.append(task)
    count = len(futures)
    print("共记录{}个任务".format(count))
    prad = tqdm(total=count,position=0)
    for future in concurrent.futures.as_completed(futures):
        prad.update(1)
        future.result()

 应用:此种情况一般应用于检测图片中是否出现了多头的情况,这种情况deepface的准确率达到了99%

3.人脸分析:使用deepface分析人的人种,人的性别,人的心情

# 使用deepface对人脸进行分析,作为评判生图合理性的标准之一
import time
from openpyxl.drawing.image import Image
from deepface import DeepFace
import cv2
import openpyxl
import os
from tqdm import tqdm
py_path = os.path.dirname(__file__)
imgs_path = "./inputDIc"
img_dirs = os.listdir(imgs_path)
OUTPUT_FILE =os.path.join(py_path,"analyze_{}.xlsx".format(time.strftime("%Y-%m-%d %H: %M: %S"),time.localtime()))
path_filename = "./Newoutputimages_2/0_head_pic_Anime_0_balanced.png"
wb = openpyxl.Workbook()
ws = wb.active
ws.append(["img","angry","disguest","fear","happy","sad","surprise","neutral","dominant_emotion","age","gender-women","gender-man","dominant_race"])
# 进行遍历
print(img_dirs)
print("共计{}张图片".format(len(img_dirs)))
for img_name in tqdm(img_dirs):
    path_filename = os.path.join(imgs_path,img_name)
    try:
        results = DeepFace.analyze(path_filename, detector_backend="retinaface", enforce_detection=False, align=True)
    except Exception as e:
        print("error:",e)
        ws.append([path_filename])
        continue
    result = results[0]
    ws.append([path_filename, result["emotion"]["angry"], result["emotion"]["disgust"], result["emotion"]["fear"],
               result["emotion"]["happy"], result["emotion"]["sad"], result["emotion"]["surprise"],
               result["emotion"]["neutral"], result["dominant_emotion"], result["age"], result["gender"]["Man"],
               result["gender"]["Woman"], result["dominant_gender"], result["dominant_race"]])

# print(results)
# print(len(results))
# result = results[0]
#加载图片
img = Image(path_filename)
#将分析结果写入excel表格中
wb.save(OUTPUT_FILE)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

硕士论文写的重复率 PaperBERT

大家好,今天来聊聊硕士论文写的重复率,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧: 硕士论文写的重复率 1. 硕士论文的重要性 硕士论文是硕士阶段最重要的学术成果之一,它不仅…

【普中开发板】基于51单片机电子钟闹钟设计( proteus仿真+程序+设计报告+讲解视频)

【普中开发板】基于51单片机电子钟闹钟数码管显示设计( proteus仿真程序设计报告讲解视频) Proteus 仿真:Proteus 8.16 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:P03 51单片机电子钟闹钟 1. 主要功能&a…

RK3568驱动指南|第八篇 设备树插件-第74章 虚拟文件系统ConfigFS介绍

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Vue router深入学习

Vue router深入学习 一、单页应用程序介绍 1.概念 单页应用程序:SPA【Single Page Application】是指所有的功能都在一个html页面上实现 2.具体示例 单页应用网站: 网易云音乐 https://music.163.com/ 多页应用网站:京东 https://jd.co…

人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码

人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码 目录 人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码 1. 前言 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&#xff1…

Python实战 | 如何抓取腾讯视频

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 爬虫: 作用: 批量采集数据 / 模拟用户行为 原理: 模拟成 客户端 向 服务器 发送网络请求 环境介绍: python 3.8 解释器 pycharm 编辑器 第三方模块: reques…

《地理信息系统原理》笔记/期末复习资料(12. 地理信息工程)

目录 12. 地理信息工程 12.1. 地理信息系统工程的概念 12.2. 地理信息系统工程建设过程 12.2.1. 应用型地理信息系统设计步骤和方法 12.2.2. 需求分析 12.2.3. 系统设计 12.2.4. 系统开发与实施 12.2.5. 系统的评价和维护 12.3. GIS标准 12.4. 习题 12. 地理信息工程…

java--Collection的常用方法

1.集合体系结构 ①Collection代表单列集合,每个元素(数据)只包含一个值 ②Map代表双列集合,每个元素包含两个值(键值对) 2.Collection集合体系 3.Collection集合特点 1.List系列集合:添加的元素是有序、可重复、有索引 ①ArrayList、Line…

Python接口自动化浅析requests请求封装原理

以下主要介绍如何封装请求 还记得我们之前写的get请求、post请求么? 大家应该有体会,每个请求类型都写成单独的函数,代码复用性不强。 接下来将请求类型都封装起来,自动化用例都可以用这个封装的请求类进行请求 将常用的get、p…

为什么现在招聘C++程序员这么难?

为什么现在招聘C程序员这么难? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「C的资料从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家!&#x…

mars3d加载arcgis发布的服务,⽀持4523坐标

问题 1.从这个服务地址加载,具体在哪⾥去转坐标呢? 加个 usePreCachedTilesIfAvailable:false 参数即可 坐标系为4490的arcgis影像服务图层,配置后瓦片加载不出来,没报错 甚至可以跳转 没有看出问题,或者测…

SD-WAN跨国网络加速的原理

许多企业需要在全球范围内高效传输和交流数据,然而,跨国网络连接面临着多种挑战,如网络延迟、拥塞和数据包丢失,这些问题可能会显著降低企业的运作效率和客户体验。为了克服这些问题,越来越多的企业正在采用SD-WAN跨国…

Java毕业设计——vue+SpringBoot汽车销售管理系统

项目介绍 本项目基于spring boot以及Vue开发,前端实现基于PanJiaChen所提供的开源后台项目vue-element-admin改造。 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能,提供经理和销售两种角色进行管理。 技术栈 前端 Vue…

使用Java将图片添加到Excel的几种方式

1、超链接 使用POI&#xff0c;依赖如下 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>Java代码如下,运行该程序它会在桌面创建ImageLinks.xlsx文件。 …

(七)函数

目录 1. 函数的概念 2. 库函数 2.1 标准库和头文件 2.2 库函数的使用方法 2.2.1 功能 2.2.2 头文件包含 2.2.3 库函数文档的一般格式 3. 自定义函数 3.1 函数的语法形式 4. 形参和实参 4.1 实参 4.2 形参 4.3 实参和形参的关系 5. return 语句 6. 数组做函数参数…

python将资源打包进exe

前言 之前py打包的exe一直是不涉及图片等资源的&#xff0c;直到我引入图片后打包&#xff0c;再双击exe发现直接提示未找到资源。 分析 我py代码中的图片引入使用的是项目相对路径&#xff0c;打包时pyinstaller只会引入py模块&#xff0c;这种路径引入的资源其实是不会打包…

生成式模型对比:扩散模型、GAN 与 VAE

引言 深度生成式模型应用于图像、音频、视频合成和自然语言处理等不同领域。随着深度学习技术的快速发展&#xff0c;近年来不同的深度生成模型出现了爆炸式的增长。这导致人们越来越有兴趣比较和评估这些模型的性能和对不同领域的适用性。在 本文中&#xff0c;我们的目标是…

RCG Self-conditioned Image Generation via Generating Representations

RCG: Self-conditioned Image Generation via Generating Representations TL; DR&#xff1a;将图像的无监督表征作为&#xff08;自&#xff09;条件&#xff08;而非是将文本 prompt 作为条件&#xff09;&#xff0c;生成与原图语义内容一致的多样且高质量结果。视觉训练能…

如何在Android中旋转屏幕时避免重新绘制Activity

如何在Android中旋转屏幕时避免重新绘制Activity 在Android开发中&#xff0c;设备旋转通常导致当前活动&#xff08;Activity&#xff09;被销毁并重新创建&#xff0c;这可能导致用户界面重置和不必要的资源重新加载。然而&#xff0c;有时我们希望避免这种行为&#xff0c;…