基于深度学习的人脸检测技术

news2024/11/15 16:28:16

  用到环境
1、pycharm community edition 2022.3.2
2、Python 3.10
整篇内容都已上传至我的csdn资源中,想用的请移步。
在这里插入图片描述

流程

  多任务级联卷积神经网络(Multi-task Cascaded Convolutional Networks, MTCNN)算法进行人脸检测

普通人脸检测

单人人脸检测

在这里插入图片描述

图1 单人人脸检测

  分析:可以看出在单人人脸检测时,MTCNN方法很好的画出了人脸的检测框以及很准确的检测出了眼睛、笔尖、嘴角的一共五个点,实现效果很好。

双人人脸检测

在这里插入图片描述

图2 双人人脸检测

  分析:可以看出在双人人脸检测时,MTCNN方法很好的画出了人脸的检测框以及不管是张嘴还是闭嘴都很准确的检测出了眼睛、笔尖、嘴角的一共五个点,实现效果很好。

多人人脸检测

在这里插入图片描述

图3 多人人脸检测

  分析:可以看出在多人人脸检测时,MTCNN方法依然能很好的画出了人脸的检测框以及准确的检测出了眼睛、笔尖、嘴角的一共五个点,实现效果很好。

特殊情况的人脸检测

侧拍

在这里插入图片描述

图4 侧拍角度人脸检测

  分析:可以看出在即使在侧拍角度,五官的位置相较于普通情况很不一样,MTCNN方法还是可以很好的画出了人脸的检测框以及很准确的检测出了眼睛、笔尖、嘴角的一共五个点,实现效果很好。

  在侧拍照片中,由于人脸的姿态发生了变化,传统的基于Haar或者HOG特征的人脸检测算法可能无法准确地检测出人脸区域,而MTCNN可以通过多尺度的滑动窗口搜索技术,在不同尺度下对人脸进行全局检测。同时,MTCNN中的关键点回归模块可以通过学习人脸形态学信息,准确地预测出人脸的五个关键点位置,即左眼、右眼、鼻子、左嘴角和右嘴角。

  因此,即使是在侧拍照片中,MTCNN也可以通过深度神经网络的强大表征能力和多任务学习的方法,实现对人脸区域的准确检测和关键点的精确定位。

有遮挡

在这里插入图片描述

图5 有遮挡人脸检测
  分析:可以看出在即使在眼睛戴墨镜有遮挡的情况下,MTCNN方法还是可以很好的画出了人脸的检测框以及很准确的检测出了眼睛、笔尖、嘴角的一共五个点,实现效果很好。

  可能原因是:虽然戴着眼镜的人脸与不戴眼镜的人脸在外观上存在差异,但是这些关键点位置通常是比较稳定的,并且MTCNN在训练过程中已经学习到了戴眼镜人脸的特征,所以在实际应用中,MTCNN可以很好地检测带眼镜的人脸关键点。

类人生物

在这里插入图片描述

图6 复杂情况人脸检测
  分析:可以看出在即使在有闭眼、出现猪鼻子的情况下,MTCNN方法还是可以很好的画出了人脸的框以及很准确的检测出了眼睛、笔尖、嘴角的一共五个点,实现效果很好。

  可能原因:虽然猪鼻子和人的鼻子的人脸以及睁眼和闭眼在外观上存在差异,但是这些关键点位置通常是比较稳定的,并且MTCNN在训练过程中已经学习到了戴眼镜人脸的特征,所以在实际应用中,MTCNN可以很好地检测带眼镜的人脸关键点。

人脸对齐问题

在这里插入图片描述

图7 人脸检测对齐结果

  分析:以上是两组人脸对齐的实验结果,可以看出通过将检测到的人脸关键点与参考关键点进行比较的方法可以很好的进行人脸对齐。

在这里插入图片描述

图8 人脸检测对齐异常结果

  分析:以上是一组人脸对齐的实验结果,可以看出通过将检测到的人脸关键点与参考关键点进行比较的方法可以很好的进行人脸对齐,只是对齐结果的图片顶部出现不明黑色区域。出现原因是人脸对齐的框的大小是实现给定的固定值,当人脸对齐的结果在边缘(这里在顶部)且小于给定值时,会用黑色填充空白区域。

更多面部特征点提取问题

在这里插入图片描述

图9 dlip更多面部特征点提取结果

  分析:以上是dlip更多面部特征点提取结果,左边是单人的面部特征点提取结果,右边是多人的面部特征点提取结果。可以看出与MTCNN相比,DLIP确实可以检测更多的面部特征点,而且实现效果好。

代码:

主函数
import cv2
from mtcnn import MTCNN

detector = MTCNN()

image = cv2.cvtColor(cv2.imread("12.jpg"), cv2.COLOR_BGR2RGB)
result = detector.detect_faces(image)

# Result is an array with all the bounding boxes detected. We know that for 'ivan.jpg' there is only one.
for person in result:
    bounding_box = person['box']
    keypoints = person['keypoints']

    cv2.rectangle(image,
                  (bounding_box[0], bounding_box[1]),
                  (bounding_box[0]+bounding_box[2], bounding_box[1] + bounding_box[3]),
                  (0,155,255),
                  2)

    cv2.circle(image,(keypoints['left_eye']), 2, (0,155,255), 2)
    cv2.circle(image,(keypoints['right_eye']), 2, (0,155,255), 2)
    cv2.circle(image,(keypoints['nose']), 2, (0,155,255), 2)
    cv2.circle(image,(keypoints['mouth_left']), 2, (0,155,255), 2)
    cv2.circle(image,(keypoints['mouth_right']), 2, (0,155,255), 2)


cv2.imwrite("12_draw.jpg", cv2.cvtColor(image, cv2.COLOR_RGB2BGR))

print(result)

人脸对齐

import cv2
import numpy as np
from mtcnn import MTCNN

# Define the reference landmarks that the face will be aligned to
ref_landmarks = np.array([
    [30.2946, 51.6963],
    [65.5318, 51.5014],
    [48.0252, 71.7366],
    [33.5493, 92.3655],
    [62.7299, 92.2041]
], dtype=np.float32)

def align_face(img, landmarks):
    # Convert landmarks to a NumPy array
    landmarks = np.array([list(landmarks.values())], dtype=np.float32)

    # Calculate the transformation matrix using the reference and detected landmarks
    M, _ = cv2.estimateAffinePartial2D(landmarks, ref_landmarks)

    # Apply the transformation matrix to the image
    aligned_img = cv2.warpAffine(img, M, (96, 112), flags=cv2.INTER_CUBIC)

    return aligned_img

# Load the input image
img = cv2.imread('3.jpg')

# Initialize MTCNN
detector = MTCNN()

# Detect faces using MTCNN
faces = detector.detect_faces(img)

# For each detected face, align the face and save the result
for face in faces:
    landmarks = face['keypoints']
    aligned_face = align_face(img, landmarks)
    cv2.imwrite('3_aligned_face.jpg', aligned_face)

更多面部特征点提取问题

import cv2
import dlib
# 读取图片
img_path = "1.jpg"
img = cv2.imread(img_path)
# 转换为灰阶图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 正向人脸检测器
detector = dlib.get_frontal_face_detector()
# 使用训练完成的68个特征点模型
predictor_path = "shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)
# 使用检测器来检测图像中的人脸
faces = detector(gray, 1)
for i, face in enumerate(faces):
    # 获取人脸特征点
    shape = predictor(img, face)
    # 遍历所有点
    for pt in shape.parts():
        # 绘制特征点
        pt_pos = (pt.x, pt.y)
        cv2.circle(img, pt_pos, 1, (255,0, 0), 2)
cv2.imshow('opencv_face_laowang',img)  # 显示图片
cv2.waitKey(0) # 等待用户关闭图片窗口
cv2.destroyAllWindows()# 关闭窗口

编写不易,求个点赞!!!!!!!
“你是谁?”

“一个看帖子的人。”

“看帖子不点赞啊?”

“你点赞吗?”

“当然点了。”

“我也会点。”

“谁会把经验写在帖子里。”

“写在帖子里的那能叫经验贴?”

“上流!”
cheer!!!

在这里插入图片描述

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

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

相关文章

我最喜欢的编程语言是python,以及我的见解!!

这里写目录标题 我最喜欢的编程语言:1、我个人认为编程语言优劣的评选标准2、我对不同编程语言的优点与缺点的拙见**1. Java****2. Python****3. JavaScript****4. C语言:****5. C语言:** 3、对python编程语言未来发展的猜测和未来趋势 我最喜…

Vicuna-13B使用云服务器部署

Vicuna概述 Vicuna由一群主要来自加州大学伯克利分校的研究人员推出,仍然是熟悉的配方、熟悉的味道。Vicuna同样是基于Meta开源的LLaMA大模型微调而来,它的训练数据是来自ShareGPT上的7万多条数据(ShareGPT一个分享ChatGPT对话的谷歌插件&am…

kerberos配置dolphinscheduler

kerberos配置dolphinscheduler 一、添加dolphin 用戶1.所有節點上執行如下命令: 二、DolphinScheduler集群模式部署1.集群规划2.前置准备工作3.解压DolphinScheduler安装包4. 创建元数据库及用户5. 配置一键部署脚本6 初始化数据库7.修改common配置文件8. 一键部署D…

华为、思科和瞻博网络三个厂商如何配置基本ACL和高级ACL?

今天给大家带来基本ACL和高级ACL的配置,主要会介绍三个厂商的配置: 其他厂商也可以参考,比如华三的可以参考华为的,锐捷的参考思科的。 1. 基本ACL配置 基本ACL(Access Control List)是一种简单的网络安全…

【Java高级语法】(十二)可变参数:Java中的“可变之美“,做好这些细节,你的程序强大又灵活~

Java高级语法详解之可变参数 🔹 前言1️⃣ 概念2️⃣ 优势和缺点3️⃣ 特征和应用场景3.1 特征3.2 应用场景 4️⃣ 使用和原理5️⃣ 使用技巧5.1 可变参数结合泛型5.2 使用元组或列表进行参数传递5.3 使用默认值5.4 缓存计算结果 6️⃣ 实战:构建动态日志…

【Vue3+Ts project】认识 Websocket 以及 socket.io 库

目录 Websocket socket.io Socket.iO 事件名总结: Socket.IO 方法总结 Websocket 作用: WebSocket 仍然提供实时的双向通信功能,使用Vue3 应用程序能够与服务器进行实时数据交换降低延迟和网络开销:相比传统的HTTP请求-响…

scratch lenet(7): C语言计算可学习参数数量和连接数量

scratch lenet(7): C语言计算可学习参数数量和连接数量 1. 目的 按照 LeNet-5 对应的原版论文 LeCun-98.pdf 的网络结构,算出符合原文数据的“网络每层可学习参数数量、连接数量”。 网络上很多人的 LeNet-5 实现仅仅是 “copy” 现有的别人的项目, 缺…

求2的N次幂(C++)解决高精度运算

​👻内容专栏:《C/C专栏》 🐨本文概括: 计算高精度的2的N次方数字。 🐼本文作者:花 碟 🐸发布时间:2023.6.22 文章目录 ​前言求2的N次方,N ≤ 10000实现思路&#xff1a…

SpringBoot 如何使用 @PathVariable 进行数据校验

SpringBoot 如何使用 PathVariable 进行数据校验 在 SpringBoot 项目中,我们经常需要从 URL 中获取参数并进行相关的数据校验。而 PathVariable 注解就是一种非常方便的方式,可以让我们在方法参数中直接获取 URL 中的参数,并进行数据校验。本…

基于python开发实现数学中各种经典曲线的可视化

今天正好有点时间就想着把之前零星时间里面做的一点小东西整合一下梳理出来,本文的核心目的就是想要基于python来开发实现各种有趣的数学曲线的可视化展示。 笛卡尔心形线 笛卡尔心形线是一种二维平面曲线,由法国数学家笛卡尔在17世纪提出。它得名于其…

基于springboot+Redis的前后端分离项目(三)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 优惠券秒杀 优惠券秒杀1 -全局唯一ID2 -Redis实现全局唯一Id3 添加优惠卷4 实现秒杀下单5 库存超卖问题分析6 优惠券秒杀-一人一单…

Spring Boot 异常处理的主要特点

Spring Boot 异常处理的主要特点 在 Web 应用程序中,异常处理是非常重要的一部分。在 Spring Boot 中,异常处理是非常简单和灵活的。本文将介绍 Spring Boot 异常处理的主要特点,并提供一些示例代码来帮助您更好地理解。 异常处理的主要特点…

王道计算机网络学习笔记(1)——计算机网络基本知识

前言 文章中的内容来自B站王道考研计算机网络课程,想要完整学习的可以到B站官方看完整版。 一:计算机网络基本知识 1.1.1:认识计算机网络 计算机网络的功能 网络把许多计算机连接在一起,而互联网则将许多网络连接在一起&#x…

第一章JavaScript简介

第一章JavaScript简介 js是一门,高级,动态,解释型编程语言 每种语言都必须有一个平台或标准库,用于执行包括基本输入和输出在内的基本操作.核心js语言定义了最小限度的API,可以操作数组,文本,数组,集合,映射等,但不包括任何输入输出的功能.输入和输出(以及更加复杂的特性,如联…

基于Servlet实现分页查询

Servlet JSPJSTL MySQLBootstrap 等技术实现分页查询功能。 所用工具:IDEA 2022.3.3 Navicat Tomcat 等。 本文目录 一:运行效果 二:代码详解 (1)index.jsp (2)PageBean &#xff08…

图解操作系统笔记

硬件基础 CPU是如何执行程序的? 程序执行的基本过程 第一步,CPU 读取「程序计数器」的值,这个值是指令的内存地址,然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址,接着通知内存设备准备数据&#…

python:并发编程(十七)

前言 本文将和大家一起探讨python并发编程的实际运用,会以一些我实际使用的案例,或者一些典型案例来分享。本文使用的案例是我实际使用的案例(中篇),是基于之前效率不高的代码改写成并发编程的。让我们来看看改造的过…

excel数据的编排与整理——行列的批量处理

excel数据的编排与整理——行列的批量处理 1 一次性插入多行多列 1.1 插入连续行 1.1.0 题目内容 1.1.1 选中插入的位置➡按住shift键➡往下选中2行 1.1.2 鼠标右击➡点击插入 1.1.3 插入后的效果 1.2 插入不连续行 1.2.0 题目内容 1.2.1 按下ctrl键➡选中插入的位置,需要插…

7.4_1B树(二序查找树BST的升级版)

如果需要查找的值比节点小,会向左子树方向查找,如果比节点值大,会向右子树方向查找 拓展为5叉的形态 5叉排序树的定义 num是这个节点中真实存在的节点个数 那么一个节点中 最少有1个关键字,两个分叉 最多有4个关键字&#xff0c…

数据结构:二叉树详解

目录 概念(在做习题中常用的概念) 两种特殊的二叉树 二叉树的性质 二叉树的遍历(重点) 如上图: 二叉树的构建(代码表示一颗二叉树和一些操作二叉树的方法) 二叉树的oj习题讲解&#xff0…