头部姿态估计代码+教程

前言

在这里插入图片描述

  • 头部姿态估计是计算机视觉中的一个具有挑战性的问题,因为它需要完成多个步骤。
  • 首先,我们需要在画面中定位人脸,然后识别出各种面部特征点。
  • 如今,当人脸正对摄像头时,识别人脸似乎是一个简单的任务。但问题在于,当人脸处于某个角度时,由于头部的移动,某些面部特征点可能不可见。
  • 接下来,我们需要将这些点转换成三维坐标来计算倾斜角度。听起来工作量很大?别担心,我们会一步步来,并参考两个非常棒的资源,这将使我们的工作变得容易得多。

目录

  • 要求
  • 人脸检测
  • 面部特征点检测
  • 姿态估计

要求
对于这个项目,我们需要OpenCV和TensorFlow,让我们安装它们吧。

使用pip

pip install opencv-python
pip install tensorflow

使用conda

conda install -c conda-forge opencv
conda install -c conda-forge tensorflow

人脸检测

我们的第一步是在图像上找到人脸,以便我们可以在上面找到面部特征点。为此,我们将使用OpenCV DNN模块的一个Caffe模型。如果你想知道它与其他模型(如Haar级联或Dlib的正面人脸检测器)相比如何,或者你想深入了解它,可以参阅这篇文章:

import cv2
import numpy as np
modelFile = "models/res10_300x300_ssd_iter_140000.caffemodel"
configFile = "models/deploy.prototxt.txt"
net = cv2.dnn.readNetFromCaffe(configFile, modelFile)
img = cv2.imread('test.jpg')
h, w = img.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(img, (300, 300)), 1.0,
(300, 300), (104.0, 117.0, 123.0))
net.setInput(blob)
faces = net.forward()
# 在图片上绘制人脸框
for i in range(faces.shape[2]):confidence = faces[0, 0, i, 2]if confidence > 0.5:box = faces[0, 0, i, 3:7] * np.array([w, h, w, h])(x, y, x1, y1) = box.astype("int")cv2.rectangle(img, (x, y), (x1, y1), (0, 0, 255), 2)

加载网络使用cv2.dnn.readNetFromCaffe并传递模型层和权重作为参数。它在调整为300x300大小的图像上表现最好。

面部特征点检测

最常用的可能是Dlib的面部特征点检测,它可以提供68个特征点,但准确性不高。相反,我们将使用Yin Guobing在GitHub仓库提供的面部特征点检测器。它同样提供了68个特征点,并且是一个基于TensorFlow的CNN,在五个数据集上训练!预训练模型可在此处找到。作者撰写了一系列文章解释了包括背景、数据集、预处理、模型架构、训练和部署等内容,这里强烈推荐你阅读。

在这一系列的第一篇文章中,他描述了视频中面部特征点稳定性的问题,并介绍了现有的解决方案,如OpenFace和Dlib的面部特征点检测,以及可用的数据集。第三篇文章全是关于数据预处理和使其准备好使用。接下来的两篇文章的工作是提取面部并应用面部特征点以准备训练CNN,并将它们存储为TFRecord文件。第六篇文章使用TensorFlow训练了一个模型。在这篇文章中,我们可以看到损失函数在训练中的重要性,因为最初他使用了tf.losses.mean_pairwise_squared_error,它基于点之间的关系进行优化以最小化损失,但无法很好地泛化。相比之下,使用tf.losses.mean_squared_error时效果很好。在最后一篇文章中,模型被导出为API,并展示了如何在Python中使用它。
在这里插入图片描述

该模型接受包含脸部的128x128大小的方框,并返回68个面部特征点。下面提供的代码来自此处,也可以用来在其上绘制3D注释框。代码经过修改,可以在所有脸上绘制面部特征点,而不仅仅是原始代码中的一个。

这段代码将在脸上绘制面部特征点。

绘制面部特征点

使用draw_annotation_box()函数,我们还可以如下所示绘制注释框。
在这里插入图片描述

带有注释框

姿态估计

这是Learn OpenCV上的一篇好文章,它解释了如何在图像上进行头部姿态检测,并详细说明了将点转换到三维空间以及使用cv2.solvePnP来寻找旋转和平移向量的数学原理。快速浏览那篇文章将有助于理解其内在运作,因此我在这里只简要介绍。

我们需要脸部的六个点,即鼻尖、下巴、嘴唇左右极点以及左眼左角和右眼右角。我们取这些面部特征点的标准三维坐标,并尝试估计鼻尖处的旋转和平移向量。现在,为了准确估计,我们需要相机的固有参数,如焦距、光学中心和径向畸变参数。我们可以估算前两者,并假设后者不存在以简化工作。在获得所需向量后,我们可以将那些三维点投影到二维表面上,也就是我们的图像。

如果我们仅使用现有代码并找到与x轴的角度,我们可以得到如下结果。
在这里插入图片描述

结果

它非常适合记录头部上下移动,但不适用于左右移动。那么如何做到这一点呢?好吧,上面我们看到了脸部上的注释框。如果我们能够利用它来测量左右移动。
在这里插入图片描述

带有注释框

我们可以找到两条深蓝色线之间的中间线作为指针,并找到与y轴的角度来确定移动角度。
在这里插入图片描述

结果
结合这两者,我们可以得到我们想要的方向。完整的代码也可以在我的GitHub仓库中找到,还有其他用于在线监考解决方案的各种子模型。

在我测试i5处理器时,即使显示图像,我也能获得健康的每秒6.76帧的速度,而面部特征点检测模型只需要0.05秒就可以找到它们。

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

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

相关文章

PCIe进阶之TL:First/Last DW Byte Enables Rules Traffic Class Field

1 First/Last DW Byte Enables Rules & Attributes Field 1.1 First/Last DW Byte Enables Rules Byte Enable 包含在 Memory、I/O 和 Configuration Request 中。本文定义了相应的规则。Byte Enable 位于 header 的 byte 7 。对于 TH 字段值为 1 的 Memory Read Request…

计算机网络27、28——Linux命令1、2

1、虚拟机网络前方路径内容 用户名机器名:/$ $表示普通用户,#表示root用户 2、Linux不分盘,都是绝对路径 /表示根目录,表示计算机文件夹下 ~是当前用户的家,表示home文件夹下自己的文件夹 3、bin文件夹下的是可执…

信息收集常用指令

目的 本文主要是记录一些在信息搜集时,常用的提高搜索效率的命令。 后续会继续记录一些用到的更多指令和方法,慢慢更新。 1、inurl “inurl:xxx”是指查找url中包含xxx的网页。 URL:统一资源定位符。统一资源定位系统。可以说包含域名&am…

【数据结构-差分】力扣1589. 所有排列中的最大和

有一个整数数组 nums ,和一个查询数组 requests ,其中 requests[i] [starti, endi] 。第 i 个查询求 nums[starti] nums[starti 1] … nums[endi - 1] nums[endi] 的结果 ,starti 和 endi 数组索引都是 从 0 开始 的。 你可以任意排列…

查看TCP/UDP网络连接通信情况

绪论​ “宿命论是那些缺乏意志力的弱者的借口。 ——罗曼.罗兰” 话不多说安全带系好,发车啦(建议电脑观看)。 主要使用: nestat -nltp n 拒绝显示别名,能显示数字的全部转化成数字l 仅列出有在 Listen (…

动态SQL中的foreach标签【后端 21】

动态SQL中的foreach标签 在Java开发中&#xff0c;特别是在使用MyBatis进行数据库操作时&#xff0c;动态SQL是一项非常强大的功能。MyBatis的<foreach>标签就是动态SQL中最为常用的一个&#xff0c;主要用于处理包含IN子句的查询或者批量插入等操作。本文将详细介绍<…

《程序猿之设计模式实战 · 策略模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

论文内容分类与检测系统源码分享

论文内容分类与检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

掌握顶会流量密码!“Mamba+CNN”双热点组合!轻松找到创新点!

传统视觉模型在处理大规模或高分辨率图像时存在一定限制。然而Mamba与CNN相结合&#xff0c;在处理序列数据和图像数据时有着显著的优势&#xff0c;并且能够有效提升模型计算效率和准确率。 这种结合可以让Mamba在处理长序列数据时既能够捕捉到序列中的时间依赖关系&#xff…

Vue使用qrcodejs2-fix生成网页二维码

安装qrcodejs2-fix npm install qrcodejs2-fix核心代码 在指定父view中生成一个二维码通过id找到父布局 //通过id找到父布局let codeView document.getElementById("qrcode")new QRCode(codeView, {text: "测试",width: 128,height: 128,colorDark: #00…

three.js 热力图

使用three.js 和 heatMap.js 实现在 三维场景中展示热力图的效果&#xff0c;以下代码复制粘贴即可在你的本机运行。 在线编辑运行预览可方位 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyexpand&idheatmap3D 在 https://threehub.cn 中还有很多案例…

力扣 中等 2300.咒语和药水的成功对数

文章目录 题目介绍解法 题目介绍 解法 class Solution {public int[] successfulPairs(int[] spells, int[] potions, long success){Arrays.sort(potions);int n spells.length, m potions.length;int[] pairs new int[n];for (int i 0; i < n; i) {int left 0, righ…

【leetcode】树形结构习题

二叉树的前序遍历 返回结果&#xff1a;[‘1’, ‘2’, ‘4’, ‘5’, ‘3’, ‘6’, ‘7’] 144.二叉树的前序遍历 - 迭代算法 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,…

汉王手写签批控件如何在谷歌、火狐、Edge等浏览器使用

背景 近日&#xff0c;有网友咨询汉王手写签批控件是否可以通过allWebPlugin中间件技术加载到谷歌、火狐、Edge等浏览器&#xff1f;为此&#xff0c;笔者详细了解了一下汉王手写签批控件&#xff0c;它是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;…

C语言 | Leetcode C语言题解之第401题二进制手表

题目&#xff1a; 题解&#xff1a; char** readBinaryWatch(int turnedOn, int* returnSize) {char** ans malloc(sizeof(char*) * 12 * 60);*returnSize 0;for (int i 0; i < 1024; i) {int h i >> 6, m i & 63; // 用位运算取出高 4 位和低 6 位if (h &…

Laravel邮件发送:从配置到发邮件的指南!

Laravel邮件发送功能如何实现&#xff1f;怎么使用Laravel发信&#xff1f; Laravel作为一款流行的PHP框架&#xff0c;提供了强大且易用的邮件发送功能。AokSend将详细介绍如何从配置到实际发送邮件的全过程&#xff0c;帮助你快速掌握Laravel邮件发送的技巧。 Laravel邮件发…

对 JavaScript 原型的理解

笔者看了一些有关 JavaScript 原型的文章有感而发&#xff0c;就将所感所悟画了下来如果有理解错误和不足的地方&#xff0c;欢迎各位大佬指出&#xff0c;笔者感激不尽

2024华韵视听大会 “发现佛山”文旅影视产业调研活动-娅米的阳光城堡

9月13日上午&#xff0c;作为“2024华韵视听大会”系列活动之一&#xff0c;“发现佛山”文旅影视产业调研活动在佛山市高明区举行。来自“长风破浪”青年音乐人唱享计划及青年影视人扶持计划&#xff08;下简称“长风破浪”计划&#xff09;的青年唱作人左其铂、陈柏川和青年歌…

2024年超好用的公司加密软件分享|十款企业防泄密软件推荐

在数字化时代&#xff0c;企业数据的安全性变得尤为重要。随着网络攻击和数据泄露事件的频发&#xff0c;企业需要采取有效的措施来保护敏感信息。加密软件作为一种重要的数据保护工具&#xff0c;能够帮助企业防止数据泄露和未经授权的访问。本文将为您推荐十款2024年超好用的…

【梯度下降算法学习笔记】

梯度下降单参数求解 经过之前的学习我们来引入梯度下降的理念 α \alpha α为学习率 w 1 w 初 − α ∂ J ( w ) ∂ w w_1w_初-\alpha\frac{\partial J(w)}{\partial w} w1​w初​−α∂w∂J(w)​ w 2 w 1 − α ∂ J ( w 1 ) ∂ w 1 w_2w_1-\alpha\frac{\partial J(w_1)}…