zhanglonghao1992 / One-Shot_Free-View_Neural_Talking_Head_Synthesis

Pytorch implementation of paper "One-Shot Free-View Neural Talking-Head Synthesis for Video Conferencing"
Other
735 stars 141 forks source link

使用预训练模型推断时发现的一些问题 #43

Closed Honlan closed 2 years ago

Honlan commented 2 years ago

你好,首先非常感谢你的开源代码和预训练模型,在使用vox-256-new(https://www.mediafire.com/folder/fcvtkn21j57bb/TalkingHead_Update)进行推断时,遇到了一些问题,和预期不一致,因此想请教一下。

如下图所示,我尝试输出驱动过程中的一些中间结果,希望能得到原论文Fig.4中的效果,重建图和最终的结果图都符合预期,但是中间结果看起来很奇怪。

image

另外,我尝试编辑translation中的t,也就是对kp_source['value']中的x、y、z分别添加一定的偏移量,如下图所示,x、y的结果是符合预期的,分别对应左右和上下的translation,但是z对应的结果很奇怪,预期的应该是z对应类似远近的概念。

image

最后尝试编辑yaw(±45°)、pitch(±20°)、roll(±20°),yaw和roll的效果很好,但是pitch的效果略差一些,不知是否与上面z的奇怪现象有关。

image

我之前也尝试过复现这篇论文,但是也遇到了和以上类似的问题,除此之外还有一个问题就是occlusion map全部为1,这一点也很奇怪,希望能够一起讨论。

zhanglonghao1992 commented 2 years ago

@Honlan 蛮有意思的,我自己都没怎么拆开研究过rot matrix/translation/exp :)
第一幅图:rot那里是不是有点问题,怎么会从这种不成人形的状态加了translation后就变好了呢 第二幅图:z那里只看中间三个是没问题的。我理解的z所表示的“深度”跟x和y表示的w和h是不一样的,可能不能跟x和y一样比例缩放 第三幅图:pitch效果差是因为voxceleb里面缺这种head pose

Honlan commented 2 years ago

如果我在kp_canonical的基础上,加上driving的t的z,然后再rotation,那么得出的结果就是正常的,然后加translation的时候只加t的x和y

image

所以我感觉应该是对kp_driving关键点的z均值限制在0.33左右这一约束项导致的,如果不满足这一约束,渲染出来的人脸就非正常

z的含义确实很模糊,本来它就是通过channel排列得到的。x和y如果在左右或者上下的方向上出界了,直觉上无非是渲染出来的脸部有一部分在边界外面,但是从前后的角度看上去依旧没问题。但是如果z加大或减少很多,就有一部分关键点在前后方向上出界了,从正面来看就像是把head切开了一点,看到了内部 = =

但是如果z不代表深度方向上的位移,基于x、y、z和欧拉角进行旋转,以及加上x、y、z方向上的translation和expression,这几项的物理意义感觉就不太合理了

如果z能代表“深度”和“远近”这一概念,那么当人脸远离我们时,应该会有人脸总大小缩小这种效应,但是目前的模型似乎表达不了这一点,也就是说缺了变换里的scaling这一项

最后我还有一点疑问,目前的变换顺序是rotation、translation、expression,但感觉同样的表情,在不同rotation下对应的expression坐标应该不一样,所以expression、rotation、translation这样的顺序似乎更合理一些

zhanglonghao1992 commented 2 years ago

@Honlan 这个图看上去就对了哈~ 你也可以按照exp,rot,tl的变换顺序训下试试 occlusion map全部为1的问题我至今也没解决,不过看上去并不会影响模型效果,我后面也没有很在意了

Honlan commented 2 years ago

@zhanglonghao1992 嗯嗯,我看到其他人也有occlusion map全部为1这种情况,而且我这边是train了几个iteration就变这样了,实在百思不得其解,但确实也不会影响到效果,先不管了。