首页 > 其他分享 >[Paper Reading] Egocentric Whole-Body Motion Capture with FisheyeViT and Diffusion-Based Motion Refi

[Paper Reading] Egocentric Whole-Body Motion Capture with FisheyeViT and Diffusion-Based Motion Refi

时间:2024-08-23 18:26:27浏览次数:14  
标签:Body Capture 预测 模型 SMPL Motion 小图 参数 姿态

Egocentric Whole-Body Motion Capture with FisheyeViT and Diffusion-Based Motion Refinement

link
时间:CVPR2024
机构:马普所 & Saarland Informatics Campus & Google & University of Pennsylvania

TL;DR

使用第一人称RGB单目鱼眼相机进行全身动捕的算法,融合了FisheyeVit & 3D Heatmap & HandTracking & Pose Diffusion等模块。

Method

BodyPose

FisheysVit

类似于Perspective Crop的做法,首先根据Vit的PatchSize在鱼眼图上选取一系列中心点阵(如Step1中红点阵)。根据每个中心点,即为每个目标小图中心点,根据小图尺寸lxl去原图中采样点。实际实现过程可用查表法进行加速,同时该模型是在一个非去畸变的模型基础上进行Finetune而来。相关工作可以参考Perspective Crop

Pixel-Aligned 3D Heatmap

其实就是用3D Heatmap来预测(u, v, d)而非(x, y, z),而uvd转为xyz可使用相机模型来转换。
Q: 预测骨骼点之后,怎么得到SMPL参数?

骨骼点到关节的映射:首先,将预测的骨骼点映射到SMPL模型的关节上。
关节位置的优化:使用优化算法(如非线性最小二乘法)来最小化关节位置和预测骨骼点之间的误差。
SMPL参数提取:SMPL模型的参数包括身体的形状参数(如性别、身高、体重等)和姿态参数(如关节角度)。通过优化过程,可以提取出这些参数。

Egocentric Hand Pose Estimation

Hand Detection使用HRNet直接在鱼眼图上做,Hand Pose Estimation使用Crop出的小图直接预测3D Hand Pose。

Q:HandPose Estimation仅使用小图如何预测全图6DoF?
=> 猜测手腕6DoF是在Body Pose那部分做的,这里的Hand Pose注重手指20DoF的还原。

Diffusion-Based Motion Refinement

将Body Joints与Hand Joints的Uncertainty Score作为Guidance输入Diffusion Model中,以预测出的Joints作为初值迭代t次,得到Refine之后的结果。

EgoWholeBody Dataset数据集

使用blender仿真而来,Camera的摆放如下图。数据集分为两个部分:Part1共70W帧,具有丰富的Body Pose。Part2共17W帧,注重手部姿态的丰富性。

这里所说的鱼眼图是如下这种摆放所拍出来的。

Code

Code Link

参考文章pdf以及代码egowholemocap.py,Q1:预测骨骼点之后,怎么得到SMPL参数?Q2:HandPose Estimation仅使用小图如何预测全图6DoF? Q3:模型Loss是什么设计的?Q4:模型输出的shape是什么? 在提供的代码 egowholemocap.py 和相关文件中,我们可以看到这是一个用于人体姿态估计和手部姿态估计的系统。以下是针对您的问题的回答:

Q1: 预测骨骼点之后,怎么得到SMPL参数?
在人体姿态估计中,SMPL(Skinned Multi-Person Linear model)是一种流行的3D人体模型,它通过一组参数来描述人体的形态和姿态。预测骨骼点后,通常需要以下步骤来获得SMPL参数:

骨骼点到关节的映射:首先,将预测的骨骼点映射到SMPL模型的关节上。
关节位置的优化:使用优化算法(如非线性最小二乘法)来最小化关节位置和预测骨骼点之间的误差。
SMPL参数提取:SMPL模型的参数包括身体的形状参数(如性别、身高、体重等)和姿态参数(如关节角度)。通过优化过程,可以提取出这些参数。
在代码中,RefineEdgeDiffusionHandsUncertainty 类可能涉及到从预测的骨骼点恢复SMPL参数的过程,但具体实现细节需要查看该类的实现代码。

Q2: HandPose Estimation仅使用小图如何预测全图6DoF?
手部姿态估计(HandPose Estimation)通常需要预测手部的3D姿态,即6自由度(6DoF),包括位置、旋转和缩放。即使使用小图进行预测,也可以通过以下方法来预测全图的姿态:

上下文信息:即使只使用手部的小图,模型仍然可以从中学习到手部的姿态信息,因为手部的关键点和姿态变化具有一定的模式。
多尺度预测:模型可能使用多尺度特征图来捕捉不同级别的细节,从而提高预测的准确性。
回归或分类:手部姿态估计通常采用回归方法直接预测关键点的位置,或者使用分类方法预测关键点之间的相对角度。
在代码中,RefineEdgeDiffusionHandsUncertainty 类可能包含了预测手部姿态的逻辑,但具体如何从一个小图预测全图的6DoF,需要进一步查看该类的实现细节。

Q3: 模型Loss是什么设计的?
模型的损失函数(Loss)设计取决于模型的具体任务和结构。在人体姿态估计中,常见的损失包括:

回归损失(如均方误差MSE):用于直接预测关键点位置的任务。
Heatmap损失:如果模型输出是关键点的热图,可能会使用热图损失来训练模型。
标签平滑损失:在关键点检测中,为了提高模型的泛化能力,可能会使用标签平滑技术。
在代码中,损失函数的设计可能在模型定义的文件中,例如 RefineEdgeDiffusionHandsUncertainty 类的实现文件。需要查看该文件来了解具体的损失函数设计。

Q4: 模型输出的shape是什么?
模型输出的形状(shape)取决于模型的架构和任务。在人体姿态估计中,常见的输出形状包括:

关键点坐标:[N, K, 2] 或 [N, K, 3],其中N是批次大小,K是关键点数量,2或3表示每个关键点的(x, y)坐标或加上分数。
热图:[N, K, H, W],其中H和W是热图的高度和宽度。
在代码中,run_diffusion 函数中的 diffusion_results 变量可能包含了模型的输出。通过查看该函数中的处理逻辑,可以确定模型输出的具体形状。例如,pred_motion_result 变量可能包含了预测的骨骼点或其他相关输出,其形状可以通过查看相关代码来确定。

Experiment


Ablation: 有无Diffusion参考Ours-Single与Ours-Refined之间结果差异。

总结与发散

去畸变Patch结合Vit的思路比较有趣

相关链接

https://people.mpi-inf.mpg.de/~jianwang/projects/egowholemocap/
https://github.com/jianwang-mpi/egowholemocap

资料查询

折叠Title FromChatGPT(提示词:XXX)

标签:Body,Capture,预测,模型,SMPL,Motion,小图,参数,姿态
From: https://www.cnblogs.com/fariver/p/18376825

相关文章

  • Postman中Body添加注释后请求报错问题解决【保姆级教程!!!】
    本文介绍关于Postman中Body添加注释后请求报错问题解决方法如:请求返回下述报错操作失败!系统异常,JsonParseException:Unexpectedcharacter(‘/’(code47)):maybea(non-standard)comment?(notrecognizedasonesinceFeature‘ALLOW_COMMENTS’notenabled......
  • C++(cv::VideoCapture::open())
    在OpenCV中,cv::VideoCapture类用于从视频文件或摄像头捕获视频流。cap.open()是cv::VideoCapture类的一个成员函数,用于打开视频源。以下是关于cap.open()的详细介绍:函数定义cv::VideoCapture::open有两个主要的重载形式:boolopen(intindex)这个重载版本用于打开一......
  • P5642 人造情感(emotion)
    link考虑\(W(U)\)怎么求。定义\(f_x\)表示只考虑所有在\(x\)子树内的路径时最大收益,\(sum_x\)为只考虑\(x\)子树中路径,且钦定\(x\)不选的最大收益。\(g\)的转移显然:\(g_x=\sumf_{to}\)\(f\)转移考虑枚举\(\text{lca}=x\)的所有路径\((u,v,w)\),有:\(f_x\longle......
  • CF830E Perpetual Motion Machine
    一堆CornnerCase的大分讨,我们全队一边写一边补情况,WA了五发终于干过去了首先当图中存在某个环时,我们只要给环上的所有点赋值为\(1\)即可;又因为图连通所以只要考虑树的情况即可考虑如果存在一个度数\(\ge4\)的点,将其赋值为\(2\)并将其周围的四个点赋值为\(1\)即可......
  • 小白细节思考之读取Request.Body
    小白最近做的项目当中涉及到了WebApi,具体是三方程序通过调用小白写的WebApi进行推送数据,调用的次数、频率是没有限制的,因此就涉及到了并发。小白使用.NET8创建了WebApi,在读取Request请求时,使用如下的方式:1varrequestContent=string.Empty;2using(varstream=new......
  • CF1946F Nobody is needed 题解
    Nobodyisneeded推销我的洛谷博客。题意多组数据。给定一个长度为\(n\)的排列\(a\),你需要回答\(q\)组询问,每组询问给出\(l,r\),求有多少个子序列\(t\)使得:\(l\leqslantt_1<t_2<\cdots<t_k\leqslantr\)。\(a_{t_i}|a_{t_{i+1}}(1\leqslanti<k)\)......
  • “postman请求JSON格式,Body内数据无法被idea后端接收,值为null“问题的解决方式
    问题描述:传递数据一切正常,但是:原因剖析:这是因为我们实体类里面属性的命名格式不符合驼峰命名,比如我这种“大写字母开头如CAD”/“一个小写字母+一个大写字母如aDddddd”都不行。解决方法:方法1:不推荐,不好用把自己实体类中的属性的名字都改成标准格式,要么是“全小写如id......
  • 如何让 VideoCapture 返回错误而不是警告?
    当尝试在Linux上实现基本的try/except语句以从相机获取帧时,我注意到当相机丢失或设备索引错误时,OpenCV不会引发错误;相反,它会打印一条警告。我怎样才能捕捉到这个?示例:importcv2deffoo(camera_index):try:cap=cv2.VideoCapture(camera_index)......
  • 在.net 8中使用HttpClientFactory时日志记录请求body和响应body
     1、定义DelegatingHandlerpublicclassLoggingHandler:DelegatingHandler{privatereadonlyILogger<LoggingHandler>_logger;publicLoggingHandler(ILogger<LoggingHandler>logger){_logger=logger;}protectedov......
  • 解决cv2.VideoCapture无法打开摄像头
    上手YOLOV8,训练完了,生成了权重pt文件,用cv2调用摄像头,失败,报错[ERROR:[email protected]]globalobsensor_uvc_stream_channel.cpp:159cv::obsensor::getStreamChannelGroupCameraindexoutofrange 搜索了下,说是Videocapture方法得传参,加上,不报错了,但是警告,没法用[WARN:[email protected]]......