基于深度学习的人脸识别与检测方案

news2024/12/23 23:53:56

 一、项目介绍前言

  人脸识别作为一种生物特征识别技术,具有非侵扰性、非接触性、友好性和便捷性等优点。人脸识别通用的流程主要包括人脸检测、人脸裁剪、人脸校正、特征提取和人脸识别。人脸检测是从获取的图像中去除干扰,提取人脸信息,获取人脸图像位置,检测的成功率主要受图像质量,光线强弱和遮挡等因素影响。下图是整个人脸检测过程。

二、识别检测方法传统识别方法

  (1)基于点云数据的人脸识别

  (2)基于面部特征的3D人脸识别深度学习识别方法

  (1)基于深度图的人脸识别

  (2)基于RGB-3DMM的人脸识别

  (3)基于RGB-D的人脸识别 本文方法关键点定位概述

  一般人脸中有5个关键点,其中包括眼睛两个,鼻子一个,嘴角两个。还可以细致的分为68个关键点,这样的话会概括的比较全面,我们本次研究就是68个关键点定位。

上图就是我们定位人脸的68个关键点,其中他的顺序是要严格的进行排序的。从1到68点的顺序不能错误。项目解析 使用机器学习框架dlib做本次的项目。首先我们要指定参数时,要把dlib中的68关键点人脸定位找到。设置出来的68关键点人脸定位找到。并且设置出来。

  from collecTIons import OrderedDict

  import numpy as np

  import argparse

  import dlib

  import cv2

  首先我们导入工具包。其中dlib库是通过这个网址http://dlib.net/files/进行下载的。然后我们导入参数。

  ap = argparse.ArgumentParser()

  ap.add_argument(“-p”, “--shape-predictor”, required=True,

  help=“path to facial landmark predictor”)

  ap.add_argument(“-i”, “--image”, required=True,

  help=“path to input image”)

  args = vars(ap.parse_args())

  这里我们要设置参数,--shape-predictor shape_predictor_68_face_landmarks.dat --image images/lanqiudui.jpg。

  如果一张图像里面有多个人脸,那么我们分不同部分进行检测,裁剪出来所对应的ROI区域。我们的整体思路就是先检测人脸所在的一个区域位置,然后检测鼻子相对于人脸框所在的一个位置,比如说人的左眼睛在0.2w,0.2h的人脸框处。

  FACIAL_LANDMARKS_68_IDXS = OrderedDict([

  (“mouth”, (48, 68)),

  (“right_eyebrow”, (17, 22)),

  (“left_eyebrow”, (22, 27)),

  (“right_eye”, (36, 42)),

  (“left_eye”, (42, 48)),

  (“nose”, (27, 36)),

  (“jaw”, (0, 17))

  ])

  这个是68个关键点定位的各个部位相对于人脸框的所在位置。分别对应着嘴,左眼、右眼、左眼眉、右眼眉、鼻子、下巴。

  FACIAL_LANDMARKS_5_IDXS = OrderedDict([

  (“right_eye”, (2, 3)),

  (“left_eye”, (0, 1)),

  (“nose”, (4))

  ])

  如果是5点定位,那么就需要定位左眼、右眼、鼻子。0、1、2、3、4分别表示对应的5个点。

  detector = dlib.get_frontal_face_detector()

  predictor = dlib.shape_predictor(args[“shape_predictor”])

  加载人脸检测与关键点定位。加载出来。其中detector默认的人脸检测器。然后通过传入参数返回人脸检测矩形框4点坐标。其中predictor以图像的某块区域为输入,输出一系列的点(point locaTIon)以表示此图像region里object的姿势pose。返回训练好的人脸68特征点检测器。

  image = cv2.imread(args[“image”])

  (h, w) = image.shape[:2]

  width=500

  r = width / float(w)

  dim = (width, int(h * r))

  image = cv2.resize(image, dim, interpolaTIon=cv2.INTER_AREA)

  gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  这里我们把数据读了进来,然后进行需处理,提取h和w,其中我们自己设定图像的w为500,然后按照比例同比例设置h。然后进行了resize操作,最后转化为灰度图。

  rects = detector(gray, 1)

  这里调用了detector的人脸框检测器,要使用灰度图进行检测,这个1是重采样个数。这里面返回的是人脸检测矩形框4点坐标。然后对检测框进行遍历

  for (i, rect) in enumerate(rects):

  # 对人脸框进行关键点定位

  # 转换成ndarray

  shape = predictor(gray, rect)

  shape = shape_to_np(shape)

  这里面返回68个关键点定位。shape_to_np这个函数如下。

  def shape_to_np(shape, dtype=“int”):

  # 创建68*2

  coords = np.zeros((shape.num_parts, 2), dtype=dtype)

  # 遍历每一个关键点

  # 得到坐标

  for i in range(0, shape.num_parts):

  coords[i] = (shape.part(i).x, shape.part(i).y)

  return coords

  这里shape_to_np函数的作用就是得到关键点定位的坐标。

  for (name, (i, j)) in FACIAL_LANDMARKS_68_IDXS.items():

  clone = image.copy()

  cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,

  0.7, (0, 0, 255), 2)

  # 根据位置画点

  for (x, y) in shape[i:j]:

  cv2.circle(clone, (x, y), 3, (0, 0, 255), -1)

  # 提取ROI区域

  (x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))

  roi = image[y:y + h, x:x + w]

  (h, w) = roi.shape[:2]

  width=250

  r = width / float(w)

  dim = (width, int(h * r))

  roi = cv2.resize(roi, dim, interpolaTIon=cv2.INTER_AREA)

  # 显示每一部分

  cv2.imshow(“ROI”, roi)

  cv2.imshow(“Image”, clone)

  cv2.waitKey(0)

  这里字典FACIAL_LANDMARKS_68_IDXS.items()是同时提取字典中的key和value数值。然后遍历出来这几个区域,并且进行显示具体是那个区域,并且将这个区域画圆。随后提取roi区域并且进行显示。后面部分就是同比例显示w和h。然后展示出来。

  output = visualize_facial_landmarks(image, shape)

  cv2.imshow(“Image”, output)

  cv2.waitKey(0)

  最后展示所有区域。 其中visualize_facial_landmarks函数就是:

  def visualize_facial_landmarks(image, shape, colors=None, alpha=0.75):

  # 创建两个copy

  # overlay and one for the final output image

  overlay = image.copy()

  output = image.copy()

  # 设置一些颜色区域

  if colors is None:

  colors = [(19, 199, 109), (79, 76, 240), (230, 159, 23),

  (168, 100, 168), (158, 163, 32),

  (163, 38, 32), (180, 42, 220)]

  # 遍历每一个区域

  for (i, name) in enumerate(FACIAL_LANDMARKS_68_IDXS.keys()):

  # 得到每一个点的坐标

  (j, k) = FACIAL_LANDMARKS_68_IDXS[name]

  pts = shape[j:k]

  # 检查位置

  if name == “jaw”:

  # 用线条连起来

  for l in range(1, len(pts)):

  ptA = tuple(pts[l - 1])

  ptB = tuple(pts[l])

  cv2.line(overlay, ptA, ptB, colors[i], 2)

  # 计算凸包

  else:

  hull = cv2.convexHull(pts)

  cv2.drawContours(overlay, [hull], -1, colors[i], -1)

  # 叠加在原图上,可以指定比例

  cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)

  return output

  这个函数是计算cv2.convexHull凸包的,也就是下图这个意思。

这个函数cv2.addWeighted是做图像叠加的。

  src1, src2:需要融合叠加的两副图像,要求大小和通道数相等 alpha:src1 的权重 beta:src2 的权重 gamma:gamma 修正系数,不需要修正设置为 0 dst:可选参数,输出结果保存的变量,默认值为 None dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如 RGB 用三个字节表示,则为 24 位),选默认值 None 表示与源图像保持一致。 dst = src1 × alpha + src2 × beta + gamma;上面的式子理解为,结果图像 = 图像 1× 系数 1+图像 2× 系数 2+亮度调节量。

【以上信息由艾博检测整理发布,如有出入请及时指正,如有引用请注明出处,欢迎一起讨论,我们一直在关注其发展!专注:CCC/SRRC/CTA/运营商入库】

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

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

相关文章

使用ASM在Android中进行字节码注入

目录 使用方法 1.编译使用插件 这里自定义了一个插件用来对字节码进行操作 首先我们需要找到这个Gradle任务,双击进行编译打包 打包成功后会生成如下目录 然后我们需要在项目的gradle文件中进行引用 然后在application的model下的gradle中应用插件 2.使用ASM清…

【裸机开发】中断系统(二)—— Reset 中断服务函数(汇编实现)

目录 一、Reset 中断服务函数的实现步骤 二、汇编实现 Reset 中断服务函数 1、禁止/打开全局中断 2、设置SP指针 3、清除 .bss 段 4、完整 Reset 中断服务函数 一、Reset 中断服务函数的实现步骤 实现 Reset 中断服务函数的基本步骤如下: 设置各个模式下的S…

发布Android Lib 到 MavenCentral

新建 Sonatype 项目 注册账号: https://issues.sonatype.org/secure/Signup!default.jspa 这里注册不需要什么验证码,很简单。 创建问题 点击新建: 概要:自定义,写项目名称即可。 GroupId:如果是git…

C语音:打印整数二进制的奇数位和偶数位

题目: 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 思路: 总体思路: (一). 输入数据 (二). 打印奇数位: 使用 for循环 循环产生 1~32 之间的偶…

2023年5月 青少年软件编程(图形化) 等级考试试卷(一级)

青少年软件编程(图形化) 等级考试试卷(一级)2023.6 一、 单选题(共 25 题, 共 50 分) 1.看图找规律, 请问下图红框中是? ( ) A. B. C. D. 标准答案: D 试题解…

centos系统把.net6 web api部署到docker

为了搞定docker是怎么部署的,做个笔记 前提条件准备一个core项目,使用vs自带的docker打包假如你选择docker支持的时候不小心安装了Docker Desktop;还可以简单的先部署到本地docker中发布到centosdocker常用命令 前提条件 一台centos 8.0 版本以上的linu…

软件测试的7年,我秃了,也变强了...

当前就业环境,裁员、失业消息满天飞,好像能有一份工作就不错了,更别说高薪。其实这只是一方面。另一方面,各大企业依然求贤若渴,高技术人才依然紧缺,只要技术过硬,拿个年包50w不是问题。 人生格…

i.MX RT1010跨界MCU(MCUXpresso IDE上手体验)

MCUXpresso IDE是专为NXP半导体的基于ARM Cortex-M内核的MCU芯片开发而设计的,其优势主要体现在以下几个方面: MCUXpresso IDE集成了MCUXpresso SDK,这是NXP提供的一个软件开发套件,包含了底层驱动、中间件以及大量的示例代码和应…

Charles Windows10使用 证书安装 过期重设 证书加入到受信任根目录 配置访问WhatsApp

普通教程文档 抓包神器 Charles 使用教程详解 - 知乎 界面选项详细讲解 Charles的功能介绍与使用教程,一学就会,不信就来试试? 疑难杂症 由于CA 根证书不在“受信任的根证书颁发机构”存储区中,所以它不受信任 1、winr 运行…

SandQuant停止运营,免费获取A股数据

亲爱的各位朋友们: SandQuant即日起不再对外提供任何服务,为了感恩曾经支持过我们的客户朋友,现免费提供所有A股数据(数据非常庞大,请酌情下载),请通过链接自取。 请关注我们获取链接&#xff…

产品不可或缺的文档——帮助文档

在互联网时代,产品的更新迭代速度越来越快,产品功能也越来越复杂,为了让用户能够更好地理解和使用产品,帮助文档逐渐成为了产品不可或缺的一部分。本文将从帮助文档的作用、设计原则、撰写技巧等方面探讨帮助文档的重要性及如何编…

【AI面试】损失函数(Loss),定义、考虑因素,和怎么来的

神经网络学习的方式,就是不断的试错。知道了错误,然后沿着错误的反方向(梯度方向)不断的优化,就能够不断的缩小与真实世界的差异。 此时,如何评价正确答案与错误答案,错误的有多么的离谱,就需要一个评价指标。这时候,损失和损失函数就运用而生。 开始之前,我们先做…

MySQL数据库——初步安装与数据表结构数据管理

MySQL数据库——初步安装与数据表结构数据管理 一、数据库的基本概念1.数据库基本常识2.数据库系统发展史 二、数据库的分类1.关系数据库(SQL)2.非关系数据库(NO SQL) 三、mysql的数据类型1.常用的数据库类型2.char与varchar的区别…

ijkplayer 支持srt协议 rtmp协议编译步骤

写在前面 ffafaf这个编译真的太垃圾了 一堆毛病 感受下webrtc 傻瓜式编译 环境首先必须ndk 是android-ndk-r15c 或者 android-ndk-r14b ubuntu 系统随便22或者20,18都行 有个非常重要的点python必须是2.7 不然你会看到一大堆报错 高版本的ubuntu默认都是python3…

回溯算法基本思想及其实现

文章目录 基本思想回溯算法的递归框架组合问题组合总和组合去重子集全排列 基本思想 回溯算法是一种递归算法,它试图通过尝试不同的选择,解决一个问题。它的基本思想是从可能的决策开始搜索,如果发现这条路往下走不能得到有效的解答&#xf…

12-事件模型(也就是一个先后触发顺序)

一、事件与事件流 HTML文档、浏览器中发生的一种交互。使得具备互动性,加载、鼠标、自定义事件。 由于DOM是一个树结构,意味着标签存在嵌套关系,当绑定事件的时候,当触发子节点的时候,一个顺序问题,概念-事…

人机交互学习-4 交互设计过程

交互设计过程 交互设计过程基本活动关键特征 设计过程中的问题如何选取用户?如何明确需求?如何提出候选方案?如何在候选方案中选择? 交互设计生命周期模型星型生命周期模型可用性工程生命周期模型 交互设计过程管理界面设计的4个支…

这三个方法可以视频音频转换你知道吗?

小明:你听说过音频转换吗?最近我在学习音乐制作,发现这个功能特别有用! 小红:啊,好像没有听说过。它是用来干嘛的? 小明:简单来说,就是可以将不同格式的音频文件进行转…

嵌入式Linux应用开发笔记:串口

文章目录 目的基础说明开发准备设备树应用程序 应用程序与演示代码演示 总结设备树文件 目的 串口(UART)是嵌入式设备中比较常用的功能。这篇文章将记录下应用程序中串口操作相关内容。 这篇文章中内容均在下面的开发板上进行测试: 《新唐N…

阿里 P8 架构师总结的 Java 面试笔记,上线仅七天,Github 标星 55K

作为一名优秀的程序员,技术面试是不可避免的一个环节,一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 如果你参加过一些大厂面试,肯定会遇到一些这样的问题: 1、看你项目都用的框架,熟悉 …