HeadPose Estimation头部姿态估计头部朝向(Android)

目录

HeadPose Estimation头部姿态估计头部朝向(Android)

0.前言

1.HeadPose

2.pitch、yaw、roll三个角的区别

3.头部姿态估计评价指标

4.头部姿态估计数据

5.FSA-Net介绍

6. 头部姿态估计效果展示

7. 头部姿态估计Android源码下载


0.前言

本篇,将介绍一种基于深度学习的头部姿态估计模型FSA-Net。鄙人已经复现论文的结果,并对FSA-Net进行了轻量化,以便在移动端可以跑起来;目前Android Demo已经集成人脸检测和头部朝向模型,在普通手机可实时检测(30ms左右),CPU支持多线程处理,GPU支持OpenCL加速处理,先看一下效果哈:

  • Android Demo APP体检: https://download.csdn.net/download/guyuealian/85452952;或者链接: https://pan.baidu.com/s/1ExkjOMVwIWZNNrQOmrgidw 提取码: d5tq
  • Android Demo源码:​​​​​​​HeadPose Estimation头部姿态估计头部朝向

【尊重原创,转载请注明出处】:HeadPose Estimation头部姿态估计头部朝向(Android)_pan_jinquan的博客-CSDN博客

 CPU-4线程 GPU

Android Demo支持的特性主要如下:

  • 支持人脸检测:已经集成了轻量化的人脸检测,在普通手机只需要15ms左右,持CPU多线程处理,GPU支持OpenCL加速处理
  • 支持头部姿态估计:已经集成了轻量化的头部姿态估计,在普通手机只需要7ms左右,持CPU多线程处理,GPU支持OpenCL加速处理
  • 支持多人头部姿态估计
  • Demo支持图片,视频,摄像头等多种方式输入数据
  • 整个过程在普通手机可实时检测,30ms左右

1.HeadPose

头部姿态估计(Head Pose Estimation ),也称头部朝向估计,主要是获得脸部朝向的角度信息,即欧拉角(pitch,yaw,roll)表示。

头部姿态估计方法很多,主要可以分为两大类

(1)基于PNP的头部姿态估计方法

使用透视变换可以完成2D到3D的转换,可以简单的想象为将照片上的人脸图像按照一定的角度进行多点拉扯形成3D图像,然后根据角度来判断姿态。使用的方法原理为使用2D平面上人脸的特征点和3D空间内对应的坐标点,按照求解pnp问题的思路。找到一个映射关系,从而估计头部的姿态。

经典的 Head Pose Estimation 算法的步骤一般为:

  1. 2D人脸关键点检测;
  2. 3D人脸模型匹配;
  3. 求解3D点和对应2D点的转换关系;
  4. 根据旋转矩阵求解欧拉角。

基于PNP的头部姿态估计是比较传统的算法,其效果比较依赖人脸关键点检测,实际测试误差还是比较大。

可参考资料:基于3D通用模型的头部姿态估计_一半糊涂、的博客-CSDN博客_头部姿态估计

(2)基于深度学习的方法 

基于深度学习的方法,把脸部朝向的角度信息,即欧拉角(pitch,yaw,roll)当作一个多任务的回归模型(也可以转为分类)。其模型输入一张RGB人脸图像,输出三个值,代表头部朝向的欧拉角,(pitch,yaw,roll)。相比传统的头部姿态估计算法,该方法不依赖于人脸关键点,精度更高效果更好。

比如论文《Fine-Grained Head Pose Estimation Without Keypoints》就是这么简单粗暴:

论文地址:https://arxiv.org/abs/1710.00925v2
代码链接:https://github.com/natanielruiz/deep-head-pose

当然,还有FSA-Net,本博客就是在FSA-Net的基础上进行优化

参考资料:FSA-Net学习笔记_南风不竞:的博客-CSDN博客


2.pitch、yaw、roll三个角的区别

欧拉角(pitch,yaw,roll)遵循三维空间右手笛卡尔坐标原则:

蓝色的代表偏航角,绿色的代表俯仰角,红色的代表滚转角

欧拉角 说明 图示
pitch 俯仰,将物体绕X轴旋转(localRotationX),即点头 上负下正
yaw 航向,将物体绕Y轴旋转(localRotationY),即摇头 左正右负
roll 横滚,将物体绕Z轴旋转(localRotationZ), 即转头(歪头)左负右正

3.头部姿态估计评价指标

头部姿态估计主要有两种评价准则

(1)平均绝对误差(MAE)

(2)平均精度


4.头部姿态估计数据

数据集 说明
AFLW2000
  • 下载地址:http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm
BIWI
  • 数据集包含20人的超过15,000张图像(6位女性和14位男性-两次记录了4个人)。
  • 对于每一帧,都提供深度图像,相应的rgb图像(均为640x480像素)和注释。
  • 头部姿势范围涵盖大约+ -75度偏航和+ -60度俯仰。
  • 地面真相以头部的3D位置及其旋转的形式提供
  • 下载地址:https://data.vision.ee.ethz.ch/cvl/gfanelli/head_pose/head_forest.html

5.FSA-Net介绍

FSA-Net 是2019年CVPR中的一篇文章,下面是FSA-NET模型架构图:

首先,输入的图片经过两条流(two Stream)。两条流在3个stage各自提取一个特征图。相同stage提取出的特征图经过fusion module(图中的绿色框)。

原文:fusion module 首先将每个stage的两个feature map,通过element-wise multiplication得到combined feature map。然后通过c 1x1 的卷积将特征图变成c个channel。最后,用平均池化将特征图变成 w*h,最终,我们得到k个stage的特征图Uk  .如上图的 U1-Uk.

得到了K个大小为  特征图后,聚合模块的任务就是将其聚合为一个更小的更representative的特征图,具体来说就是将特征图精简为  。已有的一些方法如capsule 和NetVLAD没有关注空间之间的相对信息。所以在进入特征聚合模块前,先进行空间聚合(spatial grouping)

GitHub - shamangary/FSA-Net: [CVPR19] FSA-Net: Learning Fine-Grained Structure Aggregation for Head Pose Estimation from a Single Image


6. 头部姿态估计

目前Android Demo已经集成人脸检测头部朝向模型,支持以下功能:

  • 支持人脸检测:已经集成了轻量化的人脸检测,在普通手机只需要15ms左右,持CPU多线程处理,GPU支持OpenCL加速处理
  • 支持头部姿态估计:已经集成了轻量化的头部姿态估计,在普通手机只需要7ms左右,持CPU多线程处理,GPU支持OpenCL加速处理
  • 支持多人头部姿态估计
  • Demo支持图片,视频,摄像头等多种方式输入数据
  • 整个过程在普通手机可实时检测,30ms左右

算法核心代码,都采用C++实现,这是JNI部分,也是接口的核心代码:

package com.cv.tnn.model;import android.graphics.Bitmap;public class Detector {static {System.loadLibrary("tnn_wrapper");}/**** 初始化关键点检测模型* @param face_model: 人脸检测模型(不含后缀名)* @param head_model: 头部朝向模型(不含后缀名)* @param root:模型文件的根目录,放在assets文件夹下* @param model_type:模型类型* @param num_thread:开启线程数* @param useGPU:关键点的置信度,小于值的坐标会置-1*/public static native void init(String face_model,String head_model, String root, int model_type, int num_thread, boolean useGPU);/**** 检测关键点* @param bitmap 图像(bitmap),ARGB_8888格式* @param score_thresh:置信度阈值* @param iou_thresh:  IOU阈值* @param dst_bitmap图像(bitmap),头部姿态估计可视化效果图* @return*/public static native FrameInfo[] detect(Bitmap bitmap, float score_thresh, float iou_thresh,Bitmap dst_bitmap);
}

Android源码的头部朝向坐标绘制,我是使用的OpenCV绘制实现的,然后把绘制好Bitmap图像通过JNI映射到上层,并进行显示,核心显示代码如下:

/**** 绘制yaw,pitch,roll坐标轴(左手坐标系)* @param imgBRG 输入必须是BGR格式的图像* @param pitch红色X* @param yaw 绿色Y* @param roll 蓝色Z* @param center 坐标原始点* @param vis* @param size*/
void draw_yaw_pitch_roll_in_left_axis(cv::Mat &imgBRG, float pitch, float yaw, float roll,cv::Point center, int size, int thickness, bool vis) {float cx = center.x;float cy = center.y;char text[200];sprintf(text, "(pitch,yaw,roll)=(%3.1f,%3.1f,%3.1f)", pitch, yaw, roll);pitch = pitch * PI / 180;yaw = -yaw * PI / 180;roll = roll * PI / 180;// X-Axis pointing to right. drawn in redfloat x1 = size * (cos(yaw) * cos(roll)) + cx;float y1 = size * (cos(pitch) * sin(roll) + cos(roll) * sin(pitch) * sin(yaw)) + cy;cv::Scalar color_yaw_x(0, 0, 255); //BGR;// Y-Axis | drawn in greenfloat x2 = size * (-cos(yaw) * sin(roll)) + cx;float y2 = size * (cos(pitch) * cos(roll) - sin(pitch) * sin(yaw) * sin(roll)) + cy;cv::Scalar color_pitch_y(0, 255, 0);// Z-Axis (out of the screen) drawn in bluefloat x3 = size * (sin(yaw)) + cx;float y3 = size * (-cos(yaw) * sin(pitch)) + cy;cv::Scalar color_roll_z(255, 0, 0);float tipLength = 0.2;cv::arrowedLine(imgBRG, cv::Point(int(cx), int(cy)), cv::Point(int(x1), int(y1)), color_yaw_x,thickness,tipLength);cv::arrowedLine(imgBRG, cv::Point(int(cx), int(cy)), cv::Point(int(x2), int(y2)), color_pitch_y,thickness,tipLength);cv::arrowedLine(imgBRG, cv::Point(int(cx), int(cy)), cv::Point(int(x3), int(y3)), color_roll_z,thickness,tipLength);if (vis) {cv::putText(imgBRG,text,cv::Point(cx, cy),cv::FONT_HERSHEY_COMPLEX,0.5,(0, 0, 255));}
}

一些Android测试测试效果:https://panjinquan.blog.csdn.net/article/details/124943419

Android效果图  CPU-4线程 GPU

一些图片测试效果:

7. 头部姿态估计Android源码下载

  • Android Demo APP体检: https://download.csdn.net/download/guyuealian/85452952 ;或者链接: https://pan.baidu.com/s/1ExkjOMVwIWZNNrQOmrgidw 提取码: d5tq
  • Android Demo源码:​​​​​​​HeadPose Estimation头部姿态估计头部朝向

HeadPose Estimation头部姿态估计头部朝向(Android)相关推荐

  1. 计算机视觉中头部姿态估计的研究综述--Head Pose Estimation in Computer Vision - A Survey

    计算机视觉中头部姿态估计的研究综述 埃里克.莫非,IEEE的初级会员 默罕 马努拜特里维迪,IEEE高级会员 摘要---让计算机视觉系统作为一个普通人拥有识别另一个人的头部姿势的能力这一想法的提出,对 ...

  2. 计算机视觉中头部姿态估计的研究综述

    Head Pose Estimation in Computer Vision: A Survey Erik Murphy-Chutorian, Student Member, IEEE and Mo ...

  3. 使用OpenCV和Dlib的头部姿态估计

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在许多应用中,我们需要知道头部相对于相机是如何倾斜的.例如,在虚拟 ...

  4. 【头部姿态】头部姿态检测(一)

    头部姿态检测的意义: (1) 注意力检测:通过判断头部姿态可以判断人的注意力情况.比如可以检测长途司机是不是在目视前方,长时间不目视前方 (2) 行为分析:通过视频监控分析再辅助其他算法可以判断一个人 ...

  5. CV之PoseEstimation:Pose Estimation人体姿态估计(AI识人,OpenPose+DeepCut+RMPE+Mask RCNN)的简介、案例应用之详细攻略

    CV之PoseEstimation:Pose Estimation人体姿态估计(AI识人,OpenPose+DeepCut+RMPE+Mask RCNN)的简介.案例应用之详细攻略 目录 Pose E ...

  6. 基于Continuous Conditional Neural Fields for Structured Regression的人脸特征点检测和头部姿态估计

    Continuous Conditional Neural Fields for Structured Regression 效果图:头部姿态和特征点检测

  7. Human Pose Estimation人体姿态估计综述调研

    给定一幅图像或一段视频,人体姿态估计就是去恢复其中人体关节点位置的过程. 数据集 LSP 地址:http://sam.johnson.io/research/lsp.htm 样本数:2K 关节点个数: ...

  8. Single-Stage 6D Object Pose Estimation——6D姿态估计

    Single-Stage 6D Object Pose Estimation 作者:Yinlin Hu,Pascal Fua, Wei Wang, Mathieu Salzmann 实验室:CVLab ...

  9. 人脸关键点检测和头部姿态估计数据集整理

    1. 300W数据集简介 300W数据集是一个非常通用的人脸对齐数据集,也是近年来凡paper,都要出指标比对的必然数据集. 下载链接:https://ibug.doc.ic.ac.uk/resour ...

最新文章

  1. 区块链相关论文研读5:分布式隐私保护可审计的账本,zkLedger
  2. Win7旗舰版系统右键菜单响应速度很慢会延迟一段时间
  3. 关于SQL语言的初步认识
  4. asyncdata连接php,如何使用Nuxt和asyncData观察路由更改
  5. 电脑上的c语言程序打不开,电脑软件打不开常用处理方法
  6. Java 类的特性2
  7. 关于c#:Filter Serilog日志取决于上下文源到不同的接收器?
  8. mongodb不等于某个值_MongoDB的安装以及基本增删改查命令
  9. 执行计划 分析一条sql语句的效率 mysql_mysql的SQL语句执行计划分析:EXPLAIN
  10. 多人脸检测matlab程序,基于肤色的人脸检测matlab代码
  11. Java 8备受宠爱,HarmonyOS冲刺全球第三大操作系统,全民热议元宇宙|2021十大技术热词
  12. BackTrack5(BT5)安装教程及BT5支持网卡列表
  13. 实现jul 日志重定向到 slf4j
  14. 2021-06-30
  15. kali linux 网络渗透测试学习笔记(三)社会工程学之Java攻击:钓鱼网站制作
  16. 深度学习阅读导航 | 04 FPN:基于特征金字塔网络的目标检测
  17. 一起来学Kotlin:概念:7. Kotlin 函数介绍:扩展函数,中缀函数,运算符函数,带有varrag输入的函数
  18. 手动搭建一个https服务器,并颁发证书
  19. Telnet英文全称
  20. 最强 Python 数据可视化库,没有之一!

热门文章

  1. 夫妻卖盲盒、年入16亿,揭秘泡泡玛特的暴利生意
  2. “网络相亲”三大纪律八项注意
  3. 【附源码】计算机毕业设计JAVA中国历史网站
  4. 升级 MDK 5.37 后的问题处理: AC6编译选项, printf, 重启失效等
  5. Deep Network with Stochastic Depth(阅读笔记)一种随机深度的正则化方法
  6. 删除 文件夹出现0x80070091错误提示目录不是空的.txt
  7. QT基础之位置相关的函数介绍
  8. build-essential unmet dependencies 有未满足依赖 解决办法
  9. Html静态页面缓存问题,解决缓存更新不及时需清空缓存更新页面
  10. 人工蜂群算法(ABC)算法笔记丨matlab实现