ROMP
ROMP copied to clipboard
小模型训练到30epoch loss值不下降,infer视频之后发现SMPL body始终在人物上方
V1_mbv3_h36m,mpiinf,coco,mpii,lsp,muco,crowdpose_g0,1,2,3.log 可以帮忙看一下这个mobilenetv3的训练日志吗? 他的validation 指标下降到140&90附近就感觉卡住了,而且我把30epoch的模型拿出来测试了一下,发现SMPL body会飘在人物上面,我的想法是训练的时候body center heatmap应该是最先收敛的,所以即便pose上误差比较大,det loss应该收敛,也就是不会产生这种飘在人物上方的现象,不知道您训练的时候有没有这种问题,希望您能给出建议~
我在resnet的基础上将batch_size 调整为了128,lr 相应x2 为 0.0001
图示:
看log您这里训练没有使用预训练模型吧,通过其他GitHub developer的反馈,直接从0训ROMP比较难,很需要2D pose的预训练的,您可以像我这里使用HigherHRNet-32作为预训练模型,用其他2D pose训好的mobilenet开始也可以,但因为ROMP的图片处理方式不太一样,所以也要训一段时间,但应该不会陷入不收敛的情况。
还有一种简洁高效的思路,就是模型蒸馏,直接蒸大模型的输出就好了,我试过蒸小模型,很有效,很快就能训好。
有这方面的问题,可以及时问我,我后面也想蒸一个可以cpu上实时跑的模型用。
关于偏移的问题,只是配置的问题,训练的时候设置的smpl_mesh_root_align=True
,测试的时候也要这样设置,就好了。
可能还是lr=0.00005, bs=64比较好训,batch size也不是越大越好的,训练也需要一定的随机性才能跳出局部极值。
好的谢谢,我尝试之后有结论会分享出来的
INFO:root:missing parameters of layers:['_result_parser.params_map_parser.smpl_model.betas', '_result_parser.params_map_parser.smpl_model.faces_tensor', '_result_parser.params_map_parser.smpl_model.v_template', '_result_parser.params_map_parser.smpl_model.shapedirs', '_result_parser.params_map_parser.smpl_model.J_regressor', '_result_parser.params_map_parser.smpl_model.J_regressor_extra9', '_result_parser.params_map_parser.smpl_model.J_regressor_h36m17', '_result_parser.params_map_parser.smpl_model.posedirs', '_result_parser.params_map_parser.smpl_model.parents', '_result_parser.params_map_parser.smpl_model.lbs_weights', '_result_parser.params_map_parser.smpl_model.vertex_joint_selector.extra_joints_idxs']
我在load teacher模型hrnet32时会报出这个warning,我觉得应该不会影响params_map和center_map层的蒸馏,想问下result_parser在程序中的主要作用是什么?
(回复早上的:smpl_mesh_root_align调整有用,目前mbv3 from scratch 训到132&85的指标)
不会影响蒸馏的。 result_parser是将模型输出的Center heatmap 和 parameter map转化成多人mesh结果,就是一个后处理过程。
好的,关于蒸馏我直接用mse计算centermap以及paramsmap的teacher和student的loss,与gt给出的loss一起回传,请问我这样是否合理?(1000倍是我按照大小调的)
if self.distillation_learning:
distillated_output = self.teacher_model(meta_data, **self.teacher_train_cfg)
d_center_loss = 1000*self.distillation_loss(outputs['center_map'], distillated_output['center_map'])
d_params_loss = 1000*self.distillation_loss(outputs['params_maps'],distillated_output['params_maps'])
# for key,value in distillated_output.items():
# print(key,value.shape)
# print(outputs['center_map'].shape,outputs['params_maps'].shape)
if not self.model_return_loss:
outputs.update(self._calc_loss(outputs))
loss, outputs = self.mutli_task_uncertainty_weighted_loss(outputs)
# print(d_center_loss, d_params_loss, loss)
loss = loss + d_center_loss + d_params_loss
outputs['loss_dict']['d_center_loss'] = d_center_loss.item()
outputs['loss_dict']['d_params_loss'] = d_params_loss.item()
这段看起来没什么问题。可以这样先试试。
https://user-images.githubusercontent.com/58206232/160743721-09eda6d9-6691-49ee-b4d0-cde57b8f8b74.mp4
您好,请问您知道这样子shape一会变大一会变小是怎么回事嘛? 这是我的video.yml配置 ` ARGS: tab: 'process_video' gpu: 0
backbone: 'mbv3' model_precision: 'fp32' val_batch_size: 8 nw: 4 model_path: /test/checkpoints/mbv3_cm64_V1_mbv3_on_gpu0,1,2,3_val/23_129.7699_84.7924_mbv3_cm64_V1_mbv3.pkl # '../trained_models/ROMP_ResNet50_V1.pkl' smpl_mesh_root_align: True centermap_conf_thresh: 0.25
make_tracking: True temporal_optimization: True smooth_coeff: 4. show_largest_person_only: True show_mesh_stand_on_image: False soi_camera: 'far' # 'close' # 'far' renderer: 'pytorch3d' # 'pyrender' 'pytorch3d'
inputs: 'demo/videos/sample_video6.mp4' # None output_dir: 'demo/sample_video6_results/' save_mesh: False save_centermap: False save_dict_results: True save_visualization_on_img: True fps_save: 24 mesh_cloth: 'ghostwhite' #'LightCyan' `
我发现不光是小模型,HRNet32也会有这种情况~
我调一下,谢谢bug report。 建议直接用simple-romp,https://github.com/Arthur151/ROMP/blob/master/simple_romp/README.md 我后面主要维护simple-romp了,目前版本的代码将会弃用。
@hitsz-zuoqi ,原始输入视频可以发一下么?我用来测试debug。 其他视频也有这种问题么?
原始视频在这:
https://user-images.githubusercontent.com/58206232/160775349-a247769b-7cfc-4ba1-ab99-beef63df6f99.mp4
frankmocap的han_hand_long.mp4也会有这个问题,视频太大上传不了,这是下载地址
wget https://dl.fbaipublicfiles.com/eft/sampledata_frank.tar
我可能找到抖动的原因了,我尝试把动作导进blender里面,发现下面这种情况:
https://user-images.githubusercontent.com/58206232/160832549-dc345e6c-efd8-4011-b2f4-b6d8edaacd5e.mov
然后我在打印了一下cam_trans参数,发现他的z轴实际变化很大
outputs = self.net_forward(meta_data, cfg=self.demo_cfg) print(outputs['cam_trans'])
tensor([[0.1460, 0.2900, 1.3764], [0.1620, 0.2769, 1.1936], [0.1804, 0.2648, 1.3556], [0.1628, 0.2759, 1.1918], [0.1716, 0.2663, 1.2661], [0.1736, 0.2654, 1.2757], [0.1844, 0.2585, 1.3113], [0.1841, 0.2599, 1.3574]], device='cuda:0') tensor([[0.1750, 0.2703, 1.3580], [0.1844, 0.2623, 1.3651], [0.1812, 0.2640, 1.3498], [0.1822, 0.2620, 1.3522], [0.1829, 0.2551, 1.3109], [0.1797, 0.2626, 1.3373], [0.1844, 0.2532, 1.3084], [0.1819, 0.2628, 1.3448]], device='cuda:0') tensor([[0.1807, 0.2618, 1.3414], [0.1878, 0.2549, 1.3203], [0.1884, 0.2544, 1.3215], [0.1912, 0.2547, 1.3453], [0.1790, 0.2672, 1.3424], [0.1793, 0.2663, 1.3289], [0.1776, 0.2668, 1.2898], [0.1797, 0.2654, 1.3311]], device='cuda:0')
发现前后帧会有1.3764-->1.1936---->1.3556巨大的跳动,视频:
https://user-images.githubusercontent.com/58206232/160833429-986dcce8-060b-4a50-8cef-1b51178ee131.mp4
推理是用的公开的hrnet32权重,我在想是不是数据集中既包含了EFT的SMPL回归的3D关节点,又包含了公开数据集的GT导致的bias?
是的,单目深度的模糊性在半身的时候会更加明显,导致深度估计的不稳定,可以强化translation的smooth coefficient,来增强稳定性,强制稳定。 比如,{'cam': OneEuroFilter(1., .0).....}
@hitsz-zuoqi ,还是用simple-romp吧,simple-romp没有这个bug,其他人也向我汇报了这个bug了。
好的,simple-romp是怎么解决这个bug的呢? 我观察到OneEuroFilter的参数mincutoff越小好像越稳定,但是我调成0他的trans也不是固定不变的,请问您知道怎么固定trans不变嘛?
simple-romp去掉了不必要的操作,这样可能减少了bug的产生。 想固定trans参数,可以对trans估计求平均,然后将均值赋值trans,或者某一帧的结果也可以。。
Hi, @hitsz-zuoqi did you manage to complete the distillation of the model?
Hey, @Arthur151 ! Have a nice day! @hitsz-zuoqi Do you know where you can download a mobilenet backbone with a pre-trained 2D pose?