-
Notifications
You must be signed in to change notification settings - Fork 84
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Several questions on the Neural FK. #45
Comments
how did u visualize it? which tool |
Hi @catherineytw , Thanks for the question! I think you got the wrong visualization becuase of the misunderstanding of def bones2skel(bones, bone_mean, bone_std):
unnorm_bones = bones * bone_std.unsqueeze(0) + bone_mean.repeat(bones.shape[0], 1, 1)
skel_in = torch.zeros(bones.shape[0], 17, 3).cuda()
skel_in[:, 1, 0] = -unnorm_bones[:, 0, 0]
skel_in[:, 4, 0] = unnorm_bones[:, 0, 0]
skel_in[:, 2, 1] = -unnorm_bones[:, 0, 1]
skel_in[:, 5, 1] = -unnorm_bones[:, 0, 1]
skel_in[:, 3, 1] = -unnorm_bones[:, 0, 2]
skel_in[:, 6, 1] = -unnorm_bones[:, 0, 2]
skel_in[:, 7, 1] = unnorm_bones[:, 0, 3]
skel_in[:, 8, 1] = unnorm_bones[:, 0, 4]
skel_in[:, 9, 1] = unnorm_bones[:, 0, 5]
skel_in[:, 10, 1] = unnorm_bones[:, 0, 6]
skel_in[:, 11, 0] = unnorm_bones[:, 0, 7]
skel_in[:, 12, 0] = unnorm_bones[:, 0, 8]
skel_in[:, 13, 0] = unnorm_bones[:, 0, 9]
skel_in[:, 14, 0] = -unnorm_bones[:, 0, 7]
skel_in[:, 15, 0] = -unnorm_bones[:, 0, 8]
skel_in[:, 16, 0] = -unnorm_bones[:, 0, 9]
return skel_in |
Thank you for the quick response. In addition, I am super curious about the adversarial rotation loss.
And the global trajectory reconstruction is another subject that I'm interested in. Any responses will be highly appreciated! |
I wrote a simple interface using qglviewer and rendered 3D skeletons using opengl |
Yes, you are right.
I didn't convert our prediction into world space because of some reason. In your visualization, what kind of transformation do you apply to the global rotation and global trajectory? I have my visualization script, it should align the GT very well, so I wonder if some steps are missing. |
Here is how we transform the global trajectory, you can insert it after this line and get tthe correct trajectory in your visualization.
Notice that, this a trajectory in world space, which cannot be combined with the predicted rotation in camera space. So we can only compare the trajectory itself, until we can convert our bvh rotation to world space. I didn't do that because of some technical issue in that time, now I am able to fix it but allow me some time to implement and test it. |
Thank you for the detailed explanation. Allow me to be more specific, the trajectories in the gif were in the camera space. Here is the bvh file I got by running the evaluation code (didn't change anything) using h36m_gt_t.pth, he didn't walk in circles and the motion jittered when he turned around. The trajectory validation example in your project page is perfect, but I cannot replicate it. I am really confused and trying to figure out what goes wrong. Any responses will be highly appreciated! |
@catherineytw
In this open-source code, you can easily get it by inserting the following code after L54: # Recover the trajectory with pre_proj
translation = (translations * np.repeat(pre_proj[0].cpu().numpy(), 3, axis=-1).reshape((-1, 3))) * 12
with open('./paper_figure/root_path_global/%s.rec.txt' % video_name, 'w') as f:
for index1 in range(translation.shape[0]):
f.writelines('%s %s %s\n' % (translation[index1, 0], translation[index1, 1], translation[index1, 2]))
f.close()
# Recover the trajectory with gt_proj_facters
translation = (translations * np.repeat(proj_facters[0].cpu().numpy(), 3, axis=-1).reshape((-1, 3))) * 12
with open('./paper_figure/root_path_global/%s.gt.txt' % video_name, 'w') as f:
for index1 in range(translation.shape[0]):
f.writelines('%s %s %s\n' % (translation[index1, 0], translation[index1, 1], translation[index1, 2]))
f.close() Then you can compare these two trajectories. I re-run the visualization code, and was able to get these results: Regarding the motion jittered problem, I am sorry it's hard to avoid based on the current framework. Using sparse 2d position as input will lose important information. Our prediction is per-framed, unlike VideoPose, which operates 243 inputs to predict 1, so they are expected to have stronger temporal coherence than ours. |
@catherineytw
Adversarial loss needed to be designed carefully. Even though we found it helpful in some cases, but still hard to refine the motion to a better level. We have some experiments on VIBE, which uses adversarial learning to improve human reconstruction, but it also makes a tiny improvement. Adding velocity and acceleration loss looks great. It's also what we are considering, and it works well in some motion synthesis papers like PFNN, etc. We do use temporal information as input, but the videopose architecture underperformed with our data operation, so I gave it up and changed to the current version with adaptive pooling. Bringing neural FK into the learning process is the key idea of our paper, and the current network architecture is just appliable and has big space to be improved. I am so happy to see more great ideas based on neural FK, we can talk about it more in the meeting. |
Thank you for your kindness. Is Thursday evening a good time to you? Sorry to say that I never used google meeting, if you don't mind, here is my wechat ID: Catherineytw, maybe we can have a conversation on Tecent Meeting? |
Dear authors,
Thank you for sharing the code, really nice work!
In the past few days, I've been reading your paper and studying your code carefully, and have several questions on the bone2skeleton function and the neural FK layer.
Any responses will be highly appreciated!
The text was updated successfully, but these errors were encountered: