头部姿态估计代码+教程

前言

在这里插入图片描述

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

目录

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

要求
对于这个项目,我们需要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.xdnf.cn/news/145272.html

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

相关文章

使用sqoop将mysql数据导入到hive报错ClassNotFoundException、Zero date value prohibited、.MapRedTask等错误

第一个错误: Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.StringEscapeUtilsat java.net.URLClassLoader.findClass(URLClassLoader.java:381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClass…

萌啦数据行业数据在哪看,萌啦ozon行业数据怎么看

在跨境电商的浪潮中,数据已成为商家决策的重要基石。萌啦Ozon数据行业分析板块,作为连接商家与市场动态的桥梁,为商家提供了丰富的行业洞察与精准的市场指导。本文将带您深入探索萌啦Ozon数据行业分析板块的功能,揭秘如何在这片数…

redis分布式锁(看门枸机制)

分布式锁确保在同一时间只有一个节点能获得对共享资源的独占访问权限&#xff0c;从而解决并发访问问题。 Redisson锁(简称看门狗) 它可以实现锁的延长&#xff0c;确保某个线程执行完才能让其他线程进行抢锁操作 引入看门狗机制后 如何使用&#xff1f; 1、引入依赖包 <…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(四)-搜索

搜索 搜索内容比较多&#xff0c;onesearch分成两部分&#xff0c;第一部分&#xff0c;Query构建&#xff0c;其中包括搜索词设置&#xff0c;设置返回字段&#xff0c;filter&#xff0c;高亮&#xff1b;第二部分分页和排序。第一部分是映射引擎负责&#xff0c;映射通用表…

MedPrompt:基于提示工程的医学诊断准确率优化方法

Medprompt&#xff1a;基于提示工程的医学诊断准确率优化方法 秒懂大纲解法拆解MedPrompt 提示词全流程分析总结创意视角 论文&#xff1a;Can Generalist Foundation Models Outcompete Special-Purpose Tuning? Case Study in Medicine 秒懂大纲 ├── 1 研究背景【描述背…

兴业小知识|法拍房你不知道的省钱小技巧~划走可就亏大了

如果说二手房市场是买卖双方之间的博弈&#xff0c;那法拍房市场则是纯买方的心理游戏。 在法拍房竞拍过程中&#xff0c;有人稳如泰山&#xff0c;有人坐立不安&#xff0c;每一次的出价都是对相互底线的一番试探。 有激进竞拍&#xff0c;拍出天价的&#xff0c;有一举夺魁…

使用宝塔部署项目在win上

项目部署 注意&#xff1a; 前后端部署项目&#xff0c;需要两个域名&#xff08;二级域名&#xff0c;就是主域名结尾的域名&#xff0c;需要在主域名下添加就可以了&#xff09;&#xff0c;前端一个&#xff0c;后端一个 思路&#xff1a;访问域名就会浏览器会加载前端的代…

手把手教你-MAC笔记本安装Pytorch环境

MAC笔记安装Pytorch 环境安装 1. 安装brew 方法1 参考&#xff1a; https://www.jianshu.com/p/e0471aa6672d?utm_campaignhugo 使用中科大镜像加速访问&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)&qu…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【时间管理】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

百望云生态伙伴大会在北京、深圳、昆明三地举办,携手共赢数字化未来!

伴随着金税四期数电票、乐企加速扩围&#xff0c;激发了企业大量的财税数字化转型的需求&#xff0c;为财税服务市场注入了前所有未有的活力。2024年7月9日&#xff0c;百望云成功登陆港交所&#xff0c;成为港股“电子发票第一股”&#xff0c;加码财税业务布局&#xff0c;纵…

【C++ Primer Plus习题】16.10

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…

【刷题日记】15. 三数之和

15. 三数之和 两数之和可以用巧思也可以用map 三数之和会更加复杂一点&#xff0c;且这道题还需要考虑避免重复答案&#xff01; 思路&#xff1a; 特判&#xff1a;检如果nums 为 null 或长度小于 3直接返回空数组。排序&#xff1a;使用 sort对数组进行升序排序。就变成了…

京东h5st 4.8逆向

最开始扒的时候版本号还是4.1&#xff0c;现在已经到了4.8了&#xff0c;原来的AES也没有了&#xff0c;现在都是魔改的加密方法&#xff0c;还整成了vmp。跟了一下整个流程&#xff0c;和原来的流程大差不差&#xff0c;h5st变长了&#xff0c;一共分9部分。简单走一下流程。 …

玩具车检测系统源码分享

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

web基础—dvwa靶场(十二)JavaScript Attacks

JavaScript Attacks (前端攻击) 本章节中的攻击旨在帮助您了解如何在浏览器中使用 JavaScript 以及如何对其进行操作&#xff0c;攻击可以通过分析网络流量来实现&#xff0c;但这不是本章节的重点而且可能要困难得多。 只需提交单词 “success” 即可攻击成功&#xff0c;显然…

编写程序,在一行上显示1-5数字,每个相邻的数字要求用空格进行分开

目录 前言 一、一行输出&#xff08;使用一个System语句输出&#xff09; 二、多行输出&#xff08;使用多&#xff08;N&#xff09;个System语句输出&#xff09; 三、循环输出&#xff08;使用for语句循环在通过System语句输出&#xff09; 四、完整代码 前言 1.本文所…

图神经网络池化方法

图神经网络池化方法 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 图神经网络池化方法前言一、扁平图池化二、分层图池化1.节点聚类池化2.节点丢弃池化 参考文献 前言 图池化操作根据其池化策略的差异&#xff…

windows C++-并行编程-并行算法(四)- 并行排序

并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C 标准库提供的算法。并行算法由并发运行时中的现有功能组成。 PPL 提供三种排序算法&#xff1a;concurrency::parallel_sort、concurrency::parallel_buffered_sort 和 concurrency::parallel_radix…

志邦家居CIO吴俊涛谈转型:天润融通如何赋能家居行业未来

根据国家统计局、住建部等各部门综合数据显示&#xff0c;2024年国内泛家居全渠道销售额在预计将超过4.7万亿元&#xff0c;并且在存量房需求释放与智能家居品类创新的推动下&#xff0c;预计2027年将突破5.3万亿元&#xff0c;展现出强劲的增长弹性。 然而&#xff0c;家居行…

【Mysql】为modified_time和created_time设置默认值

建立表SQL&#xff1a; CREATE TABLE your_table_name (id int(11) NOT NULL AUTO_INCREMENT,/* 其他字段 */created_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建日期,modified_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 修改…