Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
hitsz-zuoqi opened this issue Mar 24, 2022 · 17 comments

Comments

@hitsz-zuoqi
Copy link

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

@Arthur151
Copy link
Owner

Arthur151 commented Mar 24, 2022

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

@hitsz-zuoqi
Copy link
Author

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

@hitsz-zuoqi
Copy link
Author

hitsz-zuoqi commented Mar 24, 2022

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

@Arthur151
Copy link
Owner

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

@hitsz-zuoqi
Copy link
Author

hitsz-zuoqi commented Mar 24, 2022

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

@Arthur151
Copy link
Owner

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

@hitsz-zuoqi
Copy link
Author

hitsz-zuoqi commented Mar 30, 2022

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

@Arthur151
Copy link
Owner

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

@Arthur151
Copy link
Owner

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

@hitsz-zuoqi
Copy link
Author

hitsz-zuoqi commented Mar 30, 2022

原始视频在这:

sample_video6.mp4

frankmocap的han_hand_long.mp4也会有这个问题,视频太大上传不了,这是下载地址

wget https://dl.fbaipublicfiles.com/eft/sampledata_frank.tar

@hitsz-zuoqi
Copy link
Author

我可能找到抖动的原因了,我尝试把动作导进blender里面,发现下面这种情况:

default.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巨大的跳动,视频:

han_hand_long_results.mp4

推理是用的公开的hrnet32权重,我在想是不是数据集中既包含了EFT的SMPL回归的3D关节点,又包含了公开数据集的GT导致的bias?

@Arthur151
Copy link
Owner

Arthur151 commented Mar 30, 2022

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

@Arthur151
Copy link
Owner

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

@hitsz-zuoqi
Copy link
Author

hitsz-zuoqi commented Mar 30, 2022

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

@Arthur151
Copy link
Owner

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

@nikkorejz
Copy link

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

@nikkorejz
Copy link

nikkorejz commented Apr 29, 2022

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants