Arthur151 / ROMP

Monocular, One-stage, Regression of Multiple 3D People and their 3D positions & trajectories in camera & global coordinates. ROMP[ICCV21], BEV[CVPR22], TRACE[CVPR2023]
https://www.yusun.work/
Apache License 2.0
1.35k stars 229 forks source link

数据处理细节讨论 #47

Closed zhLawliet closed 3 years ago

zhLawliet commented 3 years ago

你好,我看你论文提到使用了Movi数据集,原始的Movi数据集只提供了3d以及AMASS通过fitting得到的关于SMPL-H的mesh参数。SMPL-H关于shape有16个值,pose有52个,我想知道你在使用Movi的数据集时候,是否使用了AMASS提供的pose和beta。我目前将beta的前10个值和pose前22个值导入到我们当前的SMPL里面,然后借助Movi提供的相机内参和外参以及参考Movi提供的教程,始终无法在我们这个程序中可视化成功。求指教。

如果没有使用,是不是因为AMASS提供的beta和pose不适用我们这个SMPL模型,但是看AMASS论文好像是可以的。 MoVi-Toolbox:MoVi-Toolbox https://github.com/saeed1262/MoVi-Toolbox/blob/master/MoCap/utils.py

按照Movi的教程以及将其mesh系数按照beta[0:10] pose[0:22] + 两个手部pose设置为0传入到我们当前的SMPL smpl_model_path = './centerHMR/models/smpl/SMPL_NEUTRAL.pkl' self.smplx = smpl_model.create(smpl_model_path, batch_size=self.batch_size,model_type=self.model_type, gender='neutral', use_face_contour=False, ext='npz', joint_mapper=joint_mapper,flat_hand_mean=True, use_pca=False).cuda()

image

@Arthur151

Arthur151 commented 3 years ago

Sorry, I haven't managed to project the posed mesh back to 2D image too. I have talked with the author. The pose parameters seem precise enough for training the model. But there are something wrong with the global orientation (pose[:3]), which cause the failure.

zhLawliet commented 3 years ago

ok,thanks

zhLawliet commented 3 years ago

你好,请问下,movi,hm3.6这些数据在训练的时候,是否做了背景增强?如果做了,他们的人像mask是通过某个开源人像分割模型得到的吗

zhLawliet commented 3 years ago

@Arthur151 目前根据论文看到你这边用到的数据集主要是hm3.6,3dpw,mpi-3dhp,movi, mscoco,不知道是否还用到了其他数据集没?

Arthur151 commented 3 years ago

我训练的时候没有用背景增强。我的训练数据集主要是Human3.6M, MPI-INF-3DHP, MSCOCO, MPII, LSP, UP, AI Challenger(keypoint). 增强版模型还用了MuCo-3DHP, Crowdpose, 3DOH50K。

zhLawliet commented 3 years ago

好的,谢谢,那像 MPI-INF-3DHP这种只有2d,3d标签的数据集,你会自己去fitting出SMPL系数作为gt吗?

Arthur151 commented 3 years ago

我是直接用的关节点监督的。fit的感觉形状很怪。

zhLawliet commented 3 years ago

嗯,谢谢,我确认一下,所以2d数据集,就只能用于重投影监督loss,有2d和3d的数据集,就只监督重投影监督loss和3dloss,有SMPL系数的数据集,则都会进行监督;对于只有2d和3d的数据集,不会去特定通过2d和3d去fiting出smpl系数作为标签。 另外再请教一个问题:训练的时候一个batch里面会包含不同数据类型(类型1:只有2d标签,类型2:只有2d和3d标签,类型3:包含2d,3d,smpl系数标签),那么每一种数据类型在一个batch里面的比值有讲究吗?

Arthur151 commented 3 years ago

肯定有啊,需要去调整的。主要还是看数据能贡献出来的训练价值和模型每个阶段的学习状态。

zhLawliet commented 3 years ago

好的,非常感谢了

zhLawliet commented 3 years ago

你好,想确认一下,hm3.6数据集你是怎么使用的,只是使用了他的3d点和基于相机参数投影得到的2d点吗?我看有的工作会fitting出SMPL系数进行监督。

Arthur151 commented 3 years ago

hm3.6数据集可以通过MoSh算法求得SMPL参数,用于训练。

zhLawliet commented 3 years ago

好的,非常感谢

zhLawliet commented 3 years ago

你好,有几个问题请教一下: 问题1:hm3.6这里可以理解有两个3d标签,一个是hm3.6数据集本身提供了3d点,,另外一个是通过其smpl系数导入SMPL得到的3d点,在监督3dloss的时候,这种真实采集的的3d点和这种smpl输出的3d点是等价的吗?因为我使用相同相机参数可视化这两个3d点的时候,存在scale有明显偏差。

问题2:补充问题1:发现smpl输出的3d点需要乘以代码里面的cam参数的s才等价真实的3d点的scale。这里真实3d点认为是米为单位。如果这个成立的话,那你在训练的时候,smpl输出的3d会乘以相机参数里面的s后,再和真实3d点进行loss计算吗?

问题3:在设计centermap 的标签的时候,因为不同数据集在标注2d点的时候存在主观不一致性,这里对center影响大吗?

Arthur151 commented 3 years ago

1.我还没观察过经相机投影矩阵处理过后的h36m的3D关键点数据是否和smpl参数转化的3D点有尺度偏差,如果有图的化我也方便判断是什么问题。 2.监督3D关节点误差的时候不会乘相机参数。相机参数只是用于投影监督2D关节点误差的。 3.正是为了尽量减低不同数据集关节点定义的差异,ROMP的Center定义是专门设计的,跨数据集稳定的。详情可以看论文方法部分,简单来说就是肢体关节点的中心点。

zhLawliet commented 3 years ago

好的,谢谢,关于”相机投影矩阵处理过后的h36m的3D关键点数据是否和smpl参数转化的3D点有尺度偏差“,我后面整理一下图像和数据发出来。

zhLawliet commented 3 years ago

您好,我目前尝试复现你的开源模型效果,在训练的时候, 相关loss设置如下: e_center_loss_weight: 500. e_2d_loss_weight: 400. e_3d_loss_weight: 500. e_pose_loss_weight: 500. e_shape_loss_weight: 50. (w_prior,w_paj3d,L_2D 没有) 训练集采用了Movi,hm3.6,3dpw,mpi-3dhp,mscoco; 见下图:左边是您的模型输出效果,右边是我的模型输出效果,效果还存在距离,尤其是贴合度方面,尝试通过提升2d loss权重,贴合度会改善,但是影响pose的准确性,尤其global pose。 企业微信截图_61ed750e-3f87-4d71-b2a6-bad5d49d7174 疑问:我目前训练中没有2D pose estimation loss,不知道这个对模型的效果影响多大?您有相关的独立实验对比吗?以及完全按照论文的配置进行训练,是否能够快速复现论文效果?还是说这里存在一些训练技巧需要注意?非常期待你的解答,谢谢

Arthur151 commented 3 years ago

2D pose estimation分支的训练主要是在预训练阶段进行的,对模型最后的性能(尤其是泛化性)影响很大,还是需要使用一些比较有挑战的2D pose数据集来强化模型对2D关键点位置的感知能力,这样估计3D mesh的时候才能对得好。简单来说,当模型对关键点位置的检测能力足够强,再训3D会比较快的训出来,不然基于center表征的这种监督很弱的架构真的要训非常非常久,这个应该不难理解。3DPW目前的评测protocol实际上测试的就是模型的泛化性。训练tricks上是有一些,但我目前没有对所有tricks进行对比实验,没法说具体每个影响有多大。在合适的时候我会把我训出来的pretrain model开源出来,让大家可以快速复现。目前,建议你在我现在放出来的模型基础上fine-tuning,如果精度不降,就说明你的训练代码可以有效训练。

zhLawliet commented 3 years ago

好的,谢谢你的答复

zhLawliet commented 3 years ago

你好,请问下,你谈到训练tricks上是有一些,不知道方便说一下吗?目前我按照你前面谈到的,先训练好2D pose estimation,然后基于它进行fintune训练,效果还是和你的有差距。另外也在放出来的模型基础上fine-tuning,精度没有明显下降。

Arthur151 commented 3 years ago

你目前测试3DPW上是多少啊?训了多久?

zhLawliet commented 3 years ago

我这边计算的MPJPE 和 MPJPE_PA 分别是105.21和77.22。目前用到的总的训练样本数为48.6w(主要是Human3.6M, MPI-INF-3DHP, MSCOCO, MPII, LSP,3dpw),先只训练了2D pose estimation,heatmap_loss为mse,训练了120个epoch,收敛到1.1e-3。然后基于它进行fintune训练,训练了35个 epoch,其中pj2d loss能够收敛到1.4e-3,Lj3d loss收敛到4e-3。

Arthur151 commented 3 years ago

你这还是在3DPW上fine-tunned了的结果啊。。。那这也太离谱了,你确定你的代码fine-tune我开源的模型没掉点么? 这绝对不是什么trick的问题了。。这差的也太多了,在3DPW上fine-tunned了应该PA-MPJPE能到47左右,就算啥也不调估计应该也能到50左右吧。。请问batch size多少?

zhLawliet commented 3 years ago

嗯,有一点忘记说了,我在finetune的时候,将输入改成了128*224了,可视化效果看着差异不大(从pj2d loss的角度上看的话, 0.0009涨到0.0011,在3DPW上的数值分别为100.5,70.1,如果单纯从数值上看,确实增大了,但是可视化的效果感觉差别不是很大,不知道是不是输入分辨率降低的原因,你说的batch size,验证的时候设置为32,训练的时候是96。

Arthur151 commented 3 years ago

这种输入大小我还真没试过。。而且点掉这么多。。感觉可能训练是有点问题的。

zhLawliet commented 3 years ago

好的,谢谢,我再看看,争取先到50

Arthur151 commented 3 years ago

加油。我还在等一个月后的结果,希望可以尽早开源所有代码。

Arthur151 commented 3 years ago

训练代码已开源~

zhLawliet commented 3 years ago

好的,谢谢

littlejiumi commented 2 years ago

想问一下作者h36m标签中kp3d_mono和kp3d有什么区别呀?实际用的是哪个呢?

Arthur151 commented 2 years ago

我们在这里,用的kp3d_mono。kp3d_mono是在每个相机坐标系里的3D关节点的位置,kp3d是在世界坐标系下的位置。

littlejiumi commented 2 years ago

谢谢您的回复!还请问一下h36m的poses为什么是[3,72]维度的?想得到smpl的24个3d点怎么转换呢?

我们在这里,用的kp3d_mono。kp3d_mono是在每个相机坐标系里的3D关节点的位置,kp3d是在世界坐标系下的位置。

Arthur151 commented 2 years ago

h36m是视频数据,我们每5帧取一下标注,但其实它的gt给的还是挺高频的,还提供了中间帧周围的gt,我就一起保存了,如果只用中间帧,就选1就好了。 建议看一下我代码吧,地址都给你了,别偷懒哦

littlejiumi commented 2 years ago

哈哈 好嘞~

yunshangyue71 commented 1 year ago

想请问一下作者,hm36以及mupo-3dph数据集的关节点怎么匹配呢?比如我想使用两个数据集进行训练,即便是同一个joint, neck 每个数据集的标注也不是相同的,这个整合的过程,没有看到您的处理。所以有点疑惑。 新年快乐

Arthur151 commented 1 year ago

您说的很对,现在确实有这个问题,所以导致模型的训练也会有点受这个影响,目前,还是直接默认他们是一个关键点。但最近的有篇文章,可能对您有帮助: Learning 3D Human Pose Estimation from Dozens of Datasets using a Geometry-Aware Autoencoder to Bridge Between Skeleton Formats Istva ́n Sa ́ra ́ndi 他们的做法很有意思,而且看起来还很不错,可以了解一下。

yunshangyue71 commented 1 year ago

多谢您的回复,我参考看一下。另外有三个问题像请教一下, 麻烦您了 1、model based 和sekelton based的选择 我想驱动一个avatar模型,所以需要知道rotation。 目前的方向有两个,一个是3d 关键点估计(skeleton based),另一个是smpl 这种参数化模型(model based) 这两种方式的优缺点都有那些呢?我认为skeleton based 更容易学习(同等效果下,网络可能更小),因为参数化 模型更加抽象 2、 2d转3d 有一个传统的技术是用在电影上的,将2d电影转为3d电影,这个可以用来将2d人转为3d人,这个技术我一直搜不到,您对这了解吗? 2、模型训练的步骤 假如自己有一个idea,像从头训练一个模型,您往往怎么做呢?我的做法如下,您看看有什么不合理或者遗漏的吗?

数据处理部分: 读取数据集(human3.6M) 组织成自己需要的形式,包括网络的input 和 label(是RNN模型还是CNN模型) 根据label解析出来input, 证明自己算法的可行性(也就是说网络训练的好,就能效果好) 数据增强 网络训练部分: 1张图片或者小批量图片训练, 训练集做为验证集,验证效果,效果好,证明整个结构没有问题 开始大量数据集训练

云上月 @.***

 

------------------ 原始邮件 ------------------ 发件人: "Arthur151/ROMP" @.>; 发送时间: 2023年2月3日(星期五) 上午10:33 @.>; @.**@.>; 主题: Re: [Arthur151/ROMP] 数据处理细节讨论 (#47)

您说的很对,现在确实有这个问题,所以导致模型的训练也会有点受这个影响,目前,还是直接默认他们是一个关键点。但最近的有篇文章,可能对您有帮助: Learning 3D Human Pose Estimation from Dozens of Datasets using a Geometry-Aware Autoencoder to Bridge Between Skeleton Formats Istva ́n Sa ́ra ́ndi 他们的做法很有意思,而且看起来还很不错,可以了解一下。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

lxllrx commented 6 months ago

@littlejiumi 您好,我目前在使用h3.6m数据集,我想提取smpl的姿态参数,请问您解决这个问题了吗?期待您的回复