ROMP icon indicating copy to clipboard operation
ROMP copied to clipboard

小模型训练到30epoch loss值不下降,infer视频之后发现SMPL body始终在人物上方

Open hitsz-zuoqi opened this issue 2 years ago • 17 comments

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 图示: image

hitsz-zuoqi avatar Mar 24 '22 03:03 hitsz-zuoqi

看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也不是越大越好的,训练也需要一定的随机性才能跳出局部极值。

Arthur151 avatar Mar 24 '22 03:03 Arthur151

好的谢谢,我尝试之后有结论会分享出来的

hitsz-zuoqi avatar Mar 24 '22 03:03 hitsz-zuoqi

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的指标)

hitsz-zuoqi avatar Mar 24 '22 13:03 hitsz-zuoqi

不会影响蒸馏的。 result_parser是将模型输出的Center heatmap 和 parameter map转化成多人mesh结果,就是一个后处理过程。

Arthur151 avatar Mar 24 '22 13:03 Arthur151

好的,关于蒸馏我直接用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()

hitsz-zuoqi avatar Mar 24 '22 13:03 hitsz-zuoqi

这段看起来没什么问题。可以这样先试试。

Arthur151 avatar Mar 24 '22 13:03 Arthur151

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也会有这种情况~

hitsz-zuoqi avatar Mar 30 '22 03:03 hitsz-zuoqi

我调一下,谢谢bug report。 建议直接用simple-romp,https://github.com/Arthur151/ROMP/blob/master/simple_romp/README.md 我后面主要维护simple-romp了,目前版本的代码将会弃用。

Arthur151 avatar Mar 30 '22 03:03 Arthur151

@hitsz-zuoqi ,原始输入视频可以发一下么?我用来测试debug。 其他视频也有这种问题么?

Arthur151 avatar Mar 30 '22 04:03 Arthur151

原始视频在这:

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

hitsz-zuoqi avatar Mar 30 '22 07:03 hitsz-zuoqi

我可能找到抖动的原因了,我尝试把动作导进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?

hitsz-zuoqi avatar Mar 30 '22 12:03 hitsz-zuoqi

是的,单目深度的模糊性在半身的时候会更加明显,导致深度估计的不稳定,可以强化translation的smooth coefficient,来增强稳定性,强制稳定。 比如,{'cam': OneEuroFilter(1., .0).....}

Arthur151 avatar Mar 30 '22 12:03 Arthur151

@hitsz-zuoqi ,还是用simple-romp吧,simple-romp没有这个bug,其他人也向我汇报了这个bug了。

Arthur151 avatar Mar 30 '22 12:03 Arthur151

好的,simple-romp是怎么解决这个bug的呢? 我观察到OneEuroFilter的参数mincutoff越小好像越稳定,但是我调成0他的trans也不是固定不变的,请问您知道怎么固定trans不变嘛?

hitsz-zuoqi avatar Mar 30 '22 13:03 hitsz-zuoqi

simple-romp去掉了不必要的操作,这样可能减少了bug的产生。 想固定trans参数,可以对trans估计求平均,然后将均值赋值trans,或者某一帧的结果也可以。。

Arthur151 avatar Mar 31 '22 01:03 Arthur151

Hi, @hitsz-zuoqi did you manage to complete the distillation of the model?

nikkorejz avatar Apr 21 '22 04:04 nikkorejz

Hey, @Arthur151 ! Have a nice day! @hitsz-zuoqi Do you know where you can download a mobilenet backbone with a pre-trained 2D pose?

nikkorejz avatar Apr 29 '22 13:04 nikkorejz