├── .gitignore
├── .gitmodules
├── Anim_Seqs
├── seqs
│ ├── 00000.npz
│ ├── 00002.npz
│ ├── 00004.npz
│ ├── 00006.npz
│ ├── 00008.npz
│ ├── 00010.npz
│ ├── 00012.npz
│ ├── 00014.npz
│ ├── 00016.npz
│ ├── 00018.npz
│ ├── 00020.npz
│ ├── 00022.npz
│ ├── 00024.npz
│ ├── 00026.npz
│ ├── 00028.npz
│ ├── 00030.npz
│ ├── 00032.npz
│ ├── 00034.npz
│ ├── 00036.npz
│ ├── 00038.npz
│ ├── 00040.npz
│ ├── 00042.npz
│ ├── 00044.npz
│ ├── 00046.npz
│ ├── 00048.npz
│ ├── 00050.npz
│ ├── 00052.npz
│ ├── 00054.npz
│ ├── 00056.npz
│ ├── 00058.npz
│ ├── 00060.npz
│ ├── 00062.npz
│ ├── 00064.npz
│ ├── 00066.npz
│ ├── 00068.npz
│ ├── 00070.npz
│ ├── 00072.npz
│ ├── 00074.npz
│ ├── 00076.npz
│ ├── 00078.npz
│ ├── 00080.npz
│ ├── 00082.npz
│ ├── 00084.npz
│ ├── 00086.npz
│ ├── 00088.npz
│ ├── 00090.npz
│ ├── 00092.npz
│ ├── 00094.npz
│ ├── 00096.npz
│ ├── 00098.npz
│ ├── 00100.npz
│ ├── 00102.npz
│ ├── 00104.npz
│ ├── 00106.npz
│ ├── 00108.npz
│ ├── 00110.npz
│ ├── 00112.npz
│ ├── 00114.npz
│ ├── 00116.npz
│ ├── 00118.npz
│ ├── 00120.npz
│ ├── 00122.npz
│ ├── 00124.npz
│ ├── 00126.npz
│ ├── 00128.npz
│ ├── 00130.npz
│ ├── 00132.npz
│ ├── 00134.npz
│ ├── 00136.npz
│ ├── 00138.npz
│ ├── 00140.npz
│ ├── 00142.npz
│ ├── 00144.npz
│ ├── 00146.npz
│ ├── 00148.npz
│ ├── 00150.npz
│ ├── 00152.npz
│ ├── 00154.npz
│ ├── 00156.npz
│ ├── 00158.npz
│ ├── 00160.npz
│ ├── 00162.npz
│ ├── 00164.npz
│ ├── 00166.npz
│ ├── 00168.npz
│ ├── 00170.npz
│ ├── 00172.npz
│ ├── 00174.npz
│ ├── 00176.npz
│ ├── 00178.npz
│ ├── 00180.npz
│ ├── 00182.npz
│ ├── 00184.npz
│ ├── 00186.npz
│ ├── 00188.npz
│ ├── 00190.npz
│ ├── 00192.npz
│ ├── 00194.npz
│ ├── 00196.npz
│ ├── 00198.npz
│ ├── 00200.npz
│ ├── 00202.npz
│ ├── 00204.npz
│ ├── 00206.npz
│ ├── 00208.npz
│ ├── 00210.npz
│ ├── 00212.npz
│ ├── 00214.npz
│ ├── 00216.npz
│ ├── 00218.npz
│ ├── 00220.npz
│ ├── 00222.npz
│ ├── 00224.npz
│ ├── 00226.npz
│ ├── 00228.npz
│ ├── 00230.npz
│ ├── 00232.npz
│ ├── 00234.npz
│ ├── 00236.npz
│ ├── 00238.npz
│ ├── 00240.npz
│ ├── 00242.npz
│ ├── 00244.npz
│ ├── 00246.npz
│ ├── 00248.npz
│ ├── 00250.npz
│ ├── 00252.npz
│ ├── 00254.npz
│ ├── 00256.npz
│ ├── 00258.npz
│ ├── 00260.npz
│ ├── 00262.npz
│ ├── 00264.npz
│ ├── 00266.npz
│ ├── 00268.npz
│ ├── 00270.npz
│ ├── 00272.npz
│ ├── 00274.npz
│ ├── 00276.npz
│ ├── 00278.npz
│ ├── 00280.npz
│ ├── 00282.npz
│ ├── 00284.npz
│ ├── 00286.npz
│ ├── 00288.npz
│ ├── 00290.npz
│ ├── 00292.npz
│ ├── 00294.npz
│ ├── 00296.npz
│ ├── 00298.npz
│ ├── 00300.npz
│ ├── 00302.npz
│ ├── 00304.npz
│ ├── 00306.npz
│ ├── 00308.npz
│ ├── 00310.npz
│ ├── 00312.npz
│ ├── 00314.npz
│ ├── 00316.npz
│ ├── 00318.npz
│ ├── 00320.npz
│ ├── 00322.npz
│ ├── 00324.npz
│ ├── 00326.npz
│ ├── 00328.npz
│ ├── 00330.npz
│ ├── 00332.npz
│ ├── 00334.npz
│ ├── 00336.npz
│ ├── 00338.npz
│ ├── 00340.npz
│ ├── 00342.npz
│ ├── 00344.npz
│ ├── 00346.npz
│ ├── 00348.npz
│ ├── 00350.npz
│ ├── 00352.npz
│ ├── 00354.npz
│ ├── 00356.npz
│ ├── 00358.npz
│ ├── 00360.npz
│ ├── 00362.npz
│ ├── 00364.npz
│ ├── 00366.npz
│ ├── 00368.npz
│ ├── 00370.npz
│ ├── 00372.npz
│ ├── 00374.npz
│ ├── 00376.npz
│ ├── 00378.npz
│ ├── 00380.npz
│ ├── 00382.npz
│ ├── 00384.npz
│ ├── 00386.npz
│ ├── 00388.npz
│ ├── 00390.npz
│ ├── 00392.npz
│ ├── 00394.npz
│ ├── 00396.npz
│ ├── 00398.npz
│ ├── 00400.npz
│ ├── 00402.npz
│ ├── 00404.npz
│ ├── 00406.npz
│ ├── 00408.npz
│ ├── 00410.npz
│ ├── 00412.npz
│ ├── 00414.npz
│ ├── 00416.npz
│ ├── 00418.npz
│ ├── 00420.npz
│ ├── 00422.npz
│ ├── 00424.npz
│ ├── 00426.npz
│ ├── 00428.npz
│ ├── 00430.npz
│ ├── 00432.npz
│ ├── 00434.npz
│ ├── 00436.npz
│ ├── 00438.npz
│ ├── 00440.npz
│ ├── 00442.npz
│ ├── 00444.npz
│ ├── 00446.npz
│ ├── 00448.npz
│ ├── 00450.npz
│ ├── 00452.npz
│ ├── 00454.npz
│ ├── 00456.npz
│ ├── 00458.npz
│ ├── 00460.npz
│ ├── 00462.npz
│ ├── 00464.npz
│ ├── 00466.npz
│ ├── 00468.npz
│ ├── 00470.npz
│ ├── 00472.npz
│ ├── 00474.npz
│ ├── 00476.npz
│ ├── 00478.npz
│ ├── 00480.npz
│ ├── 00482.npz
│ ├── 00484.npz
│ ├── 00486.npz
│ ├── 00488.npz
│ ├── 00490.npz
│ ├── 00492.npz
│ ├── 00494.npz
│ ├── 00496.npz
│ ├── 00498.npz
│ ├── 00500.npz
│ ├── 00502.npz
│ ├── 00504.npz
│ ├── 00506.npz
│ ├── 00508.npz
│ ├── 00510.npz
│ ├── 00512.npz
│ ├── 00514.npz
│ ├── 00516.npz
│ ├── 00518.npz
│ ├── 00520.npz
│ ├── 00522.npz
│ ├── 00524.npz
│ ├── 00526.npz
│ ├── 00528.npz
│ ├── 00530.npz
│ ├── 00532.npz
│ ├── 00534.npz
│ ├── 00536.npz
│ ├── 00538.npz
│ ├── 00540.npz
│ ├── 00542.npz
│ ├── 00544.npz
│ ├── 00546.npz
│ ├── 00548.npz
│ ├── 00550.npz
│ ├── 00552.npz
│ ├── 00554.npz
│ ├── 00556.npz
│ ├── 00558.npz
│ ├── 00560.npz
│ ├── 00562.npz
│ ├── 00564.npz
│ ├── 00566.npz
│ ├── 00568.npz
│ ├── 00570.npz
│ ├── 00572.npz
│ ├── 00574.npz
│ ├── 00576.npz
│ ├── 00578.npz
│ ├── 00580.npz
│ ├── 00582.npz
│ ├── 00584.npz
│ ├── 00586.npz
│ ├── 00588.npz
│ ├── 00590.npz
│ ├── 00592.npz
│ ├── 00594.npz
│ ├── 00596.npz
│ ├── 00598.npz
│ ├── 00600.npz
│ ├── 00602.npz
│ ├── 00604.npz
│ ├── 00606.npz
│ ├── 00608.npz
│ ├── 00610.npz
│ ├── 00612.npz
│ ├── 00614.npz
│ ├── 00616.npz
│ ├── 00618.npz
│ ├── 00620.npz
│ ├── 00622.npz
│ ├── 00624.npz
│ ├── 00626.npz
│ ├── 00628.npz
│ ├── 00630.npz
│ ├── 00632.npz
│ ├── 00634.npz
│ ├── 00636.npz
│ └── 00638.npz
└── sequences
│ ├── dance.npy
│ ├── greeting.npy
│ ├── hiphop.npy
│ ├── house-dance.npy
│ ├── jump.npy
│ ├── pistol.npy
│ └── strut-walk.npy
├── README.md
├── animations_IPNet.py
├── download_trained_pifuhd_model.sh
├── fit_SMPL.py
├── fit_SMPLD.py
├── fit_SMPL_IPNet.py
├── input
├── decaprio
│ ├── decaprio.jpg
│ └── decaprio_rect.txt
├── suriya
│ ├── IMG_3392.2.jpg
│ └── IMG_3392.2_rect.txt
└── test
│ ├── test.png
│ └── test_keypoints.json
├── instruction.txt
├── preprocess_img_pose.py
├── run_imageimate.sh
├── screenshots
├── 00input_image.jpg
├── 01pifuhd_mesh.png
├── 03pifuhd_to_ipnet.png
├── IMG_3392.2.jpg
├── SMPLd_Fit.png
├── pifu_to_ipnet_suriya.png
├── pifuhd_meshes.png
└── suriya-fbx-2021-08-04-221707.gif
└── test_IPNet.py
/.gitignore:
--------------------------------------------------------------------------------
1 | IPNet/smpl_models/
2 | results/*
3 | checkpoints/
4 |
5 | !results/.gitkeep
6 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "IPNet"]
2 | path = IPNet
3 | url = https://github.com/bharat-b7/IPNet
4 |
5 | [submodule "pifuhd"]
6 | path = pifuhd
7 | url = https://github.com/facebookresearch/pifuhd
8 |
9 | [submodule "lightweight-human-pose-estimation.pytorch"]
10 | path = lightweight-human-pose-estimation.pytorch
11 | url = https://github.com/Daniil-Osokin/lightweight-human-pose-estimation.pytorch
12 |
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00000.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00000.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00002.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00002.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00004.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00004.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00006.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00006.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00008.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00008.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00010.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00010.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00012.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00012.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00014.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00014.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00016.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00016.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00018.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00018.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00020.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00020.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00022.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00022.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00024.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00024.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00026.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00026.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00028.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00028.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00030.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00030.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00032.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00032.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00034.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00034.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00036.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00036.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00038.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00038.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00040.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00040.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00042.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00042.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00044.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00044.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00046.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00046.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00048.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00048.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00050.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00050.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00052.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00052.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00054.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00054.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00056.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00056.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00058.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00058.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00060.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00060.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00062.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00062.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00064.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00064.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00066.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00066.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00068.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00068.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00070.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00070.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00072.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00072.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00074.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00074.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00076.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00076.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00078.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00078.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00080.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00080.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00082.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00082.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00084.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00084.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00086.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00086.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00088.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00088.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00090.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00090.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00092.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00092.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00094.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00094.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00096.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00096.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00098.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00098.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00100.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00100.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00102.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00102.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00104.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00104.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00106.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00106.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00108.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00108.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00110.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00110.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00112.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00112.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00114.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00114.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00116.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00116.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00118.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00118.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00120.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00120.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00122.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00122.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00124.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00124.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00126.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00126.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00128.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00128.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00130.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00130.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00132.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00132.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00134.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00134.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00136.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00136.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00138.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00138.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00140.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00140.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00142.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00142.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00144.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00144.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00146.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00146.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00148.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00148.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00150.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00150.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00152.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00152.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00154.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00154.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00156.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00156.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00158.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00158.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00160.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00160.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00162.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00162.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00164.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00164.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00166.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00166.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00168.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00168.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00170.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00170.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00172.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00172.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00174.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00174.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00176.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00176.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00178.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00178.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00180.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00180.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00182.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00182.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00184.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00184.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00186.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00186.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00188.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00188.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00190.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00190.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00192.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00192.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00194.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00194.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00196.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00196.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00198.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00198.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00200.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00200.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00202.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00202.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00204.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00204.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00206.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00206.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00208.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00208.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00210.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00210.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00212.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00212.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00214.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00214.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00216.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00216.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00218.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00218.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00220.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00220.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00222.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00222.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00224.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00224.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00226.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00226.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00228.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00228.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00230.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00230.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00232.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00232.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00234.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00234.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00236.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00236.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00238.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00238.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00240.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00240.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00242.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00242.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00244.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00244.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00246.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00246.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00248.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00248.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00250.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00250.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00252.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00252.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00254.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00254.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00256.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00256.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00258.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00258.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00260.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00260.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00262.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00262.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00264.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00264.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00266.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00266.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00268.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00268.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00270.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00270.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00272.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00272.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00274.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00274.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00276.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00276.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00278.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00278.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00280.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00280.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00282.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00282.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00284.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00284.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00286.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00286.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00288.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00288.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00290.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00290.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00292.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00292.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00294.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00294.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00296.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00296.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00298.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00298.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00300.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00300.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00302.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00302.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00304.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00304.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00306.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00306.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00308.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00308.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00310.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00310.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00312.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00312.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00314.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00314.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00316.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00316.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00318.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00318.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00320.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00320.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00322.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00322.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00324.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00324.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00326.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00326.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00328.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00328.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00330.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00330.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00332.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00332.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00334.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00334.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00336.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00336.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00338.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00338.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00340.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00340.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00342.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00342.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00344.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00344.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00346.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00346.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00348.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00348.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00350.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00350.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00352.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00352.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00354.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00354.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00356.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00356.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00358.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00358.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00360.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00360.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00362.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00362.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00364.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00364.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00366.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00366.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00368.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00368.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00370.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00370.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00372.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00372.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00374.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00374.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00376.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00376.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00378.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00378.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00380.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00380.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00382.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00382.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00384.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00384.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00386.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00386.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00388.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00388.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00390.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00390.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00392.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00392.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00394.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00394.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00396.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00396.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00398.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00398.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00400.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00400.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00402.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00402.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00404.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00404.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00406.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00406.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00408.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00408.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00410.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00410.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00412.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00412.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00414.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00414.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00416.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00416.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00418.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00418.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00420.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00420.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00422.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00422.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00424.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00424.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00426.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00426.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00428.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00428.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00430.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00430.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00432.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00432.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00434.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00434.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00436.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00436.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00438.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00438.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00440.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00440.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00442.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00442.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00444.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00444.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00446.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00446.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00448.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00448.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00450.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00450.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00452.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00452.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00454.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00454.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00456.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00456.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00458.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00458.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00460.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00460.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00462.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00462.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00464.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00464.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00466.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00466.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00468.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00468.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00470.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00470.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00472.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00472.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00474.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00474.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00476.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00476.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00478.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00478.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00480.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00480.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00482.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00482.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00484.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00484.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00486.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00486.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00488.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00488.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00490.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00490.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00492.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00492.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00494.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00494.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00496.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00496.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00498.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00498.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00500.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00500.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00502.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00502.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00504.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00504.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00506.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00506.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00508.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00508.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00510.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00510.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00512.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00512.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00514.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00514.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00516.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00516.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00518.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00518.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00520.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00520.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00522.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00522.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00524.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00524.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00526.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00526.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00528.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00528.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00530.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00530.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00532.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00532.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00534.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00534.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00536.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00536.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00538.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00538.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00540.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00540.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00542.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00542.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00544.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00544.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00546.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00546.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00548.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00548.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00550.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00550.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00552.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00552.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00554.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00554.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00556.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00556.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00558.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00558.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00560.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00560.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00562.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00562.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00564.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00564.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00566.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00566.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00568.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00568.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00570.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00570.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00572.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00572.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00574.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00574.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00576.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00576.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00578.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00578.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00580.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00580.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00582.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00582.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00584.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00584.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00586.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00586.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00588.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00588.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00590.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00590.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00592.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00592.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00594.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00594.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00596.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00596.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00598.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00598.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00600.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00600.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00602.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00602.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00604.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00604.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00606.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00606.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00608.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00608.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00610.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00610.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00612.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00612.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00614.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00614.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00616.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00616.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00618.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00618.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00620.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00620.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00622.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00622.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00624.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00624.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00626.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00626.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00628.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00628.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00630.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00630.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00632.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00632.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00634.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00634.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00636.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00636.npz
--------------------------------------------------------------------------------
/Anim_Seqs/seqs/00638.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/seqs/00638.npz
--------------------------------------------------------------------------------
/Anim_Seqs/sequences/dance.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/sequences/dance.npy
--------------------------------------------------------------------------------
/Anim_Seqs/sequences/greeting.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/sequences/greeting.npy
--------------------------------------------------------------------------------
/Anim_Seqs/sequences/hiphop.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/sequences/hiphop.npy
--------------------------------------------------------------------------------
/Anim_Seqs/sequences/house-dance.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/sequences/house-dance.npy
--------------------------------------------------------------------------------
/Anim_Seqs/sequences/jump.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/sequences/jump.npy
--------------------------------------------------------------------------------
/Anim_Seqs/sequences/pistol.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/sequences/pistol.npy
--------------------------------------------------------------------------------
/Anim_Seqs/sequences/strut-walk.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/Anim_Seqs/sequences/strut-walk.npy
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # IMAGEimate
2 | IMAGEimate is an end-to-end pipeline to create realistic animatable 3D avatars from a single image using neural networks. This project is an end-to-end system built using two research works and relevant opensource contributions, so their license and terms follows for this project -
3 | 1. PIFuHD : Multi-Level Pixel-Aligned Implicit Function for High-Resolution 3D Human Digitization (CVPR 2020) - https://shunsukesaito.github.io/PIFuHD/
4 | 2. IPNet : Combining Implicit Function Learning and Parametric Models for 3D Human Reconstruction (ECCV 2020) - https://virtualhumans.mpi-inf.mpg.de/ipnet/
5 | 3. AIST++ : Dance Motion Dataset from National Institute of Advanced Industrial Science and Technology (AIST)- https://google.github.io/aistplusplus_dataset/index.html
6 | AMASS : Archive of Motion Capture as Surface Shapes (AMASS) from Max Planck Institute for Intelligent Systems(MPI) - https://amass.is.tue.mpg.de/
7 | 4. SMPL : Skinned Multi-person Linear Model from MPI, you need to register, accept the license terms and download models - https://smpl.is.tue.mpg.de/
8 |
9 | This project was tested on
10 | ```
11 | OS : Ubuntu 20.04 LTS
12 | GPU : Nvidia RTX2060M with driver 470
13 | CUDA : 10.1
14 | Python : 3.7
15 | PyTorch : 1.8.1
16 | ```
17 |
18 | Follow the [instructions.txt](https://github.com/codesavory/IMAGEimate/blob/main/instruction.txt) to install dependencies and required libraries and download checkpoints
19 | Follow the [run_imageimate.sh](https://github.com/codesavory/IMAGEimate/blob/main/run_imageimate.sh) for how to make modifications to the code and get relevant results
20 |
21 | Results -
22 | Input Image | PIFuHD Mesh | SMPLD Registration | Reposed Animation
23 | :-------------------------:|:-------------------------:|:-------------------------:|:-------------------------:|
24 | |  |  | 
25 |
26 |
--------------------------------------------------------------------------------
/animations_IPNet.py:
--------------------------------------------------------------------------------
1 | import os
2 | from os.path import split, join, exists
3 | from glob import glob
4 | import torch
5 | from kaolin.rep import TriangleMesh as tm
6 | from kaolin.metrics.mesh import point_to_surface, laplacian_loss
7 |
8 | from tqdm import tqdm
9 | import pickle as pkl
10 | import numpy as np
11 |
12 | from lib.smpl_paths import SmplPaths
13 | from lib.th_SMPL import th_batch_SMPL
14 |
15 | from fit_SMPL import fit_SMPL, save_meshes, batch_point_to_surface, backward_step
16 |
17 | def get_loss_weights():
18 | """Set loss weights"""
19 |
20 | loss_weight = {'s2m': lambda cst, it: 10. ** 2 * cst * (1 + it),
21 | 'm2s': lambda cst, it: 10. ** 2 * cst, #/ (1 + it),
22 | 'lap': lambda cst, it: 10. ** 4 * cst / (1 + it),
23 | 'offsets': lambda cst, it: 10. ** 1 * cst / (1 + it)}
24 | return loss_weight
25 |
26 |
27 | def forward_step(th_scan_meshes, smpl, init_smpl_meshes):
28 | """
29 | Performs a forward step, given smpl and scan meshes.
30 | Then computes the losses.
31 | """
32 |
33 | # forward
34 | verts, _, _, _ = smpl()
35 | th_smpl_meshes = [tm.from_tensors(vertices=v,
36 | faces=smpl.faces) for v in verts]
37 |
38 | # losses
39 | loss = dict()
40 | loss['s2m'] = batch_point_to_surface([sm.vertices for sm in th_scan_meshes], th_smpl_meshes)
41 | loss['m2s'] = batch_point_to_surface([sm.vertices for sm in th_smpl_meshes], th_scan_meshes)
42 | loss['lap'] = torch.stack([laplacian_loss(sc, sm) for sc, sm in zip(init_smpl_meshes, th_smpl_meshes)])
43 | loss['offsets'] = torch.mean(torch.mean(smpl.offsets**2, axis=1), axis=1)
44 | return loss
45 |
46 |
47 | def optimize_offsets(th_scan_meshes, smpl, init_smpl_meshes, iterations, steps_per_iter):
48 | # Optimizer
49 | optimizer = torch.optim.Adam([smpl.offsets, smpl.pose, smpl.trans, smpl.betas], 0.005, betas=(0.9, 0.999))
50 |
51 | # Get loss_weights
52 | weight_dict = get_loss_weights()
53 |
54 | for it in range(iterations):
55 | loop = tqdm(range(steps_per_iter))
56 | loop.set_description('Optimizing SMPL+D')
57 | for i in loop:
58 | optimizer.zero_grad()
59 | # Get losses for a forward pass
60 | loss_dict = forward_step(th_scan_meshes, smpl, init_smpl_meshes)
61 | # Get total loss for backward pass
62 | tot_loss = backward_step(loss_dict, weight_dict, it)
63 | tot_loss.backward()
64 | optimizer.step()
65 |
66 | l_str = 'Lx100. Iter: {}'.format(i)
67 | for k in loss_dict:
68 | l_str += ', {}: {:0.4f}'.format(k, loss_dict[k].mean().item()*100)
69 | loop.set_description(l_str)
70 |
71 |
72 | def fit_SMPLD(scans, smpl_pkl=None, gender='male', save_path=None, display=False, anim_path=None):
73 | if not exists(save_path):
74 | os.makedirs(save_path)
75 |
76 | # Get SMPL faces
77 | sp = SmplPaths(gender=gender)
78 | smpl_faces = sp.get_faces()
79 | th_faces = torch.tensor(smpl_faces.astype('float32'), dtype=torch.long).cuda()
80 |
81 | # Batch size
82 | batch_sz = len(scans)
83 |
84 | # Init SMPL
85 | if smpl_pkl is None or smpl_pkl[0] is None:
86 | print('SMPL not specified, fitting SMPL now')
87 | pose, betas, trans = fit_SMPL(scans, None, gender, save_path, display)
88 | else:
89 | pose, betas, trans = [], [], []
90 | for spkl in smpl_pkl:
91 | smpl_dict = pkl.load(open(spkl, 'rb'), encoding='latin-1')
92 | p, b, t = smpl_dict['pose'], smpl_dict['betas'], smpl_dict['trans']
93 | pose.append(p)
94 | if len(b) == 10:
95 | temp = np.zeros((300,))
96 | temp[:10] = b
97 | b = temp.astype('float32')
98 | betas.append(b)
99 | trans.append(t)
100 | pose, betas, trans = np.array(pose), np.array(betas), np.array(trans)
101 |
102 | betas, pose, trans = torch.tensor(betas), torch.tensor(pose), torch.tensor(trans)
103 | smpl = th_batch_SMPL(batch_sz, betas, pose, trans, faces=th_faces).cuda()
104 |
105 | verts, _, _, _ = smpl()
106 | init_smpl_meshes = [tm.from_tensors(vertices=v.clone().detach(),
107 | faces=smpl.faces) for v in verts]
108 |
109 | # Load scans
110 | th_scan_meshes = []
111 | for scan in scans:
112 | th_scan = tm.from_obj(scan)
113 | if save_path is not None:
114 | th_scan.save_mesh(join(save_path, split(scan)[1]))
115 | th_scan.vertices = th_scan.vertices.cuda()
116 | th_scan.faces = th_scan.faces.cuda()
117 | th_scan.vertices.requires_grad = False
118 | th_scan_meshes.append(th_scan)
119 |
120 | # Optimize
121 | optimize_offsets(th_scan_meshes, smpl, init_smpl_meshes, 5, 10)
122 | print('Done')
123 |
124 | verts, _, _, _ = smpl()
125 | th_smpl_meshes = [tm.from_tensors(vertices=v,
126 | faces=smpl.faces) for v in verts]
127 |
128 | #to get the T-pose fitted SMPLD mesh
129 | print("Making the fitted SMPLD model to T-pose")
130 | # Init SMPL, pose with mean smpl pose, as in ch.registration
131 | #copy the optimized smpl model and add t-pose
132 | #read the input animations
133 | print("Saving Animations")
134 | for filename in sorted(os.listdir(anim_path)):
135 |
136 | print("Filename:", filename)
137 | data = np.load(anim_path+filename)
138 | print('pose', data['pose'])
139 | pose_new = torch.tensor([np.array(data['pose'])])
140 | smplD_new = th_batch_SMPL(batch_sz, smpl.betas, pose_new, trans, offsets=smpl.offsets, faces=th_faces).cuda()
141 | verts_new, _, _, _ = smplD_new()
142 | th_smplD_meshes_new = [tm.from_tensors(vertices=v, faces=smplD_new.faces) for v in verts_new]
143 |
144 | #save smplD meshes
145 | new_path = join(save_path,filename)
146 | print("new_path",new_path)
147 | if not exists(new_path):
148 | os.makedirs(new_path)
149 | names = [split(s)[1] for s in scans]
150 | save_meshes(th_smplD_meshes_new, [join(new_path, n.replace('.obj', '_smpld_'+filename+'.obj')) for n in names])
151 | # Save params
152 | for p, b, t, d, n in zip(smplD_new.pose.cpu().detach().numpy(), smplD_new.betas.cpu().detach().numpy(),
153 | smplD_new.trans.cpu().detach().numpy(), smplD_new.offsets.cpu().detach().numpy(), names):
154 | smpl_dict = {'pose': p, 'betas': b, 'trans': t, 'offsets': d}
155 | pkl.dump(smpl_dict, open(join(new_path, n.replace('.obj', '_smpld_'+filename+'.pkl')), 'wb'))
156 | print("Done saving Animations: ",filename)
157 |
158 |
159 | pose_tpose = torch.zeros((batch_sz, 72))
160 | print("pose_tpose", pose_tpose)
161 | smplD_tpose = th_batch_SMPL(batch_sz, smpl.betas, pose_tpose, trans, offsets=smpl.offsets, faces=th_faces).cuda()
162 | #re-pose it to T-pose
163 | #import torch.nn as nn
164 | #smpl_tpose.pose = nn.Parameter(torch.zeros(batch_sz, 72))
165 | #extract vertices
166 | verts_tpose, _, _, _ = smplD_tpose()
167 | th_smplD_meshes_tpose = [tm.from_tensors(vertices=v, faces=smplD_tpose.faces) for v in verts_tpose]
168 |
169 | if save_path is not None:
170 | if not exists(save_path):
171 | os.makedirs(save_path)
172 |
173 | names = [split(s)[1] for s in scans]
174 |
175 | # Save meshes
176 | save_meshes(th_smpl_meshes, [join(save_path, n.replace('.obj', '_smpld.obj')) for n in names])
177 | save_meshes(th_scan_meshes, [join(save_path, n) for n in names])
178 | # Save params
179 | for p, b, t, d, n in zip(smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(),
180 | smpl.trans.cpu().detach().numpy(), smpl.offsets.cpu().detach().numpy(), names):
181 | smpl_dict = {'pose': p, 'betas': b, 'trans': t, 'offsets': d}
182 | pkl.dump(smpl_dict, open(join(save_path, n.replace('.obj', '_smpld.pkl')), 'wb'))
183 |
184 | #save smplD meshes
185 | save_meshes(th_smplD_meshes_tpose, [join(save_path, n.replace('.obj', '_smpld_tpose.obj')) for n in names])
186 | # Save params
187 | for p, b, t, d, n in zip(smplD_tpose.pose.cpu().detach().numpy(), smplD_tpose.betas.cpu().detach().numpy(),
188 | smplD_tpose.trans.cpu().detach().numpy(), smplD_tpose.offsets.cpu().detach().numpy(), names):
189 | smpl_dict = {'pose': p, 'betas': b, 'trans': t, 'offsets': d}
190 | pkl.dump(smpl_dict, open(join(save_path, n.replace('.obj', '_smpld_tpose.pkl')), 'wb'))
191 | print("Done saving SMPLD")
192 |
193 | return smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(), \
194 | smpl.trans.cpu().detach().numpy(), smpl.offsets.cpu().detach().numpy()
195 |
196 |
197 | if __name__ == "__main__":
198 | import argparse
199 | parser = argparse.ArgumentParser(description='Run Model')
200 | parser.add_argument('scan_path', type=str)
201 | parser.add_argument('save_path', type=str)
202 | parser.add_argument('-smpl_pkl', type=str, default=None) # In case SMPL fit is already available
203 | parser.add_argument('-gender', type=str, default='male') # can be female/ male/ neutral
204 | parser.add_argument('--display', default=False, action='store_true')
205 | parser.add_argument('anim_path', type=str)
206 | args = parser.parse_args()
207 |
208 | # args = lambda: None
209 | # args.scan_path = '/BS/bharat-2/static00/renderings/renderpeople/rp_alison_posed_017_30k/rp_alison_posed_017_30k.obj'
210 | # args.smpl_pkl = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data/rp_alison_posed_017_30k_smpl.pkl'
211 | # args.display = False
212 | # args.save_path = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data'
213 | # args.gender = 'female'
214 |
215 | _, _, _, _ = fit_SMPLD([args.scan_path], smpl_pkl=[args.smpl_pkl], display=args.display, save_path=args.save_path,
216 | gender=args.gender, anim_path=args.anim_path)
217 |
--------------------------------------------------------------------------------
/download_trained_pifuhd_model.sh:
--------------------------------------------------------------------------------
1 | # Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.
2 |
3 | set -ex
4 |
5 | mkdir -p checkpoints
6 | cd checkpoints
7 | wget "https://dl.fbaipublicfiles.com/pifuhd/checkpoints/pifuhd.pt" pifuhd.pt
8 | cd ..
9 |
--------------------------------------------------------------------------------
/fit_SMPL.py:
--------------------------------------------------------------------------------
1 | """
2 | Code to fit SMPL (pose, shape) to scan using pytorch, kaolin.
3 | If code works:
4 | Author: Bharat
5 | else:
6 | Author: Anonymous
7 | Cite: Combining Implicit Function Learning and Parametric Models for 3D Human Reconstruction, ECCV 2020.
8 | """
9 |
10 | import os
11 | from os.path import split, join, exists
12 | import sys
13 | import ipdb
14 | import json
15 | import torch
16 | import numpy as np
17 | import pickle as pkl
18 | import kaolin as kal
19 | from kaolin.rep import TriangleMesh as tm
20 | from kaolin.metrics.mesh import point_to_surface, laplacian_loss, chamfer_distance
21 | from kaolin.conversions import trianglemesh_to_sdf
22 | from kaolin.rep import SDF as sdf
23 | from psbody.mesh import Mesh, MeshViewer, MeshViewers
24 | from tqdm import tqdm
25 |
26 | from lib.smpl_paths import SmplPaths
27 | from lib.th_smpl_prior import get_prior
28 | from lib.th_SMPL import th_batch_SMPL, th_batch_SMPL_split_params
29 | from lib.body_objectives import batch_get_pose_obj, torch_pose_obj_data, get_prior_weight, HAND_VISIBLE
30 | from lib.mesh_distance import point_to_surface_vec, batch_point_to_surface_vec_signed, batch_point_to_surface
31 |
32 | import trimesh
33 |
34 | def plot_points(pts, cols=None):
35 | from psbody.mesh.sphere import Sphere
36 | temp = Sphere(np.zeros((3)), 1.).to_mesh()
37 | meshes= [Mesh(vc='SteelBlue' if cols is None else cols[n], f=temp.f, v=temp.v * 10.**-2 + p) for n, p in enumerate(pts)]
38 | return meshes
39 |
40 | def get_loss_weights():
41 | """Set loss weights"""
42 |
43 | loss_weight = {'s2m': lambda cst, it: 10. ** 2 * cst * (1 + it),
44 | 'm2s': lambda cst, it: 10. ** 2 * cst / (1 + it),
45 | 'betas': lambda cst, it: 10. ** 0 * cst / (1 + it),
46 | 'offsets': lambda cst, it: 10. ** -1 * cst / (1 + it),
47 | 'pose_pr': lambda cst, it: 10. ** -5 * cst / (1 + it),
48 | 'lap': lambda cst, it: cst / (1 + it),
49 | 'pose_obj': lambda cst, it: 10. ** 2 * cst / (1 + it)
50 | }
51 | return loss_weight
52 |
53 | def save_meshes(meshes, save_paths):
54 | for m, s in zip(meshes, save_paths):
55 | m.save_mesh(s)
56 |
57 | def forward_step(th_scan_meshes, smpl, th_pose_3d=None):
58 | """
59 | Performs a forward step, given smpl and scan meshes.
60 | Then computes the losses.
61 | """
62 | # Get pose prior
63 | prior = get_prior(smpl.gender)
64 |
65 | # forward
66 | verts, _, _, _ = smpl()
67 | th_smpl_meshes = [tm.from_tensors(vertices=v,
68 | faces=smpl.faces) for v in verts]
69 |
70 | # losses
71 | loss = dict()
72 | loss['s2m'] = batch_point_to_surface([sm.vertices for sm in th_scan_meshes], th_smpl_meshes)
73 | loss['m2s'] = batch_point_to_surface([sm.vertices for sm in th_smpl_meshes], th_scan_meshes)
74 | loss['betas'] = torch.mean(smpl.betas ** 2, axis=1)
75 | loss['pose_pr'] = prior(smpl.pose)
76 | if th_pose_3d is not None:
77 | loss['pose_obj'] = batch_get_pose_obj(th_pose_3d, smpl)
78 | return loss
79 |
80 | def forward_step_pose_only(smpl, th_pose_3d, prior_weight):
81 | """
82 | Performs a forward step, given smpl and scan meshes.
83 | Then computes the losses.
84 | """
85 | # Get pose prior
86 | prior = get_prior(smpl.gender)
87 |
88 | # losses
89 | loss = dict()
90 | loss['pose_pr'] = prior(smpl.pose, prior_weight)
91 | loss['pose_obj'] = batch_get_pose_obj(th_pose_3d, smpl, init_pose=False)
92 | return loss
93 |
94 |
95 | def backward_step(loss_dict, weight_dict, it):
96 | w_loss = dict()
97 | for k in loss_dict:
98 | w_loss[k] = weight_dict[k](loss_dict[k], it)
99 |
100 | tot_loss = list(w_loss.values())
101 | tot_loss = torch.stack(tot_loss).sum()
102 | return tot_loss
103 |
104 | def optimize_pose_shape(th_scan_meshes, smpl, iterations, steps_per_iter, th_pose_3d=None, display=None):
105 | """
106 | Optimize SMPL.
107 | :param display: if not None, pass index of the scan in th_scan_meshes to visualize.
108 | """
109 | # Optimizer
110 | optimizer = torch.optim.Adam([smpl.trans, smpl.betas, smpl.pose], 0.02, betas=(0.9, 0.999))
111 |
112 | # Get loss_weights
113 | weight_dict = get_loss_weights()
114 |
115 | # Display
116 | if display is not None:
117 | assert int(display) < len(th_scan_meshes)
118 | mv = MeshViewer()
119 |
120 | for it in range(iterations):
121 | loop = tqdm(range(steps_per_iter))
122 | loop.set_description('Optimizing SMPL')
123 | for i in loop:
124 | optimizer.zero_grad()
125 | # Get losses for a forward pass
126 | loss_dict = forward_step(th_scan_meshes, smpl, th_pose_3d)
127 | # Get total loss for backward pass
128 | tot_loss = backward_step(loss_dict, weight_dict, it)
129 | tot_loss.backward()
130 | optimizer.step()
131 |
132 | l_str = 'Iter: {}'.format(i)
133 | for k in loss_dict:
134 | l_str += ', {}: {:0.4f}'.format(k, weight_dict[k](loss_dict[k], it).mean().item())
135 | loop.set_description(l_str)
136 |
137 | if display is not None:
138 | verts, _, _, _ = smpl()
139 | smpl_mesh = Mesh(v=verts[display].cpu().detach().numpy(), f=smpl.faces.cpu().numpy())
140 | scan_mesh = Mesh(v=th_scan_meshes[display].vertices.cpu().detach().numpy(),
141 | f=th_scan_meshes[display].faces.cpu().numpy(), vc=np.array([0, 1, 0]))
142 | mv.set_static_meshes([scan_mesh, smpl_mesh])
143 |
144 | #smpl.betas.data = split_smpl.betas.data
145 | print('** Optimised smpl pose and shape **')
146 |
147 | def optimize_pose_only(th_scan_meshes, smpl, iterations, steps_per_iter, th_pose_3d, prior_weight, display=None):
148 | """
149 | Initially we want to only optimize the global rotation of SMPL. Next we optimize full pose.
150 | We optimize pose based on the 3D keypoints in th_pose_3d.
151 | :param th_pose_3d: array containing the 3D keypoints.
152 | :param prior_weight: weights corresponding to joints depending on visibility of the joint in the 3D scan.
153 | eg: hand could be inside pocket.
154 | """
155 |
156 | batch_sz = smpl.pose.shape[0]
157 | split_smpl = th_batch_SMPL_split_params(batch_sz, top_betas=smpl.betas.data[:, :2], other_betas=smpl.betas.data[:, 2:],
158 | global_pose=smpl.pose.data[:, :3], other_pose=smpl.pose.data[:, 3:],
159 | faces=smpl.faces, gender=smpl.gender).cuda()
160 | optimizer = torch.optim.Adam([split_smpl.trans, split_smpl.top_betas, split_smpl.global_pose], 0.02,
161 | betas=(0.9, 0.999))
162 |
163 | # Get loss_weights
164 | weight_dict = get_loss_weights()
165 |
166 | if display is not None:
167 | assert int(display) < len(th_scan_meshes)
168 | # mvs = MeshViewers((1,1))
169 | mv = MeshViewer(keepalive=True)
170 |
171 | iter_for_global = 1
172 | for it in range(iter_for_global + iterations):
173 | loop = tqdm(range(steps_per_iter))
174 | if it < iter_for_global:
175 | # Optimize global orientation
176 | print('Optimizing SMPL global orientation')
177 | loop.set_description('Optimizing SMPL global orientation')
178 | elif it == iter_for_global:
179 | # Now optimize full SMPL pose
180 | print('Optimizing SMPL pose only')
181 | loop.set_description('Optimizing SMPL pose only')
182 | optimizer = torch.optim.Adam([split_smpl.trans, split_smpl.top_betas, split_smpl.global_pose,
183 | split_smpl.other_pose], 0.02, betas=(0.9, 0.999))
184 | else:
185 | loop.set_description('Optimizing SMPL pose only')
186 |
187 | for i in loop:
188 | optimizer.zero_grad()
189 | # Get losses for a forward pass
190 | loss_dict = forward_step_pose_only(split_smpl, th_pose_3d, prior_weight)
191 | # Get total loss for backward pass
192 | tot_loss = backward_step(loss_dict, weight_dict, it)
193 | tot_loss.backward()
194 | optimizer.step()
195 |
196 | l_str = 'Iter: {}'.format(i)
197 | for k in loss_dict:
198 | l_str += ', {}: {:0.4f}'.format(k, weight_dict[k](loss_dict[k], it).mean().item())
199 | loop.set_description(l_str)
200 |
201 | if display is not None:
202 | verts, _, _, _ = split_smpl()
203 | smpl_mesh = Mesh(v=verts[display].cpu().detach().numpy(), f=smpl.faces.cpu().numpy())
204 | scan_mesh = Mesh(v=th_scan_meshes[display].vertices.cpu().detach().numpy(),
205 | f=th_scan_meshes[display].faces.cpu().numpy(), vc=np.array([0, 1, 0]))
206 |
207 | mv.set_dynamic_meshes([smpl_mesh, scan_mesh])
208 |
209 | # from matplotlib import cm
210 | # col = cm.tab20c(np.arange(len(th_pose_3d[display]['pose_keypoints_3d'])) % 20)[:, :3]
211 | #
212 | # jts, _, _ = split_smpl.get_landmarks()
213 | # Js = plot_points(jts[display].detach().cpu().numpy(), cols=col)
214 | # Js_observed = plot_points(th_pose_3d[display]['pose_keypoints_3d'][:, :3].numpy(), cols=col)
215 |
216 | # mvs[0][0].set_static_meshes([smpl_mesh, scan_mesh])
217 | # mvs[0][1].set_static_meshes(Js)
218 | # mvs[0][2].set_static_meshes(Js_observed)
219 |
220 | # Put back pose, shape and trans into original smpl
221 | smpl.pose.data = split_smpl.pose.data
222 | smpl.betas.data = split_smpl.betas.data
223 | smpl.trans.data = split_smpl.trans.data
224 |
225 | print('** Optimised smpl pose **')
226 |
227 |
228 | def fit_SMPL(scans, pose_files=None, gender='male', save_path=None, display=None):
229 | """
230 | :param save_path:
231 | :param scans: list of scan paths
232 | :param pose_files:
233 | :return:
234 | """
235 | # Get SMPL faces
236 | sp = SmplPaths(gender=gender)
237 | smpl_faces = sp.get_faces()
238 | th_faces = torch.tensor(smpl_faces.astype('float32'), dtype=torch.long).cuda()
239 |
240 | # Batch size
241 | batch_sz = len(scans)
242 |
243 | # Set optimization hyper parameters
244 | iterations, pose_iterations, steps_per_iter, pose_steps_per_iter = 3, 2, 30, 30 #default 3,2,30,30
245 |
246 | if False:
247 | """Test by loading GT SMPL params"""
248 | betas, pose, trans = torch.tensor(GT_SMPL['betas'].astype('float32')).unsqueeze(0), torch.tensor(GT_SMPL['pose'].astype('float32')).unsqueeze(0), torch.zeros((batch_sz, 3))
249 | else:
250 | prior = get_prior(gender=gender)
251 | pose_init = torch.zeros((batch_sz, 72))
252 | pose_init[:, 3:] = prior.mean
253 | betas, pose, trans = torch.zeros((batch_sz, 300)), pose_init, torch.zeros((batch_sz, 3))
254 |
255 |
256 | # Init SMPL, pose with mean smpl pose, as in ch.registration
257 | smpl = th_batch_SMPL(batch_sz, betas, pose, trans, faces=th_faces).cuda()
258 |
259 | # Load scans and center them. Once smpl is registered, move it accordingly.
260 | # Do not forget to change the location of 3D joints/ landmarks accordingly.
261 | th_scan_meshes, centers = [], []
262 | for scan in scans:
263 | # Load scan using trumesh
264 | print("Loading using trimesh")
265 | #mesh = trimesh.load(scan, process=False)
266 |
267 | print('scan path ...', scan)
268 | th_scan = tm.from_obj(scan)
269 | #custom code
270 | #th_scan.vertices = torch.tensor(mesh.vertices).float()
271 | #th_scan.faces = torch.tensor(mesh.faces).float()
272 | # cent = th_scan.vertices.mean(axis=0)
273 | # centers.append(cent)
274 | # th_scan.vertices -= cent
275 | th_scan.vertices = th_scan.vertices.cuda()
276 | th_scan.faces = th_scan.faces.cuda()
277 | th_scan.vertices.requires_grad = False
278 | th_scan.cuda()
279 | th_scan_meshes.append(th_scan)
280 |
281 | # Load pose information if pose file is given
282 | # Bharat: Shouldn't we structure th_pose_3d as [key][batch, ...] as opposed to current [batch][key]? See batch_get_pose_obj() in body_objectives.py
283 | th_pose_3d = None
284 | if pose_files is not None:
285 | th_no_right_hand_visible, th_no_left_hand_visible, th_pose_3d = [], [], []
286 | for pose_file in pose_files:
287 | with open(pose_file) as f:
288 | pose_3d = json.load(f)
289 | th_no_right_hand_visible.append(np.max(np.array(pose_3d['hand_right_keypoints_3d']).reshape(-1,4)[:, 3]) < HAND_VISIBLE)
290 | th_no_left_hand_visible.append(np.max(np.array(pose_3d['hand_left_keypoints_3d']).reshape(-1,4)[:, 3]) < HAND_VISIBLE)
291 |
292 | pose_3d['pose_keypoints_3d'] = torch.from_numpy(np.array(pose_3d['pose_keypoints_3d']).astype(np.float32).reshape(-1, 4))
293 | pose_3d['face_keypoints_3d'] = torch.from_numpy(np.array(pose_3d['face_keypoints_3d']).astype(np.float32).reshape(-1, 4))
294 | pose_3d['hand_right_keypoints_3d'] = torch.from_numpy(np.array(pose_3d['hand_right_keypoints_3d']).astype(np.float32).reshape(-1, 4))
295 | pose_3d['hand_left_keypoints_3d'] = torch.from_numpy(np.array(pose_3d['hand_left_keypoints_3d']).astype(np.float32).reshape(-1, 4))
296 | th_pose_3d.append(pose_3d)
297 |
298 | prior_weight = get_prior_weight(th_no_right_hand_visible,th_no_left_hand_visible).cuda()
299 |
300 | # Optimize pose first
301 | optimize_pose_only(th_scan_meshes, smpl, pose_iterations, pose_steps_per_iter, th_pose_3d, prior_weight, display=None if display is None else 0)
302 |
303 | # Optimize pose and shape
304 | optimize_pose_shape(th_scan_meshes, smpl, iterations, steps_per_iter, th_pose_3d, display=None if display is None else 0)
305 |
306 | verts, _, _, _ = smpl()
307 | th_smpl_meshes = [tm.from_tensors(vertices=v, faces=smpl.faces) for v in verts]
308 |
309 | #to get the T-pose fitted SMPL mesh
310 | # Init SMPL, pose with mean smpl pose, as in ch.registration
311 | print("Making the fitted SMPL model to T-pose")
312 | #copy the optimized smpl model and add t-pose
313 | pose_tpose = torch.zeros((batch_sz, 72))
314 | smpl_tpose = th_batch_SMPL(batch_sz, smpl.betas, pose_tpose, trans, faces=th_faces).cuda()
315 | #re-pose it to T-pose
316 | #import torch.nn as nn
317 | #smpl_tpose.pose = nn.Parameter(torch.zeros(batch_sz, 72))
318 | #extract vertices
319 | verts_tpose, _, _, _ = smpl_tpose()
320 | th_smpl_meshes_tpose = [tm.from_tensors(vertices=v, faces=smpl_tpose.faces) for v in verts_tpose]
321 |
322 | if save_path is not None:
323 | if not exists(save_path):
324 | os.makedirs(save_path)
325 |
326 | names = [split(s)[1] for s in scans]
327 |
328 | # Save meshes
329 | save_meshes(th_smpl_meshes, [join(save_path, n.replace('.obj', '_smpl.obj')) for n in names])
330 | save_meshes(th_scan_meshes, [join(save_path, n) for n in names])
331 |
332 | # Save params
333 | for p, b, t, n in zip(smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(),
334 | smpl.trans.cpu().detach().numpy(), names):
335 | smpl_dict = {'pose': p, 'betas': b, 'trans': t}
336 | pkl.dump(smpl_dict, open(join(save_path, n.replace('.obj', '_smpl.pkl')), 'wb'))
337 |
338 | #save T-pose mesh and pkl
339 | #save mesh
340 | save_meshes(th_smpl_meshes_tpose, [join(save_path, n.replace('.obj', '_smpl_tpose.obj')) for n in names])
341 | # Save params
342 | for p, b, t, n in zip(smpl_tpose.pose.cpu().detach().numpy(), smpl_tpose.betas.cpu().detach().numpy(),
343 | smpl_tpose.trans.cpu().detach().numpy(), names):
344 | smpl_dict = {'pose': p, 'betas': b, 'trans': t}
345 | pkl.dump(smpl_dict, open(join(save_path, n.replace('.obj', '_smpl_tpose.pkl')), 'wb'))
346 | print("Done saving fitted T-pose SMPL model")
347 |
348 | return smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(), smpl.trans.cpu().detach().numpy()
349 |
350 |
351 | if __name__ == "__main__":
352 | import argparse
353 | parser = argparse.ArgumentParser(description='Run Model')
354 | parser.add_argument('-scan_path', type=str)
355 | parser.add_argument('-pose_file', type=str, default=None)
356 | parser.add_argument('-save_path', type=str)
357 | parser.add_argument('-gender', type=str, default='male') # can be female
358 | parser.add_argument('--display', default=False, action='store_true')
359 | args = parser.parse_args()
360 |
361 | # args = lambda: None
362 | # args.scan_path = '/BS/bharat-2/static00/renderings/renderpeople/rp_alison_posed_017_30k/rp_alison_posed_017_30k.obj'
363 | # args.pose_file = '/BS/bharat-2/static00/renderings/renderpeople/rp_alison_posed_017_30k/pose3d/rp_alison_posed_017_30k.json'
364 | # args.display = False
365 | # args.save_path = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data'
366 | # args.gender = 'female'
367 |
368 | _, _, _ = fit_SMPL([args.scan_path], pose_files = args.pose_file, display=args.display, save_path=args.save_path, gender=args.gender)
369 |
--------------------------------------------------------------------------------
/fit_SMPLD.py:
--------------------------------------------------------------------------------
1 | """
2 | This code optimizes the offsets on top of SMPL.
3 | If code works:
4 | Author: Bharat
5 | else:
6 | Author: Anonymous
7 | Cite: Combining Implicit Function Learning and Parametric Models for 3D Human Reconstruction, ECCV 2020.
8 | """
9 | import os
10 | from os.path import split, join, exists
11 | from glob import glob
12 | import torch
13 | from kaolin.rep import TriangleMesh as tm
14 | from kaolin.metrics.mesh import point_to_surface, laplacian_loss
15 |
16 | from tqdm import tqdm
17 | import pickle as pkl
18 | import numpy as np
19 |
20 |
21 | import sys
22 | sys.path.append('../lib/')
23 | from lib.smpl_paths import SmplPaths
24 | from lib.th_SMPL import th_batch_SMPL
25 |
26 | from fit_SMPL import fit_SMPL, save_meshes, batch_point_to_surface, backward_step
27 |
28 |
29 | def get_loss_weights():
30 | """Set loss weights"""
31 |
32 | loss_weight = {'s2m': lambda cst, it: 10. ** 2 * cst * (1 + it),
33 | 'm2s': lambda cst, it: 10. ** 2 * cst, #/ (1 + it),
34 | 'lap': lambda cst, it: 10. ** 4 * cst / (1 + it),
35 | 'offsets': lambda cst, it: 10. ** 1 * cst / (1 + it)}
36 | return loss_weight
37 |
38 |
39 | def forward_step(th_scan_meshes, smpl, init_smpl_meshes):
40 | """
41 | Performs a forward step, given smpl and scan meshes.
42 | Then computes the losses.
43 | """
44 |
45 | # forward
46 | verts, _, _, _ = smpl()
47 | th_smpl_meshes = [tm.from_tensors(vertices=v,
48 | faces=smpl.faces) for v in verts]
49 |
50 | # losses
51 | loss = dict()
52 | loss['s2m'] = batch_point_to_surface([sm.vertices for sm in th_scan_meshes], th_smpl_meshes)
53 | loss['m2s'] = batch_point_to_surface([sm.vertices for sm in th_smpl_meshes], th_scan_meshes)
54 | loss['lap'] = torch.stack([laplacian_loss(sc, sm) for sc, sm in zip(init_smpl_meshes, th_smpl_meshes)])
55 | loss['offsets'] = torch.mean(torch.mean(smpl.offsets**2, axis=1), axis=1)
56 | return loss
57 |
58 |
59 | def optimize_offsets(th_scan_meshes, smpl, init_smpl_meshes, iterations, steps_per_iter):
60 | # Optimizer
61 | optimizer = torch.optim.Adam([smpl.offsets, smpl.pose, smpl.trans, smpl.betas], 0.005, betas=(0.9, 0.999))
62 |
63 | # Get loss_weights
64 | weight_dict = get_loss_weights()
65 |
66 | for it in range(iterations):
67 | loop = tqdm(range(steps_per_iter))
68 | loop.set_description('Optimizing SMPL+D')
69 | for i in loop:
70 | optimizer.zero_grad()
71 | # Get losses for a forward pass
72 | loss_dict = forward_step(th_scan_meshes, smpl, init_smpl_meshes)
73 | # Get total loss for backward pass
74 | tot_loss = backward_step(loss_dict, weight_dict, it)
75 | tot_loss.backward()
76 | optimizer.step()
77 |
78 | l_str = 'Lx100. Iter: {}'.format(i)
79 | for k in loss_dict:
80 | l_str += ', {}: {:0.4f}'.format(k, loss_dict[k].mean().item()*100)
81 | loop.set_description(l_str)
82 |
83 |
84 | def fit_SMPLD(scans, smpl_pkl=None, gender='male', save_path=None, display=False):
85 | # Get SMPL faces
86 | sp = SmplPaths(gender=gender)
87 | smpl_faces = sp.get_faces()
88 | th_faces = torch.tensor(smpl_faces.astype('float32'), dtype=torch.long).cuda()
89 |
90 | # Batch size
91 | batch_sz = len(scans)
92 |
93 | # Init SMPL
94 | if smpl_pkl is None or smpl_pkl[0] is None:
95 | print('SMPL not specified, fitting SMPL now')
96 | pose, betas, trans = fit_SMPL(scans, None, gender, save_path, display)
97 | else:
98 | pose, betas, trans = [], [], []
99 | for spkl in smpl_pkl:
100 | smpl_dict = pkl.load(open(spkl, 'rb'), encoding='latin-1')
101 | p, b, t = smpl_dict['pose'], smpl_dict['betas'], smpl_dict['trans']
102 | pose.append(p)
103 | if len(b) == 10:
104 | temp = np.zeros((300,))
105 | temp[:10] = b
106 | b = temp.astype('float32')
107 | betas.append(b)
108 | trans.append(t)
109 | pose, betas, trans = np.array(pose), np.array(betas), np.array(trans)
110 |
111 | betas, pose, trans = torch.tensor(betas), torch.tensor(pose), torch.tensor(trans)
112 | smpl = th_batch_SMPL(batch_sz, betas, pose, trans, faces=th_faces).cuda()
113 |
114 | verts, _, _, _ = smpl()
115 | init_smpl_meshes = [tm.from_tensors(vertices=v.clone().detach(),
116 | faces=smpl.faces) for v in verts]
117 |
118 | # Load scans
119 | th_scan_meshes = []
120 | for scan in scans:
121 | th_scan = tm.from_obj(scan)
122 | if save_path is not None:
123 | th_scan.save_mesh(join(save_path, split(scan)[1]))
124 | th_scan.vertices = th_scan.vertices.cuda()
125 | th_scan.faces = th_scan.faces.cuda()
126 | th_scan.vertices.requires_grad = False
127 | th_scan_meshes.append(th_scan)
128 |
129 | # Optimize
130 | optimize_offsets(th_scan_meshes, smpl, init_smpl_meshes, 5, 10)
131 | print('Done')
132 |
133 | verts, _, _, _ = smpl()
134 | th_smpl_meshes = [tm.from_tensors(vertices=v,
135 | faces=smpl.faces) for v in verts]
136 |
137 | #to get the T-pose fitted SMPLD mesh
138 | print("Making the fitted SMPLD model to T-pose")
139 | # Init SMPL, pose with mean smpl pose, as in ch.registration
140 | #copy the optimized smpl model and add t-pose
141 | pose_tpose = torch.zeros((batch_sz, 72))
142 | smplD_tpose = th_batch_SMPL(batch_sz, smpl.betas, pose_tpose, trans, offsets=smpl.offsets, faces=th_faces).cuda()
143 | #re-pose it to T-pose
144 | #import torch.nn as nn
145 | #smpl_tpose.pose = nn.Parameter(torch.zeros(batch_sz, 72))
146 | #extract vertices
147 | verts_tpose, _, _, _ = smplD_tpose()
148 | th_smplD_meshes_tpose = [tm.from_tensors(vertices=v, faces=smplD_tpose.faces) for v in verts_tpose]
149 |
150 | if save_path is not None:
151 | if not exists(save_path):
152 | os.makedirs(save_path)
153 |
154 | names = [split(s)[1] for s in scans]
155 |
156 | # Save meshes
157 | save_meshes(th_smpl_meshes, [join(save_path, n.replace('.obj', '_smpld.obj')) for n in names])
158 | save_meshes(th_scan_meshes, [join(save_path, n) for n in names])
159 | # Save params
160 | for p, b, t, d, n in zip(smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(),
161 | smpl.trans.cpu().detach().numpy(), smpl.offsets.cpu().detach().numpy(), names):
162 | smpl_dict = {'pose': p, 'betas': b, 'trans': t, 'offsets': d}
163 | pkl.dump(smpl_dict, open(join(save_path, n.replace('.obj', '_smpld.pkl')), 'wb'))
164 |
165 | #save smplD meshes
166 | save_meshes(th_smplD_meshes_tpose, [join(save_path, n.replace('.obj', '_smpld_tpose.obj')) for n in names])
167 | # Save params
168 | for p, b, t, d, n in zip(smplD_tpose.pose.cpu().detach().numpy(), smplD_tpose.betas.cpu().detach().numpy(),
169 | smplD_tpose.trans.cpu().detach().numpy(), smplD_tpose.offsets.cpu().detach().numpy(), names):
170 | smpl_dict = {'pose': p, 'betas': b, 'trans': t, 'offsets': d}
171 | pkl.dump(smpl_dict, open(join(save_path, n.replace('.obj', '_smpld_tpose.pkl')), 'wb'))
172 | print("Done saving SMPLD")
173 |
174 | return smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(), \
175 | smpl.trans.cpu().detach().numpy(), smpl.offsets.cpu().detach().numpy()
176 |
177 |
178 | if __name__ == "__main__":
179 | import argparse
180 | parser = argparse.ArgumentParser(description='Run Model')
181 | parser.add_argument('scan_path', type=str)
182 | parser.add_argument('save_path', type=str)
183 | parser.add_argument('-smpl_pkl', type=str, default=None) # In case SMPL fit is already available
184 | parser.add_argument('-gender', type=str, default='male') # can be female/ male/ neutral
185 | parser.add_argument('--display', default=False, action='store_true')
186 | args = parser.parse_args()
187 |
188 | # args = lambda: None
189 | # args.scan_path = '/BS/bharat-2/static00/renderings/renderpeople/rp_alison_posed_017_30k/rp_alison_posed_017_30k.obj'
190 | # args.smpl_pkl = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data/rp_alison_posed_017_30k_smpl.pkl'
191 | # args.display = False
192 | # args.save_path = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data'
193 | # args.gender = 'female'
194 |
195 | _, _, _, _ = fit_SMPLD([args.scan_path], smpl_pkl=[args.smpl_pkl], display=args.display, save_path=args.save_path,
196 | gender=args.gender)
197 |
--------------------------------------------------------------------------------
/fit_SMPL_IPNet.py:
--------------------------------------------------------------------------------
1 | """
2 | Code to fit SMPL (pose, shape) to IPNet predictions using pytorch, kaolin.
3 | Author: Bharat
4 | Cite: Combining Implicit Function Learning and Parametric Models for 3D Human Reconstruction, ECCV 2020.
5 | """
6 | import os
7 | from os.path import split, join, exists
8 | import sys
9 | import ipdb
10 | import json
11 | import torch
12 | import numpy as np
13 | import pickle as pkl
14 | import kaolin as kal
15 | from kaolin.rep import TriangleMesh as tm
16 | from kaolin.metrics.mesh import point_to_surface, laplacian_loss # , chamfer_distance
17 | from kaolin.conversions import trianglemesh_to_sdf
18 | from kaolin.rep import SDF as sdf
19 | from psbody.mesh import Mesh, MeshViewer, MeshViewers
20 | from tqdm import tqdm
21 |
22 | from fit_SMPL import save_meshes, backward_step
23 | from fit_SMPLD import optimize_offsets
24 | # from fit_SMPLD import forward_step as forward_step_offsets
25 | from lib.smpl_paths import SmplPaths
26 | from lib.th_smpl_prior import get_prior
27 | from lib.th_SMPL import th_batch_SMPL, th_batch_SMPL_split_params
28 | from lib.mesh_distance import chamfer_distance, batch_point_to_surface
29 | from lib.body_objectives import batch_get_pose_obj
30 |
31 | NUM_PARTS = 14 # number of parts that the smpl is segmented into.
32 |
33 |
34 | def get_loss_weights():
35 | """Set loss weights"""
36 |
37 | loss_weight = {'s2m': lambda cst, it: 10. ** 2 * cst * (1 + it),
38 | 'm2s': lambda cst, it: 10. ** 2 * cst / (1 + it),
39 | 'betas': lambda cst, it: 10. ** 0 * cst / (1 + it),
40 | 'offsets': lambda cst, it: 10. ** -1 * cst / (1 + it),
41 | 'pose_pr': lambda cst, it: 10. ** -5 * cst / (1 + it),
42 | 'lap': lambda cst, it: cst / (1 + it),
43 | 'part': lambda cst, it: 10. ** 2 * cst / (1 + it)
44 | }
45 | return loss_weight
46 |
47 |
48 | def forward_step(th_scan_meshes, smpl, scan_part_labels, smpl_part_labels):
49 | """
50 | Performs a forward step, given smpl and scan meshes.
51 | Then computes the losses.
52 | """
53 | # Get pose prior
54 | prior = get_prior(smpl.gender, precomputed=True)
55 |
56 | # forward
57 | verts, _, _, _ = smpl()
58 | th_smpl_meshes = [tm.from_tensors(vertices=v,
59 | faces=smpl.faces) for v in verts]
60 |
61 | scan_verts = [sm.vertices for sm in th_scan_meshes]
62 | smpl_verts = [sm.vertices for sm in th_smpl_meshes]
63 |
64 | # losses
65 | loss = dict()
66 | loss['s2m'] = batch_point_to_surface(scan_verts, th_smpl_meshes)
67 | loss['m2s'] = batch_point_to_surface(smpl_verts, th_scan_meshes)
68 | loss['betas'] = torch.mean(smpl.betas ** 2, axis=1)
69 | loss['pose_pr'] = prior(smpl.pose)
70 |
71 | loss['part'] = []
72 | for n, (sc_v, sc_l) in enumerate(zip(scan_verts, scan_part_labels)):
73 | tot = 0
74 | for i in range(NUM_PARTS): # we currently use 14 parts
75 | if i not in sc_l:
76 | continue
77 | ind = torch.where(sc_l == i)[0]
78 | sc_part_points = sc_v[ind].unsqueeze(0)
79 | sm_part_points = smpl_verts[n][torch.where(smpl_part_labels[n] == i)[0]].unsqueeze(0)
80 | dist = chamfer_distance(sc_part_points, sm_part_points, w1=1., w2=1.)
81 | tot += dist
82 | loss['part'].append(tot / NUM_PARTS)
83 | loss['part'] = torch.stack(loss['part'])
84 | return loss
85 |
86 |
87 | def optimize_pose_shape(th_scan_meshes, smpl, iterations, steps_per_iter, scan_part_labels, smpl_part_labels,
88 | display=None):
89 | """
90 | Optimize SMPL.
91 | :param display: if not None, pass index of the scan in th_scan_meshes to visualize.
92 | """
93 | # Optimizer
94 | optimizer = torch.optim.Adam([smpl.trans, smpl.betas, smpl.pose], 0.02, betas=(0.9, 0.999))
95 |
96 | # Get loss_weights
97 | weight_dict = get_loss_weights()
98 |
99 | # Display
100 | if display is not None:
101 | assert int(display) < len(th_scan_meshes)
102 | mv = MeshViewer()
103 |
104 | for it in range(iterations):
105 | loop = tqdm(range(steps_per_iter))
106 | loop.set_description('Optimizing SMPL')
107 | for i in loop:
108 | optimizer.zero_grad()
109 | # Get losses for a forward pass
110 | loss_dict = forward_step(th_scan_meshes, smpl, scan_part_labels, smpl_part_labels)
111 | # Get total loss for backward pass
112 | tot_loss = backward_step(loss_dict, weight_dict, it)
113 | tot_loss.backward()
114 | optimizer.step()
115 |
116 | l_str = 'Iter: {}'.format(i)
117 | for k in loss_dict:
118 | l_str += ', {}: {:0.4f}'.format(k, weight_dict[k](loss_dict[k], it).mean().item())
119 | loop.set_description(l_str)
120 |
121 | if display is not None:
122 | verts, _, _, _ = smpl()
123 | smpl_mesh = Mesh(v=verts[display].cpu().detach().numpy(), f=smpl.faces.cpu().numpy())
124 | scan_mesh = Mesh(v=th_scan_meshes[display].vertices.cpu().detach().numpy(),
125 | f=th_scan_meshes[display].faces.cpu().numpy(), vc=np.array([0, 1, 0]))
126 | scan_mesh.set_vertex_colors_from_weights(scan_part_labels[display].cpu().detach().numpy())
127 | mv.set_static_meshes([scan_mesh, smpl_mesh])
128 |
129 | print('** Optimised smpl pose and shape **')
130 |
131 |
132 | def optimize_pose_only(th_scan_meshes, smpl, iterations, steps_per_iter, scan_part_labels, smpl_part_labels,
133 | display=None):
134 | """
135 | Initially we want to only optimize the global rotation of SMPL. Next we optimize full pose.
136 | We optimize pose based on the 3D keypoints in th_pose_3d.
137 | :param th_pose_3d: array containing the 3D keypoints.
138 | """
139 |
140 | batch_sz = smpl.pose.shape[0]
141 | split_smpl = th_batch_SMPL_split_params(batch_sz, top_betas=smpl.betas.data[:, :2],
142 | other_betas=smpl.betas.data[:, 2:],
143 | global_pose=smpl.pose.data[:, :3], other_pose=smpl.pose.data[:, 3:],
144 | faces=smpl.faces, gender=smpl.gender).to(DEVICE)
145 | optimizer = torch.optim.Adam([split_smpl.trans, split_smpl.top_betas, split_smpl.global_pose], 0.02,
146 | betas=(0.9, 0.999))
147 |
148 | # Get loss_weights
149 | weight_dict = get_loss_weights()
150 |
151 | if display is not None:
152 | assert int(display) < len(th_scan_meshes)
153 | # mvs = MeshViewers((1,1))
154 | mv = MeshViewer(keepalive=True)
155 |
156 | iter_for_global = 1
157 | for it in range(iter_for_global + iterations):
158 | loop = tqdm(range(steps_per_iter))
159 | if it < iter_for_global:
160 | # Optimize global orientation
161 | print('Optimizing SMPL global orientation')
162 | loop.set_description('Optimizing SMPL global orientation')
163 | elif it == iter_for_global:
164 | # Now optimize full SMPL pose
165 | print('Optimizing SMPL pose only')
166 | loop.set_description('Optimizing SMPL pose only')
167 | optimizer = torch.optim.Adam([split_smpl.trans, split_smpl.top_betas, split_smpl.global_pose,
168 | split_smpl.other_pose], 0.02, betas=(0.9, 0.999))
169 | else:
170 | loop.set_description('Optimizing SMPL pose only')
171 |
172 | for i in loop:
173 | optimizer.zero_grad()
174 | # Get losses for a forward pass
175 | loss_dict = forward_step(th_scan_meshes, split_smpl, scan_part_labels, smpl_part_labels)
176 | # Get total loss for backward pass
177 | tot_loss = backward_step(loss_dict, weight_dict, it)
178 | tot_loss.backward()
179 | optimizer.step()
180 |
181 | l_str = 'Iter: {}'.format(i)
182 | for k in loss_dict:
183 | l_str += ', {}: {:0.4f}'.format(k, weight_dict[k](loss_dict[k], it).mean().item())
184 | loop.set_description(l_str)
185 |
186 | if display is not None:
187 | verts, _, _, _ = split_smpl()
188 | smpl_mesh = Mesh(v=verts[display].cpu().detach().numpy(), f=smpl.faces.cpu().numpy())
189 | scan_mesh = Mesh(v=th_scan_meshes[display].vertices.cpu().detach().numpy(),
190 | f=th_scan_meshes[display].faces.cpu().numpy(), vc=np.array([0, 1, 0]))
191 | scan_mesh.set_vertex_colors_from_weights(scan_part_labels[display].cpu().detach().numpy())
192 |
193 | mv.set_dynamic_meshes([smpl_mesh, scan_mesh])
194 |
195 | # Put back pose, shape and trans into original smpl
196 | smpl.pose.data = split_smpl.pose.data
197 | smpl.betas.data = split_smpl.betas.data
198 | smpl.trans.data = split_smpl.trans.data
199 |
200 | print('** Optimised smpl pose **')
201 |
202 |
203 | def fit_SMPL(scans, scan_labels, gender='male', save_path=None, scale_file=None, display=None):
204 | """
205 | :param save_path:
206 | :param scans: list of scan paths
207 | :param pose_files:
208 | :return:
209 | """
210 | # Get SMPL faces
211 | sp = SmplPaths(gender=gender)
212 | smpl_faces = sp.get_faces()
213 | th_faces = torch.tensor(smpl_faces.astype('float32'), dtype=torch.long).to(DEVICE)
214 |
215 | # Load SMPL parts
216 | part_labels = pkl.load(open('./assets/smpl_parts_dense.pkl', 'rb'))
217 | labels = np.zeros((6890,), dtype='int32')
218 | for n, k in enumerate(part_labels):
219 | labels[part_labels[k]] = n
220 | labels = torch.tensor(labels).unsqueeze(0).to(DEVICE)
221 |
222 | # Load scan parts
223 | scan_part_labels = []
224 | for sc_l in scan_labels:
225 | temp = torch.tensor(np.load(sc_l).astype('int32')).to(DEVICE)
226 | scan_part_labels.append(temp)
227 |
228 | # Batch size
229 | batch_sz = len(scans)
230 |
231 | # Set optimization hyper parameters
232 | iterations, pose_iterations, steps_per_iter, pose_steps_per_iter = 3, 2, 30, 30
233 |
234 | prior = get_prior(gender=gender, precomputed=True)
235 | pose_init = torch.zeros((batch_sz, 72))
236 | pose_init[:, 3:] = prior.mean
237 | betas, pose, trans = torch.zeros((batch_sz, 300)), pose_init, torch.zeros((batch_sz, 3))
238 |
239 | # Init SMPL, pose with mean smpl pose, as in ch.registration
240 | smpl = th_batch_SMPL(batch_sz, betas, pose, trans, faces=th_faces).to(DEVICE)
241 | smpl_part_labels = torch.cat([labels] * batch_sz, axis=0)
242 |
243 | th_scan_meshes, centers = [], []
244 | for scan in scans:
245 | print('scan path ...', scan)
246 | temp = Mesh(filename=scan)
247 | th_scan = tm.from_tensors(torch.tensor(temp.v.astype('float32'), requires_grad=False, device=DEVICE),
248 | torch.tensor(temp.f.astype('int32'), requires_grad=False, device=DEVICE).long())
249 | th_scan_meshes.append(th_scan)
250 |
251 | if scale_file is not None:
252 | for n, sc in enumerate(scale_file):
253 | dat = np.load(sc, allow_pickle=True)
254 | th_scan_meshes[n].vertices += torch.tensor(dat[1]).to(DEVICE)
255 | th_scan_meshes[n].vertices *= torch.tensor(dat[0]).to(DEVICE)
256 |
257 | # Optimize pose first
258 | optimize_pose_only(th_scan_meshes, smpl, pose_iterations, pose_steps_per_iter, scan_part_labels, smpl_part_labels,
259 | display=None if display is None else 0)
260 |
261 | # Optimize pose and shape
262 | optimize_pose_shape(th_scan_meshes, smpl, iterations, steps_per_iter, scan_part_labels, smpl_part_labels,
263 | display=None if display is None else 0)
264 |
265 | verts, _, _, _ = smpl()
266 | th_smpl_meshes = [tm.from_tensors(vertices=v, faces=smpl.faces) for v in verts]
267 |
268 | if save_path is not None:
269 | if not exists(save_path):
270 | os.makedirs(save_path)
271 |
272 | names = [split(s)[1] for s in scans]
273 |
274 | # Save meshes
275 | save_meshes(th_smpl_meshes, [join(save_path, n.replace('.ply', '_smpl.obj')) for n in names])
276 | save_meshes(th_scan_meshes, [join(save_path, n) for n in names])
277 |
278 | # Save params
279 | for p, b, t, n in zip(smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(),
280 | smpl.trans.cpu().detach().numpy(), names):
281 | smpl_dict = {'pose': p, 'betas': b, 'trans': t}
282 | pkl.dump(smpl_dict, open(join(save_path, n.replace('.ply', '_smpl.pkl')), 'wb'))
283 |
284 | return smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(), smpl.trans.cpu().detach().numpy()
285 |
286 |
287 | def fit_SMPLD(scans, smpl_pkl, gender='male', save_path=None, scale_file=None):
288 | # Get SMPL faces
289 | sp = SmplPaths(gender=gender)
290 | smpl_faces = sp.get_faces()
291 | th_faces = torch.tensor(smpl_faces.astype('float32'), dtype=torch.long).cuda()
292 |
293 | # Batch size
294 | batch_sz = len(scans)
295 |
296 | # Init SMPL
297 | pose, betas, trans = [], [], []
298 | for spkl in smpl_pkl:
299 | smpl_dict = pkl.load(open(spkl, 'rb'))
300 | p, b, t = smpl_dict['pose'], smpl_dict['betas'], smpl_dict['trans']
301 | pose.append(p)
302 | if len(b) == 10:
303 | temp = np.zeros((300,))
304 | temp[:10] = b
305 | b = temp.astype('float32')
306 | betas.append(b)
307 | trans.append(t)
308 | pose, betas, trans = np.array(pose), np.array(betas), np.array(trans)
309 |
310 | betas, pose, trans = torch.tensor(betas), torch.tensor(pose), torch.tensor(trans)
311 | smpl = th_batch_SMPL(batch_sz, betas, pose, trans, faces=th_faces).cuda()
312 |
313 | verts, _, _, _ = smpl()
314 | init_smpl_meshes = [tm.from_tensors(vertices=v.clone().detach(),
315 | faces=smpl.faces) for v in verts]
316 |
317 | # Load scans
318 | th_scan_meshes = []
319 | for scan in scans:
320 | print('scan path ...', scan)
321 | temp = Mesh(filename=scan)
322 | th_scan = tm.from_tensors(torch.tensor(temp.v.astype('float32'), requires_grad=False, device=DEVICE),
323 | torch.tensor(temp.f.astype('int32'), requires_grad=False, device=DEVICE).long())
324 | th_scan_meshes.append(th_scan)
325 |
326 | if scale_file is not None:
327 | for n, sc in enumerate(scale_file):
328 | dat = np.load(sc, allow_pickle=True)
329 | th_scan_meshes[n].vertices += torch.tensor(dat[1]).to(DEVICE)
330 | th_scan_meshes[n].vertices *= torch.tensor(dat[0]).to(DEVICE)
331 |
332 | # Optimize
333 | optimize_offsets(th_scan_meshes, smpl, init_smpl_meshes, 5, 10)
334 | print('Done')
335 |
336 | verts, _, _, _ = smpl()
337 | th_smpl_meshes = [tm.from_tensors(vertices=v,
338 | faces=smpl.faces) for v in verts]
339 |
340 | if save_path is not None:
341 | if not exists(save_path):
342 | os.makedirs(save_path)
343 |
344 | names = [split(s)[1] for s in scans]
345 |
346 | # Save meshes
347 | save_meshes(th_smpl_meshes, [join(save_path, n.replace('.ply', '_smpld.obj')) for n in names])
348 | save_meshes(th_scan_meshes, [join(save_path, n) for n in names])
349 | # Save params
350 | for p, b, t, d, n in zip(smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(),
351 | smpl.trans.cpu().detach().numpy(), smpl.offsets.cpu().detach().numpy(), names):
352 | smpl_dict = {'pose': p, 'betas': b, 'trans': t, 'offsets': d}
353 | pkl.dump(smpl_dict, open(join(save_path, n.replace('.ply', '_smpld.pkl')), 'wb'))
354 |
355 | return smpl.pose.cpu().detach().numpy(), smpl.betas.cpu().detach().numpy(), \
356 | smpl.trans.cpu().detach().numpy(), smpl.offsets.cpu().detach().numpy()
357 |
358 | DEVICE = 'cuda'
359 | if __name__ == "__main__":
360 | import argparse
361 |
362 | parser = argparse.ArgumentParser(description='Run Model')
363 | parser.add_argument('inner_path', type=str) # predicted by IPNet
364 | parser.add_argument('outer_path', type=str) # predicted by IPNet
365 | parser.add_argument('inner_labels', type=str) # predicted by IPNet
366 | parser.add_argument('scale_file', type=str, default=None) # obtained from utils/process_scan.py
367 | parser.add_argument('save_path', type=str)
368 | parser.add_argument('-gender', type=str, default='male') # can be female/ male/ neutral
369 | parser.add_argument('--display', default=None)
370 | args = parser.parse_args()
371 |
372 | # args = lambda: None
373 | # args.inner_path = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data/body.ply'
374 | # args.outer_path = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data/full.ply'
375 | # args.inner_labels = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data/parts.npy'
376 | # args.scale_file = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data/cent.npy'
377 | # args.display = None
378 | # args.save_path = '/BS/bharat-3/work/IPNet/DO_NOT_RELEASE/test_data'
379 | # args.gender = 'male'
380 |
381 | _, _, _ = fit_SMPL([args.inner_path], scan_labels=[args.inner_labels], display=args.display, save_path=args.save_path,
382 | scale_file=[args.scale_file], gender=args.gender)
383 |
384 | names = [split(s)[1] for s in [args.inner_path]]
385 | smpl_pkl = [join(args.save_path, n.replace('.ply', '_smpl.pkl')) for n in names]
386 |
387 | _, _, _, _ = fit_SMPLD([args.outer_path], smpl_pkl=smpl_pkl, save_path=args.save_path,
388 | scale_file=[args.scale_file], gender=args.gender)
389 |
--------------------------------------------------------------------------------
/input/decaprio/decaprio.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/input/decaprio/decaprio.jpg
--------------------------------------------------------------------------------
/input/decaprio/decaprio_rect.txt:
--------------------------------------------------------------------------------
1 | -552 -62 1606 1606
2 |
--------------------------------------------------------------------------------
/input/suriya/IMG_3392.2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/input/suriya/IMG_3392.2.jpg
--------------------------------------------------------------------------------
/input/suriya/IMG_3392.2_rect.txt:
--------------------------------------------------------------------------------
1 | -944 -38 3542 3542
2 |
--------------------------------------------------------------------------------
/input/test/test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/input/test/test.png
--------------------------------------------------------------------------------
/input/test/test_keypoints.json:
--------------------------------------------------------------------------------
1 | {"version":1.3,"people":[{"person_id":[-1],"pose_keypoints_2d":[251.14,70.0905,0.920212,249.729,121.622,0.848532,205.176,121.648,0.783397,185.738,191.227,0.800347,216.332,199.615,0.829802,294.238,120.247,0.805623,306.9,189.876,0.865557,324.944,223.301,0.823568,251.178,263.668,0.671555,226.047,265.073,0.633188,227.432,370.844,0.798983,234.42,466.968,0.718138,281.782,262.271,0.647396,295.743,372.224,0.780934,316.553,472.555,0.721108,244.17,60.3191,0.876,260.855,60.3366,0.937398,230.252,60.3082,0.947452,271.992,60.2974,0.922649,354.182,494.776,0.658449,356.96,489.211,0.639241,306.767,485.045,0.680462,226.043,483.654,0.614895,216.363,480.89,0.687368,240.024,476.682,0.642223],"face_keypoints_2d":[],"hand_left_keypoints_2d":[],"hand_right_keypoints_2d":[],"pose_keypoints_3d":[],"face_keypoints_3d":[],"hand_left_keypoints_3d":[],"hand_right_keypoints_3d":[]},{"person_id":[-1],"pose_keypoints_2d":[395.944,283.101,0.888373,396.006,306.861,0.795637,372.222,306.829,0.772225,391.774,327.698,0.713164,433.532,327.688,0.73626,427.926,308.195,0.697673,443.259,347.19,0.214575,453.021,329.12,0.340148,398.738,363.94,0.583225,382.024,365.313,0.553282,380.634,383.443,0.619834,393.159,485.078,0.648966,418.185,363.89,0.574877,444.662,383.37,0.644425,462.8,473.927,0.765089,390.345,273.432,0.869964,405.621,273.465,0.888317,375.097,274.783,0.786201,418.156,277.609,0.699742,490.6,494.799,0.54446,494.758,487.844,0.580562,457.186,485.025,0.63643,395.953,496.228,0.254274,384.825,496.225,0.320764,394.565,492.017,0.421362],"face_keypoints_2d":[],"hand_left_keypoints_2d":[],"hand_right_keypoints_2d":[],"pose_keypoints_3d":[],"face_keypoints_3d":[],"hand_left_keypoints_3d":[],"hand_right_keypoints_3d":[]},{"person_id":[-1],"pose_keypoints_2d":[327.693,280.348,0.776371,324.912,298.466,0.448569,304.025,304.022,0.334807,0,0,0,0,0,0,348.576,295.664,0.665439,362.57,327.695,0.453743,352.798,356.962,0.209829,327.75,363.9,0.300198,312.373,365.326,0.227978,0,0,0,0,0,0,344.42,362.509,0.296135,369.462,376.432,0.0696449,0,0,0,319.326,273.359,0.772246,333.253,273.349,0.796905,308.194,276.19,0.243569,341.642,274.786,0.390684,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"face_keypoints_2d":[],"hand_left_keypoints_2d":[],"hand_right_keypoints_2d":[],"pose_keypoints_3d":[],"face_keypoints_3d":[],"hand_left_keypoints_3d":[],"hand_right_keypoints_3d":[]}]}
--------------------------------------------------------------------------------
/instruction.txt:
--------------------------------------------------------------------------------
1 | #create a conda environment
2 | conda create -n 3dAvatarPipeline python=3.7
3 | #depending on the cuda version (check - nvcc --version)
4 | conda install pytorch torchvision torchaudio cudatoolkit=10.1 -c pytorch
5 |
6 | #Requirements for PIFuHD
7 | Pillow # PIL
8 | scikit-image #skimage
9 | tqdm
10 | opencv-python # cv2
11 |
12 | #For visualization
13 | trimesh
14 | PyOpenGL
15 | ffmpeg
16 | freeglut (use sudo apt-get install freeglut3-dev for ubuntu users)
17 |
18 | #Download pre-trained model
19 | sh ./scripts/download_trained_model.sh
20 |
21 | #-------------------------------------------------------------------------------
22 | #Requirements for IPNet
23 | ipdb
24 | chumpy
25 | smplpytorch
26 |
27 | cd IPNet
28 | #Install kaolin
29 | git clone --recursive https://github.com/NVIDIAGameWorks/kaolin
30 | cd kaolin
31 | git checkout v0.1 #checkout to v0.1
32 | python setup.py develop
33 | cd ..
34 |
35 | #Install MPI mesh library
36 | cd mesh
37 | sudo apt-get install libboost-dev #install boost library
38 | git clone https://github.com/MPI-IS/mesh.git
39 | BOOST_INCLUDE_DIRS=/path/to/boost/include make all #use command `whereis boost` to locate path, generally in /usr/include/boost
40 | make tests #check if installed correctly, might need to reinstall PyOpenGL if you face any errors here
41 | cd ..
42 | cd ..
43 |
44 | #Download SMPL models
45 | Create account here and accept license and download SMPL models - https://smpl.is.tue.mpg.de/
46 |
47 | #Download checkpoints
48 | Download IPNet weights: https://datasets.d2.mpi-inf.mpg.de/IPNet2020/IPNet_p5000_01_exp_id01.zip
49 | or IPNet single surface: https://nextcloud.mpi-klsb.mpg.de/index.php/s/4nomcDH8EGwbzNi
50 | mkdir /experiments
51 | Put the downloaded weights in /experiments/
52 |
53 | #-------------------------------------------------------------------------------
54 | #Download animations from AIST++ or AMASS and extract each frame pose parameters to .npz files
55 | Download dance animations from AIST++ here https://google.github.io/aistplusplus_dataset/download.html and extract poses for each frame to a file
56 |
--------------------------------------------------------------------------------
/preprocess_img_pose.py:
--------------------------------------------------------------------------------
1 | '''cropping image and pose esimation before entering PIFuHD'''
2 |
3 | import torch
4 | import cv2
5 | import numpy as np
6 | from os import path
7 | import sys
8 | sys.path.append(path.abspath('./lightweight-human-pose-estimation.pytorch'))
9 | from models.with_mobilenet import PoseEstimationWithMobileNet
10 | from modules.keypoints import extract_keypoints, group_keypoints
11 | from modules.load_state import load_state
12 | from modules.pose import Pose, track_poses
13 | import demo
14 | import sys
15 |
16 | def get_rect(net, images, height_size):
17 | net = net.eval()
18 |
19 | stride = 8
20 | upsample_ratio = 4
21 | num_keypoints = Pose.num_kpts
22 | previous_poses = []
23 | delay = 33
24 | for image in images:
25 | print("image:"+image)
26 | rect_path = image.replace('.%s' % (image.split('.')[-1]), '_rect.txt')
27 | #print("rect_path"+rect_path)
28 | img = cv2.imread(image, cv2.IMREAD_COLOR)
29 | orig_img = img.copy()
30 | orig_img = img.copy()
31 | heatmaps, pafs, scale, pad = demo.infer_fast(net, img, height_size, stride, upsample_ratio, cpu=True)
32 |
33 | total_keypoints_num = 0
34 | all_keypoints_by_type = []
35 | for kpt_idx in range(num_keypoints): # 19th for bg
36 | total_keypoints_num += extract_keypoints(heatmaps[:, :, kpt_idx], all_keypoints_by_type, total_keypoints_num)
37 |
38 | pose_entries, all_keypoints = group_keypoints(all_keypoints_by_type, pafs)
39 | for kpt_id in range(all_keypoints.shape[0]):
40 | all_keypoints[kpt_id, 0] = (all_keypoints[kpt_id, 0] * stride / upsample_ratio - pad[1]) / scale
41 | all_keypoints[kpt_id, 1] = (all_keypoints[kpt_id, 1] * stride / upsample_ratio - pad[0]) / scale
42 | current_poses = []
43 |
44 | rects = []
45 | for n in range(len(pose_entries)):
46 | if len(pose_entries[n]) == 0:
47 | continue
48 | pose_keypoints = np.ones((num_keypoints, 2), dtype=np.int32) * -1
49 | valid_keypoints = []
50 | for kpt_id in range(num_keypoints):
51 | if pose_entries[n][kpt_id] != -1.0: # keypoint was found
52 | pose_keypoints[kpt_id, 0] = int(all_keypoints[int(pose_entries[n][kpt_id]), 0])
53 | pose_keypoints[kpt_id, 1] = int(all_keypoints[int(pose_entries[n][kpt_id]), 1])
54 | valid_keypoints.append([pose_keypoints[kpt_id, 0], pose_keypoints[kpt_id, 1]])
55 | valid_keypoints = np.array(valid_keypoints)
56 |
57 | if pose_entries[n][10] != -1.0 or pose_entries[n][13] != -1.0:
58 | pmin = valid_keypoints.min(0)
59 | pmax = valid_keypoints.max(0)
60 |
61 | center = (0.5 * (pmax[:2] + pmin[:2])).astype(int)
62 | radius = int(0.65 * max(pmax[0]-pmin[0], pmax[1]-pmin[1]))
63 | elif pose_entries[n][10] == -1.0 and pose_entries[n][13] == -1.0 and pose_entries[n][8] != -1.0 and pose_entries[n][11] != -1.0:
64 | # if leg is missing, use pelvis to get cropping
65 | center = (0.5 * (pose_keypoints[8] + pose_keypoints[11])).astype(np.int)
66 | radius = int(1.45*np.sqrt(((center[None,:] - valid_keypoints)**2).sum(1)).max(0))
67 | center[1] += int(0.05*radius)
68 | else:
69 | center = np.array([img.shape[1]//2,img.shape[0]//2])
70 | radius = max(img.shape[1]//2,img.shape[0]//2)
71 |
72 | x1 = center[0] - radius
73 | y1 = center[1] - radius
74 |
75 | rects.append([x1, y1, 2*radius, 2*radius])
76 |
77 | np.savetxt(rect_path, np.array(rects), fmt='%d')
78 |
79 | net = PoseEstimationWithMobileNet()
80 | checkpoint = torch.load('./checkpoints/checkpoint_iter_370000.pth', map_location='cpu')
81 | load_state(net, checkpoint)
82 |
83 | #image_path = './pifuhd/sample_images/%s' % filename
84 | image_path = str(sys.argv[1])
85 | #print("Input Image:"+str(image_path))
86 | get_rect(net, [image_path], 512)
87 |
--------------------------------------------------------------------------------
/run_imageimate.sh:
--------------------------------------------------------------------------------
1 | #todo: add preprocess image
2 |
3 | #run PIFUHD
4 | #Change CUDA to 'cpu' to fit pifuHD model pifuHd.apps.recon.py file line 145
5 | #add save plain mesh to recon.py
6 | python -m pifuhd.apps.simple_test -i=./input/test/ -o=./results/test -c=./checkpoints/pifuhd.pt
7 |
8 | #pre-process IPNet
9 | #make import changes to smpl_layer.py
10 | #make import changes to tensutils.py
11 | #download smpl models from here https://smpl.is.tue.mpg.de/ and put it in folder - smpl_models folder
12 | #make changes to getFaces() in smpl_paths.py
13 | #make import changes to serialization.py
14 | #change th_smpl_prior.py precomputed=True
15 | #change model path in th_smpl.py
16 | #copy fit_smpl.py, fit_SMPLD.py, animations_IPNet.py into the root of IPNet
17 | python fit_SMPL.py -scan_path=../results/test/pifuhd_final/recon/result_test_512.obj -save_path=../results/test/ipnet_results #SPML registration
18 | python fit_SMPLD.py ../results/test/pifuhd_final/recon/result_test_512.obj ../results/test/ipnet_results #SMPLD registration
19 |
20 | #run IPNet - sometimes the SMPL+D registration is better for lower epochs. It recalculated SMPL+D and optimizes with IPNet values
21 | python test_IPNet.py ../results/test/pifuhd_final/recon/result_test_512.obj experiments/IPNet_p5000_01_exp_id01/checkpoints/checkpoint_epoch_249.tar ../results/test/ipnet_results -m IPNet -batch_points=10000
22 | python fit_SMPL_IPNet.py ../results/test/ipnet_results/body.ply ../results/test/ipnet_results/full.ply ../results/test/ipnet_results/parts.npy ../results/test/ipnet_results/cent.npy ../results/test/ipnet_results/
23 |
24 | #run animations given SMPL+Motion Capture = Calculates SMPL+D each frame
25 | python animations_IPNet.py ../results/test/pifuhd_final/recon/result_test_512.obj ../results/test/test_animations/ ../Anim_Seqs/seqs/ -smpl_pkl=../results/test/ipnet_results/result_test_512_smpl.pkl
26 | #convert meshes to fbx animations using Blender Addon - https://github.com/neverhood311/Stop-motion-OBJ
27 |
--------------------------------------------------------------------------------
/screenshots/00input_image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/screenshots/00input_image.jpg
--------------------------------------------------------------------------------
/screenshots/01pifuhd_mesh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/screenshots/01pifuhd_mesh.png
--------------------------------------------------------------------------------
/screenshots/03pifuhd_to_ipnet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/screenshots/03pifuhd_to_ipnet.png
--------------------------------------------------------------------------------
/screenshots/IMG_3392.2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/screenshots/IMG_3392.2.jpg
--------------------------------------------------------------------------------
/screenshots/SMPLd_Fit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/screenshots/SMPLd_Fit.png
--------------------------------------------------------------------------------
/screenshots/pifu_to_ipnet_suriya.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/screenshots/pifu_to_ipnet_suriya.png
--------------------------------------------------------------------------------
/screenshots/pifuhd_meshes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/screenshots/pifuhd_meshes.png
--------------------------------------------------------------------------------
/screenshots/suriya-fbx-2021-08-04-221707.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codesavory/IMAGEimate/6af41495c2254c851a26cfea3a3f9f2babc2e447/screenshots/suriya-fbx-2021-08-04-221707.gif
--------------------------------------------------------------------------------
/test_IPNet.py:
--------------------------------------------------------------------------------
1 | """
2 | Code to test IPNet with a pointcloud as input. To run IPNet on entire dataset see generate.py
3 | Author: Bharat
4 | Cite: Combining Implicit Function Learning and Parametric Models for 3D Human Reconstruction, ECCV 2020.
5 | """
6 |
7 | import torch
8 | import models.local_model_body_full as model
9 | import numpy as np
10 | import argparse
11 | from utils.preprocess_scan import func
12 | from utils.voxelized_pointcloud_sampling import voxelize
13 | from models.generator import GeneratorIPNet, GeneratorIPNetMano, Generator
14 | import trimesh
15 | import os
16 | from os.path import join, split, exists
17 | from utils.preprocess_scan import SCALE, new_cent
18 |
19 |
20 | def pc2vox(pc, res):
21 | """Convert PC to voxels for IPNet"""
22 | # preprocess the pointcloud
23 | pc, scale, cent = func(pc)
24 | vox = voxelize(pc, res)
25 | return vox, scale, cent
26 |
27 |
28 | def main(args):
29 | # Load PC
30 | pc = trimesh.load(args.pc)
31 | pc_vox, scale, cent = pc2vox(pc.vertices, args.res)
32 | pc_vox = np.reshape(pc_vox, (args.res,) * 3).astype('float32')
33 |
34 | print("Batch Points", args.batch_points)
35 | # save scale file
36 | from utils.preprocess_scan import SCALE, new_cent
37 | print("args.out_path", args.out_path)
38 | np.save(join(args.out_path, 'cent.npy'), [scale / SCALE, (cent - new_cent)])
39 | print("created cent.npy")
40 | np.warnings.filterwarnings('error', category=np.VisibleDeprecationWarning)
41 | # Load network
42 | if args.model == 'IPNet':
43 | print("IPNET LOADER")
44 | net = model.IPNet(hidden_dim=args.decoder_hidden_dim, num_parts=14)
45 | print("Created Net")
46 | gen = GeneratorIPNet(net, 0.5, exp_name=None, resolution=args.retrieval_res,
47 | batch_points=args.batch_points)
48 | print("Created Generator")
49 | elif args.model == 'IPNetMano':
50 | net = model.IPNetMano(hidden_dim=args.decoder_hidden_dim, num_parts=7)
51 | gen = GeneratorIPNetMano(net, 0.5, exp_name=None, resolution=args.retrieval_res,
52 | batch_points=args.batch_points)
53 | elif args.model == 'IPNetSingleSurface':
54 | net = model.IPNetSingleSurface(hidden_dim=args.decoder_hidden_dim, num_parts=14)
55 | gen = Generator(net, 0.5, exp_name=None, resolution=args.retrieval_res,
56 | batch_points=args.batch_points)
57 | else:
58 | print('Wow watch where u goin\' with that model')
59 | exit()
60 |
61 | # Load weights
62 | print('Loading weights from,', args.weights)
63 | checkpoint_ = torch.load(args.weights)
64 | net.load_state_dict(checkpoint_['model_state_dict'])
65 |
66 | # Run IPNet and Save
67 | if not os.path.exists(args.out_path):
68 | os.makedirs(args.out_path)
69 |
70 | data = {'inputs': torch.tensor(pc_vox[np.newaxis])} # add a batch dimension
71 | if args.model == 'IPNet':
72 | full, body, parts = gen.generate_meshs_all_parts(data)
73 | body.set_vertex_colors_from_weights(parts)
74 | body.write_ply(args.out_path + '/body.ply')
75 | np.save(args.out_path + '/parts.npy', parts)
76 |
77 | elif args.model == 'IPNetMano':
78 | full, parts = gen.generate_meshs_all_parts(data)
79 | np.save(args.out_path + '/parts.npy', parts)
80 |
81 | elif args.model == 'IPNetSingleSurface':
82 | full = gen.generate_mesh_all(data)
83 |
84 | full.write_ply(args.out_path + '/full.ply')
85 |
86 |
87 | if __name__ == "__main__":
88 | parser = argparse.ArgumentParser(description='Run Model')
89 | # Path to PC mesh
90 | parser.add_argument('pc', type=str)
91 | # path to pretrained weights
92 | parser.add_argument('weights', type=str)
93 | # path to save result
94 | parser.add_argument('out_path', type=str)
95 | # the resolution of the input
96 | parser.add_argument('-res', default=128, type=int)
97 | # keep this fixed
98 | parser.add_argument('-h_dim', '--decoder_hidden_dim', default=256, type=int)
99 | # number of points queried for to produce the result
100 | parser.add_argument('-retrieval_res', default=256, type=int)
101 | # number of points from the querey grid which are put into the batch at once
102 | parser.add_argument('-batch_points', default=300000, type=int)
103 | # which model to use, e.g. "-m IPNet"
104 | parser.add_argument('-m', '--model', default='IPNetSingleSurface', type=str)
105 | args = parser.parse_args()
106 |
107 | # args = lambda: None
108 | # args.pc = 'assets/scan.obj'
109 | # args.weights = 'experiments/IPNet_p5000_01_exp_id01/checkpoints/checkpoint_epoch_249.tar'
110 | # args.out_path = 'DO_NOT_RELEASE/test_data'
111 | # args.res = 128
112 | # args.decoder_hidden_dim = 256
113 | # args.retrieval_res = 256
114 | # args.batch_points = 250000
115 | # args.model = 'IPNet'
116 |
117 | main(args)
118 |
119 |
120 | """
121 | python test_IPNet.py -m IPNetSingleSurface
122 | """
123 |
--------------------------------------------------------------------------------