9 Commits
Author SHA1 Message Date
luni 03b5eae0d8 new weight trials, 10_3 didn't run 2023-02-26 11:04:45 +00:00
luni d8337bfcfe gnn with weights 2023-02-25 12:33:18 +00:00
luni 5062ed95d8 weight test with gnn 2023-02-24 22:14:16 +00:00
luni 9fbd09386c Revert "fixed changed reverse?"
This reverts commit ac27319860.
2023-02-21 22:13:16 +01:00
luni ac27319860 fixed changed reverse? 2023-02-21 21:08:05 +00:00
luni 2100d364f9 compare models 2023-02-21 16:06:25 +00:00
luni ebbc52d0fd fix plotting and error calc 2023-02-17 15:31:19 +00:00
luni 33eff16c8c convolutional weights model 2023-02-17 13:11:35 +00:00
luni 61a609c8f7 working weight learning 2023-02-15 11:19:14 +00:00
247 changed files with 1191 additions and 17939 deletions
+6 -203
View File
@@ -1,208 +1,11 @@
nohup python cvae.py --name="lhunor_weights_test_10_2" > nohup/iccv/weights_test_10_2.out 2>&1 &
nohup python evaluate_ae.py --name iccv_weights_test_6 > nohup/iccv/evaluate_iccv_weights_test_6.out 2>&1 &
nohup python calculate_error.py --name iccv_weights_test_6 > nohup/iccv/error_iccv_weights_test_6.out 2>&1 &
one final convolutional layer for smoothing, on the final coordinates one final convolutional layer for smoothing, on the final coordinates
nohup python calculate_error.py --name error_al_all_150k > nohup/error/post_al_all_150k.out 2>&1 &
nohup python auto_encoder_static.py --name="lhunor_static_iccv_1" > nohup/iccv/encoders/static_iccv_1.out 2>&1 &
nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_skirt" > nohup/iccv/encoders/static_iccv_1_skirt.out 2>&1 &
nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_cape_f" > nohup/iccv/encoders/static_iccv_1_cape_f.out 2>&1 &
nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_cape_m" > nohup/iccv/encoders/static_iccv_1_cape_m.out 2>&1 &
nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_10p" > nohup/iccv/encoders/static_iccv_1_10p.out 2>&1 &
nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_25p" > nohup/iccv/encoders/static_iccv_1_25p.out 2>&1 &
nohup python auto_encoder_body.py --name="lhunor_body_iccv_1" > nohup/iccv/encoders/body_iccv_1.out 2>&1 &
nohup python auto_encoder_body.py --name="lhunor_body_iccv_1_skirt" > nohup/iccv/encoders/body_iccv_1_skirt.out 2>&1 &
nohup python auto_encoder_body.py --name="lhunor_body_iccv_1_cape_m" > nohup/iccv/encoders/body_iccv_1_cape_m.out 2>&1 &
nohup python auto_encoder_body.py --name="lhunor_body_iccv_1_10p" > nohup/iccv/encoders/body_iccv_1_10p.out 2>&1 &
nohup python auto_encoder_body.py --name="lhunor_body_iccv_1_25p" > nohup/iccv/encoders/body_iccv_1_25p.out 2>&1 &
nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1" > nohup/iccv/encoders/curv_iccv_1.out 2>&1 &
nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_skirt" > nohup/iccv/encoders/curv_iccv_1_skirt.out 2>&1 &
nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_cape_f" > nohup/iccv/encoders/curv_iccv_1_cape_f.out 2>&1 &
nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_cape_m" > nohup/iccv/encoders/curv_iccv_1_cape_m.out 2>&1 &
nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_10p" > nohup/iccv/encoders/curv_iccv_1_10p.out 2>&1 &
nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_25p" > nohup/iccv/encoders/curv_iccv_1_25p.out 2>&1 &
nohup python cvae.py --name="lhunor_cvae_iccv_gnn_1" > nohup/iccv/cvae_iccv_gnn_1.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_all" > nohup/iccv/ablation/abl_all_3.out 2>&1 & skirts!!!!
nohup python cvae.py --name="lhunor_abl_all_gnn" > nohup/iccv/ablation/abl_all_gnn.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_all_gnn_2" > nohup/iccv/ablation/abl_all_gnn.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_all_cape_f" > nohup/iccv/ablation/abl_all_cape_f_2.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_all_skirt" > nohup/iccv/ablation/abl_all_skirt.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_all_skirt_var" > nohup/iccv/ablation/abl_all_skirt_var.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_all_skirt_var" > nohup/iccv/ablation/abl_all_skirt_var_2.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_curv" > nohup/iccv/ablation/abl_curv.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_curv_skirt" > nohup/iccv/ablation/abl_curv_skirt.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_skin" > nohup/iccv/ablation/abl_skin.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_skin_skirt" > nohup/iccv/ablation/abl_skin_skirt.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_reg" > nohup/iccv/ablation/abl_reg.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_reg_skirt" > nohup/iccv/ablation/abl_reg_skirt.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_off" > nohup/iccv/ablation/abl_off.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_skin_curv" > nohup/iccv/ablation/abl_skin_curv.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_skin_curv_skirt" > nohup/iccv/ablation/abl_skin_curv_skirt.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_skin_reg" > nohup/iccv/ablation/abl_skin_reg.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_skin_reg_skirt" > nohup/iccv/ablation/abl_skin_reg_skirt.out 2>&1 &
nohup python cvae.py --name="lhunor_abl_skin_var" > nohup/iccv/ablation/abl_skin_var.out 2>&1 &
nohup python evaluate_ae.py --name abl_all > nohup/iccv/evaluate/abl_all.out 2>&1 &
nohup python evaluate_ae.py --name abl_all_skirt > nohup/iccv/evaluate/abl_all_skirt.out 2>&1 &
nohup python cvae_curv.py --name="lhunor_cvae_curv" > nohup/iccv/ablation/cvae_curv_3.out 2>&1 &
nohup python upscale_test.py --name="iccv_32_2" > nohup/iccv/upscale/iccv_32_2.out 2>&1 &
nohup python upscale_test.py --name="iccv_64_2" > nohup/iccv/upscale/iccv_64_2.out 2>&1 &
nohup python upscale_test.py --name="iccv_128_2" > nohup/iccv/upscale/iccv_128_2.out 2>&1 &
nohup python upscale_test.py --name="iccv_256_2" > nohup/iccv/upscale/iccv_256_2.out 2>&1 &
nohup python upscale_test.py --name="iccv_32_2_skirt" > nohup/iccv/upscale/iccv_32_2_skirt.out 2>&1 &
nohup python upscale_test.py --name="iccv_64_2_skirt" > nohup/iccv/upscale/iccv_64_2_skirt.out 2>&1 &
nohup python upscale_test.py --name="iccv_128_2_skirt" > nohup/iccv/upscale/iccv_128_2_skirt.out 2>&1 &
nohup python upscale_test.py --name="iccv_256_2_skirt" > nohup/iccv/upscale/iccv_256_2_skirt.out 2>&1 &
nohup python upscale_test.py --name="iccv_32_2_cape_f" > nohup/iccv/upscale/iccv_32_2_cape_f_real.out 2>&1 &
nohup python upscale_test.py --name="iccv_64_2_cape_f" > nohup/iccv/upscale/iccv_64_2_cape_f.out 2>&1 &
nohup python upscale_test.py --name="iccv_128_2_cape_f" > nohup/iccv/upscale/iccv_128_2_cape_f.out 2>&1 &
nohup python upscale_test.py --name="iccv_256_2_cape_f" > nohup/iccv/upscale/iccv_256_2_cape_f.out 2>&1 &
nohup python upscale_test.py --name="iccv_32_2_cape_m" > nohup/iccv/upscale/iccv_32_2_cape_m.out 2>&1 &
nohup python upscale_test.py --name="iccv_64_2_cape_m" > nohup/iccv/upscale/iccv_64_2_cape_m.out 2>&1 &
nohup python upscale_test.py --name="iccv_128_2_cape_m" > nohup/iccv/upscale/iccv_128_2_cape_m.out 2>&1 &
nohup python upscale_test.py --name="iccv_256_2_cape_m" > nohup/iccv/upscale/iccv_256_2_cape_m.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32" > nohup/iccv/pyr/iccv_pyr_32.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_var" > nohup/iccv/pyr/iccv_pyr_32_var.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_skirt" > nohup/iccv/pyr/iccv_pyr_32_skirt_2.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_skin" > nohup/iccv/pyr/iccv_pyr_32_skin.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_skin_skirt" > nohup/iccv/pyr/iccv_pyr_32_skin_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_curv" > nohup/iccv/pyr/iccv_pyr_32_curv.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_curv_skirt" > nohup/iccv/pyr/iccv_pyr_32_curv_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_reg" > nohup/iccv/pyr/iccv_pyr_32_reg.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_reg_skirt" > nohup/iccv/pyr/iccv_pyr_32_reg_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_10p" > nohup/iccv/pyr/iccv_pyr_32_10p.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_25p" > nohup/iccv/pyr/iccv_pyr_32_25p.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_jumpsuit" > nohup/iccv/pyr/iccv_pyr_32_jumpsuit.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_trousers" > nohup/iccv/pyr/iccv_pyr_32_trousers.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_top" > nohup/iccv/pyr/iccv_pyr_32_top.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_tshirt" > nohup/iccv/pyr/iccv_pyr_32_tshirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_skirt_skirt" > nohup/iccv/pyr/iccv_pyr_32_skirt_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_skirt_dress" > nohup/iccv/pyr/iccv_pyr_32_skirt_dress.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_skirt_batch" > nohup/iccv/pyr/iccv_pyr_32_skirt_batch.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64" > nohup/iccv/pyr/iccv_pyr_32_64.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_skin" > nohup/iccv/pyr/iccv_pyr_32_64_skin.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_skin_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_skin_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_curv" > nohup/iccv/pyr/iccv_pyr_32_64_curv.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_curv_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_curv_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_reg" > nohup/iccv/pyr/iccv_pyr_32_64_reg.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_reg_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_reg_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_10p" > nohup/iccv/pyr/iccv_pyr_32_64_10p.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_25p" > nohup/iccv/pyr/iccv_pyr_32_64_25p.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_cape_f" > nohup/iccv/pyr/iccv_pyr_64_cape_f.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_cape_m" > nohup/iccv/pyr/iccv_pyr_64_cape_m.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_cape_m_00032_SL" > nohup/iccv/pyr/iccv_pyr_64_cape_m_00032_SL.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_cape_f_03223_SL" > nohup/iccv/pyr/iccv_pyr_64_cape_f_03223_SL.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_cape_f_03223_SS" > nohup/iccv/pyr/iccv_pyr_64_cape_f_03223_SS.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_128_cape_f" > nohup/iccv/pyr/iccv_pyr_64_128_cape_f.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_128_cape_m" > nohup/iccv/pyr/iccv_pyr_64_128_cape_m.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_128_256_cape_f" > nohup/iccv/pyr/iccv_pyr_64_128_256_cape_f.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_pre_cape_f" > nohup/iccv/pyr/iccv_pyr_64_pre_cape_f.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128" > nohup/iccv/pyr/iccv_pyr_32_64_128.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_128_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_skin" > nohup/iccv/pyr/iccv_pyr_32_64_128_skin_2.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_skin_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_128_skin_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_reg" > nohup/iccv/pyr/iccv_pyr_32_64_128_reg_2.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_curv" > nohup/iccv/pyr/iccv_pyr_32_64_128_curv.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_curv_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_128_curv_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_var" > nohup/iccv/pyr/iccv_pyr_32_64_128_var.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_128_cape_m_00032_SL" > nohup/iccv/pyr/iccv_pyr_64_128_cape_m_00032_SL.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_128_cape_f_03223_SL" > nohup/iccv/pyr/iccv_pyr_64_128_cape_f_03223_SL.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_64_128_cape_f_03223_SS" > nohup/iccv/pyr/iccv_pyr_64_128_cape_f_03223_SS.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_2.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_skirt_2.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_skin" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_skin.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_curv" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_curv.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_curv_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_curv_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_reg" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_reg.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_seq" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_seq.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_512" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_512.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_512_skirt" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_512_skirt.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_512_skin" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_512_skin.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_512_curv" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_512_curv.out 2>&1 &
nohup python cvae_pyramid.py --name="lhunor_iccv_pyr_32_64_128_256_512_reg" > nohup/iccv/pyr/iccv_pyr_32_64_128_256_512_reg.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32 > nohup/iccv/evaluate/iccv_pyr_32.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_skirt > nohup/iccv/evaluate/iccv_pyr_32_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_skin > nohup/iccv/evaluate/iccv_pyr_32_skin.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_skin_skirt > nohup/iccv/evaluate/iccv_pyr_32_skin_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_reg > nohup/iccv/evaluate/iccv_pyr_32_reg.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_reg_skirt > nohup/iccv/evaluate/iccv_pyr_32_reg_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_curv > nohup/iccv/evaluate/iccv_pyr_32_curv.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_curv_skirt > nohup/iccv/evaluate/iccv_pyr_32_curv_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_10p > nohup/iccv/evaluate/iccv_pyr_32_10p.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_25p > nohup/iccv/evaluate/iccv_pyr_32_25p.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64 > nohup/iccv/evaluate/iccv_pyr_32_64.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_skin > nohup/iccv/evaluate/iccv_pyr_32_64_skin.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_skin_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_skin_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_reg > nohup/iccv/evaluate/iccv_pyr_32_64_reg.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_curv > nohup/iccv/evaluate/iccv_pyr_32_64_curv.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_curv_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_curv_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_10p > nohup/iccv/evaluate/iccv_pyr_32_64_10p.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_25p > nohup/iccv/evaluate/iccv_pyr_32_64_25p.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128 > nohup/iccv/evaluate/iccv_pyr_32_64_128.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_128_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_skin > nohup/iccv/evaluate/iccv_pyr_32_64_128_skin.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_skin_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_128_skin_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_reg > nohup/iccv/evaluate/iccv_pyr_32_64_128_reg.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_curv > nohup/iccv/evaluate/iccv_pyr_32_64_128_curv.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_curv_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_128_curv_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256 > nohup/iccv/evaluate/iccv_pyr_32_64_128_256.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_seq > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_seq.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_skin > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_skin.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_curv > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_curv.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_reg > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_reg.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_512 > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_512.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_512_skirt > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_512_skirt.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_512_reg > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_512_reg.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_512_skin > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_512_skin.out 2>&1 &
nohup python evaluate_ae_pyramid.py --name evaluate_ae_iccv_pyr_32_64_128_256_512_curv > nohup/iccv/evaluate/iccv_pyr_32_64_128_256_512_curv.out 2>&1 &
nohup python cvae.py --name="lhunor_cape_f_03223_SL" > nohup/iccv/ablation/abl_all_cape_f_03223_SL.out 2>&1 &
nohup python cvae.py --name="lhunor_cape_f_03223_SS" > nohup/iccv/ablation/abl_all_cape_f_03223_SS.out 2>&1 &
nohup python cvae.py --name="lhunor_cape_m_00032_SL" > nohup/iccv/ablation/abl_all_cape_m_00032_SL.out 2>&1 &
skirts!!!!iccv_pyr_32_curv_skirt
pyramid next week pyramid next week
basic final, basic final skirts, basic final, basic final skirts,
+8 -19
View File
@@ -1,6 +1,6 @@
import os import os
import sys import sys
from configs.iccv.config_ae_body_25p import config from configs.config_ae_body_post import config
os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu']
import tensorflow as tf import tensorflow as tf
@@ -31,11 +31,10 @@ from losses import edge_loss, uv_mask_loss
from dataset import DatasetFactory, StaticDataset from dataset import DatasetFactory, StaticDataset
from custom_utils.custom_utils import batch_to_dict, plot_3d from custom_utils.custom_utils import batch_to_dict, plot_3d
from models.cond_encoder import AutoEncoderNew as AutoEncoder from models.cond_encoder import AutoEncoderNew as AutoEncoder
from custom_utils.custom_utils import Accumulator
def init_wandb(): def init_wandb():
run = wandb.init(project='ae', name=config['name'], notes=config['notes'], dir='/tmp', tags=config['tags']) run = wandb.init(project='ae', name=config['name'], notes=config['notes'], dir='/home/workspace/local-data/temp')
artifact = wandb.Artifact('code', type='code') artifact = wandb.Artifact('code', type='code')
artifact.add_file('auto_encoder_body.py') artifact.add_file('auto_encoder_body.py')
artifact.add_file('losses.py') artifact.add_file('losses.py')
@@ -45,9 +44,7 @@ def init_wandb():
artifact.add_file('convnext/models/convnext_tf.py') artifact.add_file('convnext/models/convnext_tf.py')
config_file_names = [key for key in sys.modules.keys() if key.startswith('configs.')] config_file_names = [key for key in sys.modules.keys() if key.startswith('configs.')]
for config_file_name in config_file_names: for config_file_name in config_file_names:
file_name = '/'.join(config_file_name.split('.')) + '.py' artifact.add_file('/'.join(config_file_name.split('.')) + '.py')
if os.path.exists(file_name):
artifact.add_file(file_name)
run.log_artifact(artifact) run.log_artifact(artifact)
uv2mesh = UV2Mesh(res=256, is_smpl_orig=config['is_cape'], is_skirt=config['is_skirt']) uv2mesh = UV2Mesh(res=256, is_smpl_orig=config['is_cape'], is_skirt=config['is_skirt'])
@@ -127,27 +124,20 @@ def train():
for batch in dataset_train: for batch in dataset_train:
batch = static_dataset_train.expand_batch(batch_to_dict(batch, config['signature_dynamic'])) batch = static_dataset_train.expand_batch(batch_to_dict(batch, config['signature_dynamic']))
train_loss = train_step(batch) train_loss = train_step(batch)
train_accumulator.update(train_loss)
if step % 25 == 0:
data_valid = valid_iterator.get_next() data_valid = valid_iterator.get_next()
data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic']))
valid_loss = valid_step(data_valid) valid_loss = valid_step(data_valid)
valid_accumulator.update(valid_loss)
if step % 1000 == 0 or (step < 1000 and step % 100 == 0): to_log = { **train_loss, **valid_loss, **{ 'current_step': step} }
to_log = dict({ **train_loss, **valid_loss, **{ 'current_step': step } }) if step % 5000 == 0 or (step < 5000 and step % 500 == 0):
if step % 5000 == 0 or (step < 5000 and step % 1000 == 0):
train_figs = plot_everything(batch, 'train') train_figs = plot_everything(batch, 'train')
valid_figs = plot_everything(data_valid, 'valid') valid_figs = plot_everything(data_valid, 'valid')
to_log = { **to_log, **train_figs, **valid_figs } to_log = { **to_log, **train_figs, **valid_figs }
if step == 0: if step == 0:
to_log = { **to_log, **{ 'model/summary': wandb.Html(get_summary_html(model)) } } to_log = { **to_log, **{ 'model/summary': wandb.Html(get_summary_html(model)) } }
wandb.log(to_log, step=step) wandb.log(to_log, step=step)
train_accumulator.reset()
valid_accumulator.reset()
if step % 10000 == 0: if step % 10000 == 0:
manager_enc.save(checkpoint_number=step) manager_enc.save(checkpoint_number=step)
@@ -160,6 +150,7 @@ def train():
if __name__ == '__main__': if __name__ == '__main__':
init_wandb() init_wandb()
allow_memory_growth()
parser = argparse.ArgumentParser(description='') parser = argparse.ArgumentParser(description='')
parser.add_argument('--name', type=str) parser.add_argument('--name', type=str)
args = vars(parser.parse_args()) args = vars(parser.parse_args())
@@ -205,15 +196,13 @@ if __name__ == '__main__':
model = AutoEncoder(config['cond_ae']) model = AutoEncoder(config['cond_ae'])
optimizer = tf.optimizers.Adam(learning_rate=config['lr']) optimizer = tf.optimizers.Adam(learning_rate=config['lr'])
train_accumulator = Accumulator()
valid_accumulator = Accumulator()
# load_model(model.encoder, 'checkpoints/body_1_skirt_2_enc') # load_model(model.encoder, 'checkpoints/body_1_skirt_2_enc')
# load_model(model.decoder, 'checkpoints/body_1_skirt_2_dec') # load_model(model.decoder, 'checkpoints/body_1_skirt_2_dec')
ckpt_enc = tf.train.Checkpoint(model=model.encoder) ckpt_enc = tf.train.Checkpoint(model=model.encoder)
manager_enc = tf.train.CheckpointManager(ckpt_enc, 'checkpoints/iccv/' + config['name'] + '_enc', max_to_keep=20) manager_enc = tf.train.CheckpointManager(ckpt_enc, 'checkpoints/post/' + config['name'] + '_enc', max_to_keep=20)
ckpt_dec = tf.train.Checkpoint(model=model.decoder) ckpt_dec = tf.train.Checkpoint(model=model.decoder)
manager_dec = tf.train.CheckpointManager(ckpt_dec, 'checkpoints/iccv/' + config['name'] + '_dec', max_to_keep=20) manager_dec = tf.train.CheckpointManager(ckpt_dec, 'checkpoints/post/' + config['name'] + '_dec', max_to_keep=20)
train() train()
+8 -19
View File
@@ -1,6 +1,6 @@
import os import os
import sys import sys
from configs.iccv.config_ae_curv_25p import config from configs.config_ae_curv_post import config
os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu']
import tensorflow as tf import tensorflow as tf
@@ -32,13 +32,12 @@ from tf_utils import check_tf_version, allow_memory_growth
from dataset import DatasetFactory, StaticDataset from dataset import DatasetFactory, StaticDataset
from custom_utils.custom_utils import batch_to_dict from custom_utils.custom_utils import batch_to_dict
from models.cond_encoder import AutoEncoderNew as AutoEncoder from models.cond_encoder import AutoEncoderNew as AutoEncoder
from custom_utils.custom_utils import Accumulator
testing = False testing = False
def init_wandb(): def init_wandb():
if not testing: if not testing:
run = wandb.init(project='ae', name=config['name'], notes=config['notes'], dir='/tmp', tags=config['tags']) run = wandb.init(project='ae', name=config['name'], notes=config['notes'], dir='/home/workspace/local-data/temp/')
artifact = wandb.Artifact('code', type='code') artifact = wandb.Artifact('code', type='code')
artifact.add_file('auto_encoder_curv.py') artifact.add_file('auto_encoder_curv.py')
artifact.add_file('losses.py') artifact.add_file('losses.py')
@@ -48,9 +47,7 @@ def init_wandb():
artifact.add_file('convnext/models/convnext_tf.py') artifact.add_file('convnext/models/convnext_tf.py')
config_file_names = [key for key in sys.modules.keys() if key.startswith('configs.')] config_file_names = [key for key in sys.modules.keys() if key.startswith('configs.')]
for config_file_name in config_file_names: for config_file_name in config_file_names:
file_name = '/'.join(config_file_name.split('.')) + '.py' artifact.add_file('/'.join(config_file_name.split('.')) + '.py')
if os.path.exists(file_name):
artifact.add_file(file_name)
run.log_artifact(artifact) run.log_artifact(artifact)
uv2mesh = UV2MeshLabel(res=256, is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape']) uv2mesh = UV2MeshLabel(res=256, is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape'])
@@ -167,27 +164,21 @@ def train():
batch = static_dataset_train.expand_batch(batch_to_dict(batch, config['signature_dynamic'])) batch = static_dataset_train.expand_batch(batch_to_dict(batch, config['signature_dynamic']))
train_loss = train_step(batch) train_loss = train_step(batch)
train_accumulator.update(train_loss)
if step % 25 == 0:
data_valid = valid_iterator.get_next() data_valid = valid_iterator.get_next()
data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic']))
valid_loss = valid_step(data_valid) valid_loss = valid_step(data_valid)
valid_accumulator.update(valid_loss)
if step % 1000 == 0 or (step < 1000 and step % 100 == 0): to_log = { **train_loss, **valid_loss }
to_log = dict({ **train_loss, **valid_loss, **{ 'current_step': step } }) if step % 5000 == 0 or (step < 5000 and step % 500 == 0):
if step % 5000 == 0 or (step < 5000 and step % 1000 == 0):
train_figs = plot_everything(batch, 'train') train_figs = plot_everything(batch, 'train')
valid_figs = plot_everything(data_valid, 'valid') valid_figs = plot_everything(data_valid, 'valid')
to_log = { **to_log, **train_figs, **valid_figs } to_log = { **to_log, **train_figs, **valid_figs }
if step == 0: if step == 0:
to_log = { **to_log, **{ 'model/summary': wandb.Html(get_summary_html(model)) } } to_log = { **to_log, **{ 'model/summary': wandb.Html(get_summary_html(model)) } }
wandb.log(to_log, step=step) wandb.log(to_log, step=step)
train_accumulator.reset() print(step)
valid_accumulator.reset()
if step % 10000 == 0: if step % 10000 == 0:
manager_enc.save(checkpoint_number=step) manager_enc.save(checkpoint_number=step)
@@ -258,13 +249,11 @@ if __name__ == '__main__':
model = AutoEncoder(config['cond_ae']) model = AutoEncoder(config['cond_ae'])
optimizer = tf.optimizers.Adam(learning_rate=config['lr']) optimizer = tf.optimizers.Adam(learning_rate=config['lr'])
train_accumulator = Accumulator()
valid_accumulator = Accumulator()
ckpt_enc = tf.train.Checkpoint(model=model.encoder) ckpt_enc = tf.train.Checkpoint(model=model.encoder)
manager_enc = tf.train.CheckpointManager(ckpt_enc, 'checkpoints/iccv/' + config['name'] + '_enc', max_to_keep=20) manager_enc = tf.train.CheckpointManager(ckpt_enc, 'checkpoints/post/' + config['name'] + '_enc', max_to_keep=20)
ckpt_dec = tf.train.Checkpoint(model=model.decoder) ckpt_dec = tf.train.Checkpoint(model=model.decoder)
manager_dec = tf.train.CheckpointManager(ckpt_dec, 'checkpoints/iccv/' + config['name'] + '_dec', max_to_keep=20) manager_dec = tf.train.CheckpointManager(ckpt_dec, 'checkpoints/post/' + config['name'] + '_dec', max_to_keep=20)
if testing: if testing:
test() test()
+6 -18
View File
@@ -1,6 +1,6 @@
import os import os
import sys import sys
from configs.iccv.config_ae_static_25p import config from configs.config_ae_static import config
os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu']
import tensorflow as tf import tensorflow as tf
@@ -34,11 +34,10 @@ from tf_utils import check_tf_version, allow_memory_growth
from dataset import DatasetFactory, StaticDataset from dataset import DatasetFactory, StaticDataset
from custom_utils.custom_utils import batch_to_dict, plot_3d from custom_utils.custom_utils import batch_to_dict, plot_3d
from models.cond_encoder import AutoEncoderNew as AutoEncoder from models.cond_encoder import AutoEncoderNew as AutoEncoder
from custom_utils.custom_utils import Accumulator
def init_wandb(): def init_wandb():
run = wandb.init(project='ae', name=config['name'], notes=config['notes'], dir='/tmp', tags=config['tags']) run = wandb.init(project='ae', name=config['name'], notes=config['notes'], dir='/home/workspace/local-data/temp')
artifact = wandb.Artifact('code', type='code') artifact = wandb.Artifact('code', type='code')
artifact.add_file('auto_encoder_static.py') artifact.add_file('auto_encoder_static.py')
artifact.add_file('losses.py') artifact.add_file('losses.py')
@@ -48,9 +47,7 @@ def init_wandb():
artifact.add_file('convnext/models/convnext_tf.py') artifact.add_file('convnext/models/convnext_tf.py')
config_file_names = [key for key in sys.modules.keys() if key.startswith('configs.')] config_file_names = [key for key in sys.modules.keys() if key.startswith('configs.')]
for config_file_name in config_file_names: for config_file_name in config_file_names:
file_name = '/'.join(config_file_name.split('.')) + '.py' artifact.add_file('/'.join(config_file_name.split('.')) + '.py')
if os.path.exists(file_name):
artifact.add_file(file_name)
run.log_artifact(artifact) run.log_artifact(artifact)
uv2mesh = UV2Mesh(res=256, is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape']) uv2mesh = UV2Mesh(res=256, is_skirt=config['is_skirt'], is_smpl_orig=config['is_cape'])
@@ -128,17 +125,13 @@ def train():
for batch in dataset_train: for batch in dataset_train:
batch = static_dataset_train.expand_batch(batch_to_dict(batch, config['signature_dynamic'])) batch = static_dataset_train.expand_batch(batch_to_dict(batch, config['signature_dynamic']))
train_loss = train_step(batch) train_loss = train_step(batch)
train_accumulator.update(train_loss)
if step % 25 == 0:
data_valid = valid_iterator.get_next() data_valid = valid_iterator.get_next()
data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic']))
valid_loss = valid_step(data_valid) valid_loss = valid_step(data_valid)
valid_accumulator.update(valid_loss)
if step % 1000 == 0 or (step < 1000 and step % 100 == 0):
to_log = dict({ **train_loss, **valid_loss, **{ 'current_step': step } }) to_log = dict({ **train_loss, **valid_loss, **{ 'current_step': step } })
if step % 5000 == 0 or (step < 5000 and step % 1000 == 0): if step % 5000 == 0 or (step < 5000 and step % 500 == 0):
train_figs = plot_everything(batch, 'train') train_figs = plot_everything(batch, 'train')
valid_figs = plot_everything(data_valid, 'valid') valid_figs = plot_everything(data_valid, 'valid')
to_log = { **to_log, **train_figs, **valid_figs } to_log = { **to_log, **train_figs, **valid_figs }
@@ -147,8 +140,6 @@ def train():
wandb.log(to_log, step=step) wandb.log(to_log, step=step)
train_accumulator.reset()
valid_accumulator.reset()
if step % 10000 == 0: if step % 10000 == 0:
manager_enc.save(checkpoint_number=step) manager_enc.save(checkpoint_number=step)
@@ -240,17 +231,14 @@ if __name__ == '__main__':
model : AutoEncoder = AutoEncoder(config['cond_ae']) model : AutoEncoder = AutoEncoder(config['cond_ae'])
optimizer = tf.optimizers.Adam(learning_rate=config['lr']) optimizer = tf.optimizers.Adam(learning_rate=config['lr'])
train_accumulator = Accumulator()
valid_accumulator = Accumulator()
if config['pretrained_model'] != '': if config['pretrained_model'] != '':
load_model(model.encoder, config['pretrained_model'] + '_enc') load_model(model.encoder, config['pretrained_model'] + '_enc')
load_model(model.decoder, config['pretrained_model'] + '_dec') load_model(model.decoder, config['pretrained_model'] + '_dec')
ckpt_enc = tf.train.Checkpoint(model=model.encoder) ckpt_enc = tf.train.Checkpoint(model=model.encoder)
manager_enc = tf.train.CheckpointManager(ckpt_enc, 'checkpoints/iccv/' + config['name'] + '_enc', max_to_keep=20) manager_enc = tf.train.CheckpointManager(ckpt_enc, 'checkpoints/post/' + config['name'] + '_enc', max_to_keep=20)
ckpt_dec = tf.train.Checkpoint(model=model.decoder) ckpt_dec = tf.train.Checkpoint(model=model.decoder)
manager_dec = tf.train.CheckpointManager(ckpt_dec, 'checkpoints/iccv/' + config['name'] + '_dec', max_to_keep=20) manager_dec = tf.train.CheckpointManager(ckpt_dec, 'checkpoints/post/' + config['name'] + '_dec', max_to_keep=20)
# test() # test()
train() train()
+29 -64
View File
@@ -1,37 +1,37 @@
import os import os
import sys import sys
from configs.iccv.config_abl_pyr_32_64_128_seq import config from configs.config_abl_all_post import config
os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu']
import tensorflow as tf # import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU') # gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus: # if gpus:
try: # try:
# Currently, memory growth needs to be the same across GPUs # # Currently, memory growth needs to be the same across GPUs
for gpu in gpus: # for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True) # tf.config.experimental.set_memory_growth(gpu, True)
logical_gpus = tf.config.experimental.list_logical_devices('GPU') # logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs") # print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
except RuntimeError as e: # except RuntimeError as e:
# Memory growth must be set before GPUs have been initialized # # Memory growth must be set before GPUs have been initialized
print(e) # print(e)
import csv import csv
import glob import glob
import time import time
import argparse import argparse
import wandb import wandb
from tqdm import tqdm import tqdm
import random import random
import numpy as np import numpy as np
import plotly.graph_objects as go import plotly.graph_objects as go
import plotly.express as ex import plotly.express as ex
from losses import collision_loss, normal_loss
if config['is_skirt']: # if config['is_skirt']:
from losses import edge_loss_skirt as edge_loss # from losses import edge_loss_skirt as edge_loss
else: # else:
from losses import edge_loss # from losses import edge_loss
@@ -53,55 +53,40 @@ if __name__ == '__main__':
parser.add_argument('--name', type=str) parser.add_argument('--name', type=str)
args = vars(parser.parse_args()) args = vars(parser.parse_args())
print(config['name'])
# smpl = SMPL(use_one_hot=config['use_one_hot']) # smpl = SMPL(use_one_hot=config['use_one_hot'])
skirt_modifier = '_skirt' if config['is_skirt'] else '' skirt_modifier = '_skirt' if config['is_skirt'] else ''
error_type = 'euclidean' # 'euclidean' 'collision' edge normal
folder = config['test_dir'] folder = config['test_dir']
checkpoint_name = config['name'] checkpoint_name = config['name']
# iteration = '200000' iteration = ''
F = np.load("custom_utils/smpl_faces" + skirt_modifier + ".npy").astype(np.int32) F = np.load("custom_utils/smpl_faces" + skirt_modifier + ".npy").astype(np.int32)
garment_type_table = np.load('custom_data/garment_type_table_test.npy', allow_pickle=True).item() garment_type_table = np.load('custom_data/garment_type_table_test.npy', allow_pickle=True).item()
output_folder = '/home/workspace/local-data/results/iccv/' + checkpoint_name + '-' output_folder = '/home/workspace/data/results/post/' + checkpoint_name + '-' + iteration
# check if there is a folder that starts with this name using glob
folders = glob.glob(output_folder + '*')
assert len(folders) == 1, f'There should be only one checkpoint that starts with this name, but found {len(folders)}'
output_folder = folders[0]
iteration = output_folder.split('-')[-1]
# faces_folder = '/home/workspace/data/results/support/faces' + ('_skirt' if config['is_skirt'] else '') faces_folder = '/home/workspace/data/results/support/faces' + ('_skirt' if config['is_skirt'] else '')
# ids = os.listdir(faces_folder) ids = os.listdir(faces_folder)
# ids = [id.split('.')[0] for id in ids] ids = [id.split('.')[0] for id in ids]
# faces = {id : np.load(faces_folder + '/' + id + '.npy') for id in ids } faces = {id : np.load(faces_folder + '/' + id + '.npy') for id in ids }
print('Reading masks...') masks_folder = '/home/workspace/data/dataset/test' + ('_skirt' if config['is_skirt'] else '') + '_ready' + ('_2' if config['is_skirt'] else '') + '/mesh_mask'
masks_folder = '/home/workspace/local-data' + ('' if config['is_skirt'] else '_127') + '/test' + ('_skirt' if config['is_skirt'] else '') + '_ready' + ('_2' if config['is_skirt'] else '') + '/mesh_mask'
ids = os.listdir(masks_folder) ids = os.listdir(masks_folder)
ids = [id.split('.')[0] for id in ids] ids = [id.split('.')[0] for id in ids]
masks = {id : np.load(masks_folder + '/' + id + '.npy') for id in ids } masks = {id : np.load(masks_folder + '/' + id + '.npy') for id in ids }
frames = os.listdir(output_folder) frames = os.listdir(output_folder)
frames = [frame for frame in frames if not frame.endswith('_fixed_coll.npy')] frames = [frame for frame in frames if not frame.endswith('_fixed_coll.npy')]
# frames = frames[:100]
# print('Reading bodies...')
# bodies_folder = '/home/workspace/local-data' + ('' if config['is_skirt'] else '_127') + '/test' + ('_skirt' if config['is_skirt'] else '') + '_ready' + ('_2' if config['is_skirt'] else '') + '/mesh_posed_body_no_orient'
# bodies = {frame : np.load(bodies_folder + '/' + frame[:-1] + 'z')['mesh_posed_body_no_orient'] for frame in tqdm(frames) }
if config['remove_global_orientation']: if config['remove_global_orientation']:
gt_name = 'mesh_posed_no_orient' gt_name = 'mesh_posed_no_orient'
else: else:
gt_name = 'mesh_posed' gt_name = 'mesh_posed'
orig_folder = '/home/workspace/local-data' + ('' if config['is_skirt'] else '_127') + '/test' + ('_skirt' if config['is_skirt'] else '') + '_ready' + ('_2' if config['is_skirt'] else '') + '/' + gt_name orig_folder = '/home/workspace/data/dataset/test' + ('_skirt' if config['is_skirt'] else '') + '_ready' + ('_2' if config['is_skirt'] else '') + '/' + gt_name
errors = dict() errors = dict()
if config['is_skirt']: if config['is_skirt']:
@@ -109,32 +94,12 @@ if __name__ == '__main__':
else: else:
per_garment_errors = { 'Tshirt': [], 'Jumpsuit': [], 'Trousers': [], 'Top': [] } per_garment_errors = { 'Tshirt': [], 'Jumpsuit': [], 'Trousers': [], 'Top': [] }
for frame in tqdm(frames): for frame in tqdm.tqdm(frames):
id = frame.split('_')[0] id = frame.split('_')[0]
frame_nr = frame.split('.')[0].split('_')[1] frame_nr = frame.split('.')[0].split('_')[1]
gt = np.load(os.path.join(orig_folder, id + '_' + frame_nr + '.npz'))[gt_name][masks[id], :].astype(np.float32) gt = np.load(os.path.join(orig_folder, id + '_' + frame_nr + '.npz'))[gt_name][masks[id], :].astype(np.float32)
pred = np.load(os.path.join(output_folder, id + '_' + frame_nr + '.npy')) pred = np.load(os.path.join(output_folder, id + '_' + frame_nr + '.npy'))
if error_type == 'edge':
pred_unmasked = np.zeros((1, 14475, 3), dtype=np.float32)
pred_unmasked[0, masks[id], :] = pred
gt_unmasked = np.zeros((1, 14475, 3), dtype=np.float32)
gt_unmasked[0, masks[id], :] = gt
metric = edge_loss(gt_unmasked, pred_unmasked, masks[id][None,:].astype(np.float32)).numpy()[0]
elif error_type == 'euclidean':
metric = np.mean(np.sqrt(np.sum((gt - pred) ** 2, axis=-1))) metric = np.mean(np.sqrt(np.sum((gt - pred) ** 2, axis=-1)))
elif error_type == 'collision':
pred_unmasked = np.zeros((1, 14475, 3), dtype=np.float32)
pred_unmasked[0, masks[id], :] = pred
metric = collision_loss(pred_unmasked, bodies[frame][None,:,:], masks[id][None,:].astype(np.float32))[0].numpy()[0]
elif error_type == 'normal':
pred_unmasked = np.zeros((1, 14475, 3), dtype=np.float32)
pred_unmasked[0, masks[id], :] = pred
gt_unmasked = np.zeros((1, 14475, 3), dtype=np.float32)
gt_unmasked[0, masks[id], :] = gt
metric = normal_loss(gt_unmasked, pred_unmasked, masks[id][None,:].astype(np.float32)).numpy()
else:
raise ValueError('Error type not supported')
errors[id + '_' + frame_nr] = metric errors[id + '_' + frame_nr] = metric
per_garment_errors[garment_type_table[id]].append(metric) per_garment_errors[garment_type_table[id]].append(metric)
@@ -142,7 +107,7 @@ if __name__ == '__main__':
for key in per_garment_errors.keys(): for key in per_garment_errors.keys():
print(key + ': ' + str(np.mean(per_garment_errors[key]))) print(key + ': ' + str(np.mean(per_garment_errors[key])))
with open(f'/home/workspace/data/results/errors/iccv/{checkpoint_name}-{iteration}-{error_type}.csv', mode='w') as f: with open('/home/workspace/data/results/errors/post/' + checkpoint_name + '-' + iteration + '.csv', mode='w') as f:
file_writer = csv.writer(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) file_writer = csv.writer(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
for key in sorted(errors.keys()): for key in sorted(errors.keys()):
+12 -23
View File
@@ -23,7 +23,7 @@ import numpy as np
import trimesh as tm import trimesh as tm
import plotly.express as ex import plotly.express as ex
import plotly.graph_objects as go import plotly.graph_objects as go
from custom_utils.custom_utils import _maskFaces, save_stl from custom_utils.custom_utils import _maskFaces
from custom_utils.smpl import SMPL from custom_utils.smpl import SMPL
from plotly.subplots import make_subplots from plotly.subplots import make_subplots
from scipy.spatial.transform import Rotation as R from scipy.spatial.transform import Rotation as R
@@ -215,8 +215,8 @@ if __name__ == '__main__':
errors_cape_m = get_cape_errors('CAPE/results/CAPE-affineconv_nz18_pose24_clotype8_male/errors.npy', frames_m) errors_cape_m = get_cape_errors('CAPE/results/CAPE-affineconv_nz18_pose24_clotype8_male/errors.npy', frames_m)
errors_cape_m = dict(reversed(sorted(errors_cape_m.items(), key=lambda item: item[1]))) errors_cape_m = dict(reversed(sorted(errors_cape_m.items(), key=lambda item: item[1])))
errors_f = get_errors('temp/archive/error_abl_2_pyr_64_128_256_512_cape_f.txt') errors_f = get_errors('temp/error_abl_2_pyr_64_128_256_512_cape_f.txt')
errors_m = get_errors('temp/archive/error_abl_2_pyr_64_128_256_512_cape_m.txt') errors_m = get_errors('temp/error_abl_2_pyr_64_128_256_512_cape_m.txt')
folder_pyr_f = '/home/workspace/data/results/cape/abl_2_pyr_64_128_256_512_cape_f' folder_pyr_f = '/home/workspace/data/results/cape/abl_2_pyr_64_128_256_512_cape_f'
folder_pyr_m = '/home/workspace/data/results/cape/abl_2_pyr_64_128_256_512_cape_m' folder_pyr_m = '/home/workspace/data/results/cape/abl_2_pyr_64_128_256_512_cape_m'
@@ -238,10 +238,9 @@ if __name__ == '__main__':
_, faces = _maskFaces(np.zeros((3638, 3)), np.load('custom_utils/smpl_faces_orig.npy'), cape_mask) _, faces = _maskFaces(np.zeros((3638, 3)), np.load('custom_utils/smpl_faces_orig.npy'), cape_mask)
faces = faces.astype(np.int32)
colors = np.ones((3627, 3), np.int8) * 230 colors = np.ones((3627, 3), np.int8) * 230
gender = 'female' gender = 'male'
if gender == 'male': if gender == 'male':
folder_cape = folder_m folder_cape = folder_m
@@ -263,18 +262,11 @@ if __name__ == '__main__':
all_errors_1 = [] all_errors_1 = []
all_errors_2 = [] all_errors_2 = []
for key in tqdm.tqdm(errors_cape.keys()): # for key in tqdm.tqdm(errors_cape.keys()):
# count = 0 count = 0
# while True: while True:
if os.path.exists(f'temp/cape_stl/{key}_gt.stl'): key = random.choice(list(errors_cape.keys()))
continue
# key = random.choice(list(errors_cape.keys()))
cape = read_obj(os.path.join(folder_cape, '{:0>4d}.obj'.format(frames_to_i[key])))[clothing_verts_idx, :] - J0[np.newaxis, :] cape = read_obj(os.path.join(folder_cape, '{:0>4d}.obj'.format(frames_to_i[key])))[clothing_verts_idx, :] - J0[np.newaxis, :]
split = key.split('_')
file = '_'.join(split[:-1]) + '.' + split[-1] + '.npy'
pose_shape_path = os.path.join(pose_folder, file)
if not os.path.exists(pose_shape_path):
continue
cape = add_global_orientation(cape, key, pose_folder, inverse=True) cape = add_global_orientation(cape, key, pose_folder, inverse=True)
if not os.path.exists(os.path.join(folder, key + '_posed.npy')): if not os.path.exists(os.path.join(folder, key + '_posed.npy')):
continue continue
@@ -292,13 +284,10 @@ if __name__ == '__main__':
# print(np.mean(all_errors_1)) # print(np.mean(all_errors_1))
# print(np.mean(all_errors_2)) # print(np.mean(all_errors_2))
# fig = plot_fixed_all(gt, cape, ours, errors_cape[key], errors[key], faces, colors) fig = plot_fixed_all(gt, cape, ours, errors_cape[key], errors[key], faces, colors)
# fig.write_image('temp/cape_2/' + key + '.png') fig.write_image('temp/cape/' + key + '.png')
save_stl(f'temp/cape_stl/{key}_gt.stl', gt, faces)
save_stl(f'temp/cape_stl/{key}_cape.stl', cape, faces)
save_stl(f'temp/cape_stl/{key}_ours.stl', ours, faces)
# print(count) print(count)
# count += 1 count += 1
print() print()
+188
View File
@@ -0,0 +1,188 @@
import os
import sys
from configs.config_abl_all_post import config as config_a
os.environ["CUDA_VISIBLE_DEVICES"] = '5'
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
try:
# Currently, memory growth needs to be the same across GPUs
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
except RuntimeError as e:
# Memory growth must be set before GPUs have been initialized
print(e)
import glob
import time
import argparse
import wandb
import tqdm
import random
import numpy as np
import plotly.graph_objects as go
import plotly.express as ex
from PIL import Image
from postprocessing import fix_collision
if config_a['is_skirt']:
from losses import edge_loss_skirt as edge_loss
else:
from losses import edge_loss
from losses import collision_ratio, kl_loss #, concept_loss
# from losses import collision_penalty as collision_penalty
from losses import collision_loss as collision_penalty
from custom_utils.custom_utils import batch_to_dict, load_model, plot_3d, UV2Mesh, get_summary_html, maskFacesBatch, _maskFaces, plot_3d_collision
from dataset import DatasetFactory, StaticDataset
from custom_utils.smpl import SMPL
from models.cvae_model import CVAE
from custom_utils.supersmpl_io import writeOBJ
from plotly.subplots import make_subplots
# uv2mesh = UV2Mesh(res=256, is_skirt=config_a['is_skirt'], is_adaptive=False)
def plot(mesh_gt, pred_a, pred_b, body, mask):
fig = make_subplots(rows=1, cols=3, start_cell="top-left", specs = [ [{ 'type': 'scene' } for _ in range(3)] ])
_, faces_garment = _maskFaces(np.zeros((14475, 3), np.float32), F, mask)
faces = np.concatenate((F, faces_garment + 14475), axis=0)
mesh_gt = np.concatenate((body, mesh_gt[mask, :]), axis=0)
pred_a = np.concatenate((body, pred_a), axis=0)
pred_b = np.concatenate((body, pred_b), axis=0)
colors = np.concatenate((np.ones_like(body, dtype=np.int32)*100, np.ones_like(mesh_gt, dtype=np.int32)*230), axis=0)
# colors = np.ones_like(mesh_gt, dtype=np.int32)*230
fig.add_trace(go.Mesh3d(
x=mesh_gt[:,0],
y=mesh_gt[:,2],
z=mesh_gt[:,1],
i = faces[:,0],
j = faces[:,1],
k = faces[:,2],
text="Ground Truth",
vertexcolor=colors,
),
row=1, col=1)
fig.add_trace(go.Mesh3d(
x=pred_a[:,0],
y=pred_a[:,2],
z=pred_a[:,1],
i = faces[:,0],
j = faces[:,1],
k = faces[:,2],
text="Pred A",
vertexcolor=colors,
),
row=1, col=2)
fig.add_trace(go.Mesh3d(
x=pred_b[:,0],
y=pred_b[:,2],
z=pred_b[:,1],
i = faces[:,0],
j = faces[:,1],
k = faces[:,2],
text="Pred B",
vertexcolor=colors,
),
row=1, col=3)
fig.update_layout(scene_aspectmode='manual', scene_aspectratio=dict(x=1, y=1, z=1),
scene2_aspectmode='manual', scene2_aspectratio=dict(x=1, y=1, z=1),
scene3_aspectmode='manual', scene3_aspectratio=dict(x=1, y=1, z=1),
)
helper = dict(xaxis = dict(nticks=4, range=[-1,1],),
yaxis = dict(nticks=4, range=[-1,1],),
zaxis = dict(nticks=4, range=[-1,1],),)
fig.update_layout(scene = helper,
scene2 = helper,
scene3 = helper,
)
return fig
if __name__ == '__main__':
run = wandb.init(project='plots', name=config_a['name'], notes=config_a['notes'], dir='/wandb')
parser = argparse.ArgumentParser(description='')
parser.add_argument('--name', type=str)
args = vars(parser.parse_args())
skirt_modifier = '_skirt' if config_a['is_skirt'] else ''
folder = config_a['test_dir']
# smpl = SMPL(use_one_hot=False)
F = np.load("custom_utils/smpl_faces" + skirt_modifier + ".npy").astype(np.int32)
iteration = ''
# load_model(model, 'checkpoints/' + 'abl_all_120k')
factory = DatasetFactory()
dataset_a = factory.get_dataset(folder=config_a['test_dir'],
batch_size=config_a['batch_size'],
signature=config_a['signature_dynamic'],
resolutions=[config_a['resolution']],
in_memory=False,
do_repeat=False,
use_one_hot=config_a['use_one_hot'],
use_no_orient=config_a['remove_global_orientation'],
shuffle=False,
testing=True,
# frames_file='frames_abl.txt',
)
static_dataset_a = StaticDataset(folder=config_a['test_dir'],
signature=config_a['signature_static'],
resolutions=[config_a['resolution']],
in_memory=True)
iterator_a = iter(dataset_a)
faces_folder = '/home/workspace/data/results/support/faces' + ('_skirt' if config_a['is_skirt'] else '')
ids = os.listdir(faces_folder)
ids = [id.split('.')[0] for id in ids]
faces = {id : np.load(faces_folder + '/' + id + '.npy') for id in ids }
results_folder = '/home/workspace/data/results/post'
count = 0
while True:
batch = iterator_a.get_next()
batch = static_dataset_a.expand_batch(batch_to_dict(batch, config_a['signature_dynamic']))
mask = batch['mesh_mask'].numpy().astype(bool)
gt = batch['mesh_posed'].numpy()
body = batch['mesh_body_posed'].numpy()
for i in range(mask.shape[0]):
id, frame_nr = batch['id'][i].numpy().decode("utf-8"), batch['frame_nr'][i].numpy().decode("utf-8")
pred_a = np.load(results_folder + '/al_all_post-/' + id + '_' + frame_nr + '.npy')
pred_b = np.load(results_folder + '/iccv_weights_test_6-/' + id + '_' + frame_nr + '.npy')
# pred_c = np.load(results_folder + '/iccv_weights_test_6-/' + id + '_' + frame_nr + '.npy')
fig = plot(gt[i], pred_a, pred_b, body[i], mask[i])
wandb.log({f'{id}_{frame_nr}': fig}, step = count)
count += 1
print(count)
-65
View File
@@ -1,65 +0,0 @@
import os
import sys
import numpy as np
import trimesh as tm
from stl import mesh
# os.environ["CUDA_VISIBLE_DEVICES"] = '1'
# import tensorflow as tf
# gpus = tf.config.experimental.list_physical_devices('GPU')
# if gpus:
# try:
# # Currently, memory growth needs to be the same across GPUs
# for gpu in gpus:
# tf.config.experimental.set_memory_growth(gpu, True)
# logical_gpus = tf.config.experimental.list_logical_devices('GPU')
# print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
# except RuntimeError as e:
# # Memory growth must be set before GPUs have been initialized
# print(e)
# from losses import collision_loss, normal_loss
# from losses import edge_loss_skirt as edge_loss
# from losses import edge_loss
if __name__ == '__main__':
frame = '04173_193' # '02276_232', '02978_242', '04173_193'
folder = 'examples/sampling_analysis'
# original_folder = '/home/workspace/data/dataset/local-cache/train_skirt'
original_folder = '/home/workspace/local-data/train'
# folder = 'examples/sampling'
id = frame.split('_')[0]
mask = np.load(os.path.join(original_folder, 'mesh_mask', f'{id}.npy'))
gt = np.load(os.path.join(folder, frame, f'{frame}_gt.npy'))
faces = np.load(os.path.join(folder, frame, f'{frame}_faces.npy'))
edges = tm.Trimesh(vertices=gt, faces=faces, validate=False, process=False).edges
edges_gt = np.linalg.norm(gt[edges[:, 0]] - gt[edges[:, 1]], axis=1)
area_gt = np.sum(np.linalg.norm(np.cross(gt[faces[:, 0]] - gt[faces[:, 1]], gt[faces[:, 0]] - gt[faces[:, 2]]), axis=1))
errors = []
vars = []
area_diffs = []
# for i in [1,2,4,10]:
for i in range(15):
sample = np.load(os.path.join(folder, frame, f'{frame}_{i}.npy'))
edges_sample = np.linalg.norm(sample[edges[:, 0]] - sample[edges[:, 1]], axis=1)
error = np.mean(np.abs(edges_sample - edges_gt))
var = np.var(np.abs(edges_sample - edges_gt))
errors.append(error)
vars.append(var)
area_sample = np.sum(np.linalg.norm(np.cross(sample[faces[:, 0]] - sample[faces[:, 1]], sample[faces[:, 0]] - sample[faces[:, 2]]), axis=1))
area_diff = np.abs(area_sample - area_gt)
area_diffs.append(area_diff)
print(np.array(errors).mean())
print(np.array(vars).mean())
print(np.array(area_diffs).mean())
print(area_gt)
@@ -7,7 +7,7 @@ config = dict()
# DON'T FORGET TO LOAD FINAL UPSCALER UNLESS HAVE LEVEL 512 # DON'T FORGET TO LOAD FINAL UPSCALER UNLESS HAVE LEVEL 512
# DON'T FORGET TO CHECK AVG GARMENT USED # DON'T FORGET TO CHECK AVG GARMENT USED
config['use_skinning'] = True # and deshaping config['use_skinning'] = False # and deshaping
config['remove_global_orientation'] = True config['remove_global_orientation'] = True
config['use_curvature'] = True config['use_curvature'] = True
config['use_extra_losses'] = True # edge, collision, 3d mesh config['use_extra_losses'] = True # edge, collision, 3d mesh
@@ -19,13 +19,13 @@ config['only_curvatures'] = False
ablation_count = [config['use_skinning'], config['remove_global_orientation'], config['use_curvature'], config['use_extra_losses'], config['use_offsets']].count(False) ablation_count = [config['use_skinning'], config['remove_global_orientation'], config['use_curvature'], config['use_extra_losses'], config['use_offsets']].count(False)
assert ablation_count == 1 or ablation_count == 0 assert ablation_count == 1 or ablation_count == 0
config['gpu'] = '4' config['gpu'] = '6'
config['name'] = 'al_all_post' config['name'] = 'iccv_weights_test_10_3'
config['notes'] = '' config['notes'] = 'smaller weight loss coeff, 1e-6, convolutional weight learning, add gnn but smaller, same as 10 but training from zero and no avg garment'
config['avg_garment_path'] = 'custom_data/train_no_shape_avg_uv.npy' #custom_data/train_no_shape_avg_uv.npy # train_no_shape_avg_uv train_no_shape_one_hot_avg_uv config['avg_garment_path'] = ''# 'custom_data/train_no_shape_avg_uv.npy' #custom_data/train_no_shape_avg_uv.npy # train_no_shape_avg_uv train_no_shape_one_hot_avg_uv
if config['use_skinning']: # if config['use_skinning']:
assert (config['use_offsets'] and config['avg_garment_path'] != '') or (not config['use_offsets'] and config['avg_garment_path'] == '') # assert (config['use_offsets'] and config['avg_garment_path'] != '') or (not config['use_offsets'] and config['avg_garment_path'] == '')
config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision config['reg_loss_coeff'] = 0.1 # set to 0 if don't want to use edge+collision
@@ -86,14 +86,15 @@ config['use_one_hot'] = False
config['cvae'] = dict() config['cvae'] = dict()
config['cvae']['is_label'] = False config['cvae']['is_label'] = False
config['cvae']['add_noise'] = True config['cvae']['add_noise'] = True
config['cvae']['noise_amount'] = 0.001 config['cvae']['noise_amount'] = 0.00001
config['cvae']['kernel_size'] = 7 config['cvae']['kernel_size'] = 7
config['cvae']['encoder_depths'] = [3, 3, 3, 9, 3] config['cvae']['encoder_depths'] = [3, 3, 3, 9, 3]
config['cvae']['encoder_dims'] = [32, 64, 128, 256, 64] config['cvae']['encoder_dims'] = [32, 64, 128, 256, 64]
config['cvae']['decoder_depths'] = config['cvae']['encoder_depths'] config['cvae']['decoder_depths'] = config['cvae']['encoder_depths']
config['cvae']['decoder_dims'] = config['cvae']['encoder_dims'] config['cvae']['decoder_dims'] = config['cvae']['encoder_dims']
config['cvae']['decoder_weights_depths'] = [3, 3, 3, 5, 3]
config['cvae']['decoder_weights_dims'] = [24, 32, 64, 128, 256]
config['cond_ae_static'] = dict() config['cond_ae_static'] = dict()
config['cond_ae_static']['is_label'] = False config['cond_ae_static']['is_label'] = False

Some files were not shown because too many files have changed in this diff Show More