基于YOLO的3D人脸关键点检测方案

2023-11-02



前言

YOLOLandmark解决了2D的人脸关键点检测问题,但3D任务仍然是个空白。我们能够在该领域继续突破呢?


一、任务列表

  1. 3D人脸关键点数据调研
  2. 3D FLD的评估策略有哪些
  3. 当前领先的技术方法达到了什么水平?
  4. 我们的方法实现:
    1. 数据集转为YOLO格式
    2. 修改YOLO8Pose的入口和出口
    3. 初步训练的性能,并对比
    4. 分析可行性,如何在此基础上取得突破

二、3D人脸关键点数据

主流的数据集

H3WB

github Link: HWWB
全称,H3WB: Human3.6M 3D WholeBody Dataset and Benchmark,它是一个大型的用于3D全身姿态估计的数据集,包含100K张图片标注。它扩展与Human3.6m数据集,共包含133个全身关键点,与COCO-whole body的标记规则一样。
样本标注如下:
在这里插入图片描述

2.下载方法

图片可以直接下载: Human3.6m
标记文件下载链接:datasets/json/

也可以通过脚本将Human3.6m视频转为包含图片与标注的对应集,参考 https://github.com/wholebody3d/wholebody3d

其中,json的标注方式如下:

XXX.json --- sample id --- 'image_path'
                        |
                        -- 'bbox' --- 'x_min'
                        |          |- 'y_min'
                        |          |- 'x_max'
                        |          |- 'y_max'
                        |
                        |- 'keypont_2d' --- joint id --- 'x'
                        |                             |- 'y'
                        |
                        |- 'keypont_3d' --- joint id --- 'x'
                                                      |- 'y'
                                                      |- 'z'

3.任务

基于该数据集,提出了三种不同的任务:

  • 任务一:2D—>3D
    指的是从2D全身姿态提升到3D全身姿态。其主要做法是:

    • 使用2Dto3D_train中的数据用于训练和验证。它包含80K的2D和3D关键点
    • 使用2Dto3D_test中的数据用于测试。它包含10K的2D关键点
  • 任务二:I2D—>3D
    指的是不完整的2D全身姿态提升到3D的完整全身姿态。其流程如下:

    • 使用2Dto3D_train中的数据用于训练和验证。它包含80K的2D和3D关键点
    • 添加有概率的模版去掩盖,官方的策略是:
      • 占比40%,每个关键点有25%概率被掩码;
      • 占比20%,人脸100%概率被掩码;
      • 占比20%,左手100%概率被掩码;
      • 占比20%,右手100%概率被掩码;
    • 使用2Dto3D_test_2D用于数据榜上的测试。它包含10K的2D关键点,区分于上述的10K数据。
  • 任务三:RGB—>3D
    指的是从一张图片直接预测3D全身姿态。其主要做法是:

    • 使用RGBto3D_train中的数据用于训练和验证。它包含80K的图像路径,边界框和3D关键点(源文档写成2D,应该有误)
    • RGBto3D_train含有与2Dto3D_train相同的样本,因此有必要可以访问2D全关键点。
    • 使用RGBto3D_test中的数据用于排行榜的测试。它包含20K的图像路径,边界框。
    • 注意的是,测试样本的id和以上两个任务是不一致的。

4.评估

  • 验证
    作者没有提供validation集,作者提倡报告5-fold的交叉验证结果,并提供平均值和标准值。

  • 在测试集上的评估
    保存在测试集上的结果为XXXto3D_pred.json,并发送到邮箱: wholebody3d@gmail.com
    可以参考官方样例:test set predictions

  • 可视化
    作者提供了两个可视化工具,一个是可视化3D全人体,另一个是在排行榜上的评估。

5.使用许可

遵从MIT许可,即非常宽泛的协议,只需要在你的源码中注明原作即可。作者不拥有这些图像的版权,它必须遵守Human3.6m的许可。

3DFAW

全称,3D Face Alignment in the Wild (3DFAW)。包含23K图片,带有66个3D人脸标注数据的集合。近期在ICCV workshop比较火,
第一届workshop和挑战赛在ECCV2016年被提出,其数据集可以从论文中发现:自然条件下的图像,或者合成的头像。
在这里插入图片描述
这里存在一个问题是:如果要做端到端的人脸和关键点联合检测,那么需要提供人脸边界框,也可以根据人脸关键点找出边界框,但对人脸检测的性能会有负面影响。
可参考github:https://github.com/1adrianb/face-alignment

ICCV2019年举办了第二次workshop和挑战赛。
参考:https://3dfaw.github.io/
3DFAW-Video提供如下的图像信息:
在这里插入图片描述
包含不同源的图像,比如iPhone拍摄的视频,以及高分辨率的视频,并采用Di4D成像系统来扫描高分辨率的3D人脸。该数据集的下载需要签署一个协议文件,并获得访问允许。

CVPR2023刚出了一篇,名叫《3D-aware Facial Landmark Detection via Multi-view Consistent Training on Synthetic Data》,提升了3DDFA的性能,但所谓的3D关键点还是二维信息,只不过需要借助3DMM模型来得到3D的顶点。这类方法需要基于大名鼎鼎的3DMM模型,与直接给出Z轴的深度信息还是有差别的。

这篇文章还提到两个数据集:

  • Multiface Dataset
    在这里插入图片描述

  • DAD-3DHeads
    A Large-scale Dense, Accurate and Diverse Dataset for 3D Head Alignment from a Single Image
    在这里插入图片描述
    这个数据集包含了原图,68个2D点,191个2D点,445个密集点;
    下排:face mesh, head mesh, head pose, 3D head mesh.

AFLW2000-3D

Face Alignment Across Large Poses: A 3D Solution, 即AFLW2000-3D。它包含2000张图片,每个人脸含有68个3D关键点,主要用于评估作用。这个数据集的3D信息,也是通过3DMM模型得到的,在精度上会存在问题的争议。
在这里插入图片描述

三、3D关键点的Z维度信息

3D关键点在三维坐标系中除了XY面上的位置信息,还包括Z轴上的深度信息。对于在RGB图像上估计3D关键点,这本身就是一个难题。那么,当前的数据集以及一些SOTA的方法是如何估计3D姿态的呢?

1.基于3DMM模型的方法

3dffa就是当前流行的基于3dmm的方法。它不是直接的估计Z轴的深度信息,而是根据二维平面上的点坐标与三维的人脸模型之间进行的一个仿射变换,在归一化的三维空间上得到人脸姿态。
类似的数据集,如AFLW2000-3D,300W-LP等数据集。我们参考一些技术文档,可以详细打开这两个数据集的三维坐标。

例如,我们可视化300W-LP中的3D关键点不难发现,所谓的3D点其实也是用二维数据表述的
在这里插入图片描述
其中的pts_3d格式为68x2,也就是说该3D关键点实际上空间投影到2维平面上的投影.
在这里插入图片描述
同理,我们也可以可视化AFLW2000-3D数据集
在这里插入图片描述
我们可以看到该数据集合是真正包含第三维度的信息,即3D预测是68x3的矩阵.
在这里插入图片描述
并且我们可视化3dmm后重构的人脸图
在这里插入图片描述
可以看到,通过给定3dmm的参数,可以线性表达人脸的构建.这里参考3dffa的代码,如果在linux平台上运行此matlab code可能需要重新编译linux下的相关函数.例如,

Error in NormDirection (line 17)
N = Tnorm_VnormC(double(n_tri), double(tri), double(size(tri,2)), double(size(vertex,2)));

Error in main_show_with_BFM (line 17)
norm = NormDirection(vertex, tri);
 
>> compile
Building with 'g++'.
Warning: You are using gcc version '7.5.0'. The version of gcc is not supported. The version currently supported with MEX is
'4.9.x'. For a list of currently supported compilers see: http://www.mathworks.com/support/compilers/current_release. 
> In compile (line 1) 
MEX completed successfully.

2.H3WB

这是本次调研第二个数据集在标签中包含Z轴信息的数据集。但具体可视化的结果,还在酝酿中。

四、当前SOTA的方法

1.方法1

最好是paper with code. 介绍下方法,从框架、模块、损失函数等方面,并对比性能如何

五、我们的解决方法

1.数据转为YOLO格式

最好是paper with code. 介绍下方法,从框架、模块、损失函数等方面,并对比性能如何

2.修改YOLO8Pose的入口出口

3.开始训练,并记录过程

4.对比分析

5.改进

主要记录如何改进的,并记录结果。与baseline对比,取得的效果是如何?


总结

牢记使命,多发高水平的文章,在AI竞赛中处于上游地位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于YOLO的3D人脸关键点检测方案 的相关文章

  • 使用 3d 变换矩阵

    在人工智能课程中 我们有一个机器人 它的手臂有 7 个关节 每个关节可以向不同的方向旋转 我需要知道最后的结局在哪里 我一直在尝试进行 3d 矩阵乘法 它适用于一个关节 但一旦我添加另一个关节 它就与我使用 Java3D api 制作的模型
  • SceneKit 修改 3D 对象并导出文件

    在我的应用程序中 我使用 SceneKit Framework 在 SCNView 中显示 3D 对象 并导出修改后的文件 并进行一些小的更改 如颜色 温度等 但在将其导出到文档文件夹后 我得到了原始文件 在这里我可以显示 3D 对象并对其
  • DirectX Release 构建可以通过 VS2010 运行,但不能运行 exe

    我已经通过 Google 访问 Stack Overflow 几年了 但到目前为止还没有询问 回答任何问题 所以就到这里吧 基本上 我有一个在 DirectX 11 中设置绘图模型和地形的 3D 渲染框架 一切正常 通过 Visual St
  • 在 Unity 3D 中使用触摸输入在地形上移动相机

    我是 Unity 新手 我正在尝试弄清楚如何使用触摸输入在地图 地形上移动相机 摄像机将以 90 0 0 的旋转角度俯视地形 地形位于第 8 层 我用键盘移动它没有问题 现在我尝试移动到触摸 如果你想在 iOS 上保持预期的使用情况 那就非
  • 如何在 Three.js 中从三角面获取多边形?

    我在网上查了一下是否有人遇到同样的问题 我正在使用 Three js 我有一个 3DObject 其中可能包含孔 面是三角形的 假设我想从上面看到它 我的目标是获得一个代表顶面周长的多边形 这对我来说意味着不再有三角面 而只有 1 个多边形
  • 如何在 OpenCV 中绘制图像的 3D 直方图

    更新 我找到更多例子 我现在可以做到 我可以在 3d 中绘制多个直方图吗 https stackoverflow com questions 35210337 can i plot several histograms in 3d 我知道这
  • 如何将 3D 图像输出到 3D 电视?

    我有一台 3D 电视 如果我不至少尝试让它显示我自己创作的漂亮 3D 图像 我就会逃避我的责任 作为一个极客 我之前已经完成了非常基本的 OpenGL 编程 因此我了解所涉及的概念 假设我可以为自己渲染一个简单的四面体或立方体并使其旋转一点
  • 使用 ThreeJS 获取球体纹理上的点击位置

    目前 我有一个带有纹理的球体 它绕 y 轴旋转 我还有在 3D 空间中单击的位置 以及球体上的旋转位置 我认为 目标 获取纹理上的位置 例如 我想获取我点击的图像的哪个方块 参见示例球体和下图 在实践中 我不会使用此图像 但我觉得这将是一个
  • C++ Irrlicht 程序未链接:“未定义对‘__imp_createDevice’的引用”

    我的 Irrlicht 程序无法链接 我使用的编译器是g Code include
  • 无法将大小为 1665179 的数组重塑为形状 (512,512,3,3)

    该脚本用于进行检测 权重文件是 yolov4 coco 预训练模型 可以在这里找到 https drive google com file d 1cewMfusmPjYWbrnuJRuKhPMwRe b9PaT view https dri
  • CSS3DObject 始终位于 WebGL Mesh 前面

    我正在混合CSS3D Renderer with WebGL Renderer to add HTML3D 空间中的元素WebGL场景 这CSS3DObject在前面WebGL网格即使WebGL Renderer具有较高的 z index
  • 更改 3D 图形颜色 (matplotlib)

    我使用以下代码在 matplotlib 中绘制了 3D 图形 Previously defines lists of data to plot fig plt figure ax fig add subplot 111 projection
  • 判断点是否在截锥体内

    我正在尝试找出确定一个点是否在截锥体内的最佳方法 我有一些工作 但不确定它是否太麻烦 也许我应该有一种更优雅 有效的方法来做到这一点 假设我想查明点 x 是否在截锥体内 一旦我知道了平截头体的 8 个点 4 个近点 4 个远点 的位置 我就
  • XNA中窗口系统的渲染策略(RenderTarget性能)

    我目前正在从头开始为 XNA 游戏创建一个窗口系统 我主要针对 Windows 进行开发 但谁知道我将来可能支持哪些平台 如果您知道本机 Direct3D 的这一点 请随意回答 因为性能语义应该类似 如果可能 请考虑如果目标平台是 X Bo
  • DirectX::SpriteFont/SpriteBatch 阻止 3D 场景绘制

    我使用时遇到问题DirectX SpriteFont DirectX SpriteBatch 来自 DirectXTK 与此处讨论的问题完全相同 使用 SpriteFont 类绘制文本时出现问题 https stackoverflow co
  • 使用 keras 澄清 Yolo v3 模型输出

    我将 yolo v3 模型与 keras 一起使用 该网络为我提供了形状如下的输出容器 1 13 13 255 1 26 26 255 1 52 52 255 所以我找到了这个link https www cyberailab com ho
  • 3D 空间中两个盒子之间的交集

    我想为我的图形引擎实现一个碰撞检测系统 我不知道这是否是常见的方法 但我的想法是将任何实体对象 如网格或相机 绑定在 3D 盒子内 这会给我比球体更准确的结果 这个盒子由八个顶点定义 x0 min vertices x off parsin
  • 无法使用 vcglib 简化 3D 模型,断言“0”失败

    I used vcglib https github com cnr isti vclab vcglib简化 3D 模型文件 我使用了 master a8e87662 git 存储库 我运行示例 trimesh clustering htt
  • 使用开源 3D 引擎从 Openstreetmap 数据渲染地图? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 从 Openstreetmap 数据渲染 3D 地图可能会很漂亮麻烦的 https gis stack
  • 在 Unity 中平滑动态生成的网格?

    给定 Unity 和 C 中的网格 其本身是通过合并更简单的基础网格实时创建的 我们如何在运行时 将其变成平滑的 几乎像包裹在布中的网格版本一样 不是完全凸出的版本 而是更圆润 软化锋利的边缘 桥接深间隙等 理想情况下 表面也将像 平滑角度

随机推荐

  • mysql死锁问题分析

    线上某服务时不时报出如下异常 大约一天二十多次 Deadlock found when trying to get lock Oh My God 是死锁问题 尽管报错不多 对性能目前看来也无太大影响 但还是需要解决 保不齐哪天成为性能瓶颈
  • EDK2编译记录

    EDK2 EDK2 PLATFORM EDK2 NON OSI 以上三个仓库 EDK2是主仓库 EDK2 PLATFORM是和EDK2版本对应的板子和CPU相关的仓库 比如树莓派的就在这个里面 EDK2 NON OSI是有一些license
  • 表的读写分离的优缺点?

    读写分离是一种常见的数据库优化策略 将数据库的读操作和写操作分别分配给不同的数据库实例处理 以下是读写分离的优缺点 优点 提升读取性能 通过将读操作分发到专用的读库 可以减轻主库的读取压力 提升整体的读取性能 横向扩展能力 读写分离方案为系
  • Mesa学习笔记#1:Running MESA

    Mesa学习笔记 1 Running MESA Running MESA 关于如何使用MESA来演化一颗恒星 MESA DIR 目录有许多子目录 这些子目录中的大多数都是模块 MESA中的 M 它们提供一些特定的功能 例如 kap 提供计算
  • 最近很火的微信啪一啪猜猜是怎样通过Flutter实现的?

    作者 CrazyQ1 链接 https juejin im post 5eeb49a1e51d4573c91b91ab 最近这个啪一啪效果挺火的啊 群里经常有人啪 介绍 其实之前我就双击过头像 但并没任何效果 估计是当时把这个啪一啪消息隐藏
  • QThread的信号与槽用法详解

    QThread的信号与槽用法主要涉及以下几个方面 QThread的finished 信号 当QThread执行完毕时 会发出finished 信号 我们可以通过连接该信号到槽函数的方式 实现在QThread执行完毕后进行一些操作 例如 cl
  • 公司组网网络解决方案和企业常用的组网技术有哪些?

    随着企业信息化的发展 依赖互联网 云服务等协作办公的需求越来越多 组建一个高效适用的企业网络 对于提高企业办公效率 促进企业发展显得至关重要 企业组网的方式主要有 MPLS专线 VPN以及SD WAN等 至于哪一种才是好的解决方案 网宿君认
  • vue el-dialog嵌入video实现视频播放功能

    video嵌入dialog实现视频播放 业务需求 1 实现的效果图 3 全部代码 复制粘贴即可实现 业务需求 弹窗实现视频播放 并且切换不同选项卡播放不同视频 1 实现的效果图 3 全部代码 复制粘贴即可实现
  • springboot内置序列化工具Jackson

    JackSon介绍 本文使用的JackSon版本为2 9 6 JackSon是解析JSON和XML的一个框架 优点是简单易用 性能较高 JackSon处理JSON的方式 JackSon提供了三种JSON的处理方式 分别是数据绑定 树模型 流
  • J-Link识别到驱动但是识别不到芯片CODE和上电亮红灯的原因和解决方法

    今天在来分享一下自己在使用J Link时候遇到的一个问题以及我自己的解决方法 今天在用J Link烧录时候突然发现J link连接到开发板时候会先闪几下红灯 然后J link驱动是可以找到的 但是通过Keil查看J link是否识别到要烧录
  • Linux 中的 chage 命令及示例

    chage命令用于查看和更改用户密码过期信息 当要为用户提供有限时间的登录或需要不时更改登录密码时 使用此命令 借助该命令 我们可以查看账户的时效信息 上次更改密码的日期 设置密码更改时间 一定时间后锁定账户等 chage 命令的语法如下
  • 网络层拥塞控制与传输层TCP拥塞控制的区别

    近期学习计算机网络的过程中 发现网络层与传输层都有对拥塞控制的实现 为什么网络层和传输层都有拥塞控制呢 其实 网络层拥塞控制和传输层拥塞控制的目的是相同的 都是为了防止过多的数据进入网络 保证整个网络中不出现过量分组而引起网络的性能下降 那
  • 目标检测从入门到精通—概述(一)

    你有梦想 就去实现它 目录 你有梦想 就去实现它 1 计算机视觉 CV Computer Vision 领域任务是什么 图像分类 目标检测 分割是计算机视觉领域的三大任务 一是分类 Classification 二是检测 Detection
  • kubernetes环境搭建及部署

    一 kubernetes 概述 1 kubernetes 基本介绍 kubernetes 简称 K8s 是用 8 代替 8 个字符 ubernete 而成的缩写 是一个开源 的 用于管理云平台中多个主机上的容器化的应用 Kubernetes
  • 【排序算法】快速排序的分析改进

    基本的快速排序 最基本的快速排序是由C A R Hoare在1960年提出的 快速排序的算法是一种分治排序算法 它将数组划分为两个部分 然后分别对两个部分进行排序 快速每次对数组重新排序 选择一个基准值key 然后让数组满足下面的两个个条件
  • TensorFlow:实战Google深度学习框架(六)图像数据处理

    第七章 图像数据处理 7 1 TFRecord输入数据格式 TensorFlow提供了一种统一的格式来存储数据 TFRecord格式 7 1 1 TFRecord格式介绍 7 1 2 TFRecord样例程序 7 2 图像数据处理 7 2
  • linux中shell中使用expect实现自动应答

    linux中shell中使用expect实现自动应答 expect有两种方式 一种是为了单纯的进行自动应答 还有一种是为了结合shell脚本 大多数情况下都是为了结合shell脚本 这里示例两种写法 但在使用时应该尽量使用结合shell方式
  • 杀毒软件 clamav 的安装和使用

    目录 一 clamAV介绍 二 安装ClamAV clamdscan 三 手动更新数据库 四 用法 4 1 clamscan用法 4 2 clamdscan用法 五 python判定有无检测出病毒 一 clamAV介绍 ClamAV 杀毒是
  • python入门基础-数据类型&有序序列和无序序列;

    目录 python优点 python缺点 python应用场景 Python数据类型 字符串 string 列表 list 元组 tuple 不可变数据 1 2 3 set 集合 1 2 3 无序 自动去重 dict字典 key value
  • 基于YOLO的3D人脸关键点检测方案

    目录 前言 一 任务列表 二 3D人脸关键点数据 H3WB 2 下载方法 3 任务 4 评估 5 使用许可 3DFAW AFLW2000 3D 三 3D关键点的Z维度信息 1 基于3DMM模型的方法 2 H3WB 四 当前SOTA的方法 1