yerfor / GeneFace

GeneFace: Generalized and High-Fidelity 3D Talking Face Synthesis; ICLR 2023; Official code
MIT License
2.51k stars 295 forks source link

头部忽大忽小 #101

Open Gpwner opened 1 year ago

Gpwner commented 1 year ago

最近对这个项目做了好几次实验,但还是没法解决 头部忽大忽小的问题,无论是作者给出的效果视频还是我自己素材的效果,比如这个视频https://github.com/yerfor/GeneFace/blob/main/assets/zozo_radnerf_torso_smo.mp4 中第6s开始更为明显。将所有的推理帧替换为第一帧的3D landmark,发现这个问题有所缓解,所以我的结论是3D landmark抖动导致的。但目前找不到什么好方法解决,不知道大佬有没有啥妙招

Gpwner commented 1 year ago

以防我没有描述清楚,忽大忽小也可以理解为频繁且快速拿着相机靠近、远离、靠近、远离...而得到的结果

Gpwner commented 1 year ago

我尝试将May输入3D人脸重建模块的test.py(先检测5个人脸关键点),得到的可视化结果有更明显的忽大忽小效果。不知这里是不是这个问题的根源?

yerfor commented 1 year ago

你好,感谢你的指出!这个问题我们最近也发现了,也是定位在动作表征上面。

目前猜测是因为3DMM的预测是由神经网络得出的,所以会有抖动。而我们的audio2motion是以这个预测的3DMM作为训练样本的,因此训练出来的模型预测的3D landmark也会有这种抖动感。目前这个问题难以很快解决,等我们找到合适的根治方法,会第一时间在这里更新代码。

权宜之计是你可以把嘴唇以外的部位做smooth,应该可以部分缓解这个问题。

Gpwner commented 1 year ago

有尝试做过各种smooth(包括你说的),但改观并不明显

Gpwner commented 1 year ago

有可能将现有3DMM替换为https://github.com/LizhenWangT/FaceVerse 吗?我看它在做视频追踪的效果看起来比现有的好

yerfor commented 1 year ago

理论上是可以的,3dmm和这个faceverse本质上讲都是基于统计模型的动作表征。不过你可能需要自己实现一下提取这个特征的代码。

Gpwner commented 1 year ago

还是很期待大佬的解决办法,这方面是我是弱鸡,有很多猜想待验证。

Gpwner commented 1 year ago

Hi,我这里找到一个规避3DMM处理中间结果忽大忽小的办法,即固定这里的t、s为第一帧的计算结果:https://github.com/yerfor/GeneFace/blob/24c76fcb109b2c3f6dd6490826f2fdd772bbd9a0/deep_3drecon/util/preprocess.py#L191

这样当将单人训练视频输入https://github.com/yerfor/GeneFace/blob/main/deep_3drecon/test.py 得到的结果不会忽大忽小,效果非常稳定。

最终结果看起来似乎有所缓解,但是还是没有很明显的缓解,不知道是不是LRS3没有做相同处理导致最终效果不理想导致呢? 我这里没有LRS3数据集,因此也没办法验证这个。不知你是否有时间验证一下呢?感谢

yerfor commented 1 year ago

很感谢你的发现,lrs3原始数据集就是根据人脸的bounding box截取的,所以原始视频就会有脸部忽大忽小的问题。我会在本周尝试重新处理一下数据,采用一个静止相机的数据集(th1kh)训练模型。如果效果理想的话我会第一时间更新audio2motion模型和代码。

再次感谢你的建议!

yerfor commented 1 year ago

你好,根据我们的测试,发现虽然指定align_img的crop原图像的bbox框可以增加提取的3DMM参数和pose的稳定性,但是会严重影响重建的mesh的精度,尤其是嘴形和眨眼的细节几乎都丢失了。因此你提到的固定bbox为第一帧的方案可能不可行。

我们之后会尝试一下更平滑的3DMM提取器,比如这个[仓库](https://github.com/Zielon/metrical-tracker)

Gpwner commented 1 year ago

期待!Geneface唇音同步程度很高,要是能把这个问题解决了,那就更上一层楼了。

Gpwner commented 1 year ago

请问有什么进展吗?使用更加平滑的3DMM之后忽大忽小的问题是否有所缓解呢?

yerfor commented 1 year ago

https://user-images.githubusercontent.com/48365204/233900445-682bd6d7-7e43-459e-a032-9eebb04d00f0.mp4

你觉得这个如何?

Gpwner commented 1 year ago

这个是使用上边提及的(https://github.com/Zielon/metrical-tracker)的效果么, 看起来有所缓解,但似乎没有根治,估计用头部相对静止的素材来训练能更明显地看出差异? 可以将这个视频对应的代码、预训练模型作为一个新分支上传github吗,感谢

yerfor commented 1 year ago

可以的,这个比较稳定的版本是我们近期的一个大更新,使用的还是3DMM。我最近在完成论文的书写,会尽快完成代码整理和上传。

Gpwner commented 1 year ago

请问是更平滑的3DMM提取器效果不好,还是因为其他什么原因所以还使用之前的3DMM呢 ?

yerfor commented 1 year ago

单纯是因为最近比较忙,还没有来得及尝试其他的3DMM提取器~之后有空时会尝试一下的哈哈哈!

Gpwner commented 1 year ago

如果我自己要尝试使用新的3DMM提取器的话,推荐使用什么数据集训练audio2motion呢,LRS3没法下载,LRS2很小大概率效果不好;使用新的3DMM提取器在代码层面上有哪些需要改的呢?

针对上边的问题,可以给些建议吗,感谢。

yerfor commented 1 year ago

推荐可以使用LRS2的trainval set(30小时左右)作为toy dataset,我试过效果还是准的,只是val loss上升得会比较快。我现在内部使用的是清洗过的TH1KH(大约180小时)。

在代码层面需要修改的不多,你只要写一个类似deep_3drecon)/reconstructor.py的接口类调用对应的3DMM提取器就好了。

web3aivc commented 1 year ago

感谢你们提供相对完整的方案。请问下你们使用TH1KH训练的模型会重新公布么?有没有使用新的3DMM提取器,头像晃动的问题有没有解决?

Gpwner commented 1 year ago

Hi,原始代码中https://github.com/yerfor/GeneFace/blob/main/tasks/audio2motion/dataset_utils/lrs3_dataset.py#L210

  coeff = raw_item['coeff'] # [T_y ~= T_x//2, c=257]
  exp = coeff[:, 80:144] 
  item['exp'] = torch.from_numpy(exp).float() # [T_y, c=64]
  translation = coeff[:, 254:257] # [T_y, c=3]
  angles = euler2quaterion(coeff[:, 224:227]) # # [T_y, c=4]
  pose = np.concatenate([translation, angles], axis=1)
  item['pose'] = torch.from_numpy(pose).float() # [T_y, c=4+3]

  # Load identity for landmark construction
  item['identity'] = torch.from_numpy(raw_item['coeff'][..., :80]).float()

会从3DMM中提取出的系数提取出exp、translation、angles、identify等参数,而https://github.com/Zielon/metrical-tracker 似乎没有对应的参数,这里应该怎么对接上呢?

yerfor commented 1 year ago

你好,exp、identity的本质是canonical空间的人脸mesh,pose对应的则是人脸的姿态。你可以看看提取的特征里有没有pose、landmark相关的信息。如果有的话说明这个提取器可以使用。

Gpwner commented 1 year ago

大佬,我在训练syncnet的时候这里出错了:https://github.com/yerfor/GeneFace/blob/main/tasks/syncnet/lm3d_syncnet.py#LL80C35-L80C35

1、这块代码的意思是不是说每一个视频随机选取5帧拿来训练?

2、因为我使用的是LRS2数据集,可能有些视频少于5帧了,加入一下代码才能正常训练:

if y_len[i]-1-5 < 0:
    continue
Gpwner commented 1 year ago

我这边尝试将3DMM替换成了FaceVerse,并在LRS2重训练了4个模型,但是这个忽大忽小的现象并没有缓解。

MoroseYu commented 1 year ago

可以的,这个比较稳定的版本是我们近期的一个大更新,使用的还是3DMM。 我最近在完成论文的书写,会尽快完成代码整理和上传。

現在已經更新了嗎?很期待。

wzr0108 commented 1 year ago

我尝试将May输入3D人脸重建模块的test.py(先检测5个人脸关键点),得到的可视化结果有更明显的忽大忽小效果。不知这里是不是这个问题的根源?

请问可视化怎么做?是运行deep_3drecon/test.py 吗,参数怎么写呢?

xiao-keeplearning commented 1 year ago

请问最近有什么进展么,我看geneface++还是有这个问题,基本没有缓解

yuanjunchai commented 1 year ago

作者有尝试过用其他高质量数据集么?(比如HDTF, avspeech)高质量的数据集是训练出好效果的关键吧。