论文地址:Implementation of https://arxiv.org/abs/1912.13457
参考大佬复现代码:
- https://github.com/taotaonice/FaceShifter
- https://github.com/Heonozis/FaceShifter-pytorch
由于论文原文没有给出代码,代码1应该算是原创。我在上面的基础上将原来模型处理256x256像素的图像改为128x128。
amp混合精度训练
暂且不说NVIDIA官方出这个包安装的坑,混合精度训练确实不是我等小白能够轻易驾驭的,模型训练的时候由于loss下溢,加上GAN本来就不好训练,后面loss就nan了。最后还是改成原生的训练了,个人感觉训练速度并没有太大变化,可能因为我没有装CPP扩展的原因。
复现效果仍然不佳
训练过程中发现换脸生成的图像分辨率始终不如原图像好,这只是小事。论文中使用的loss函数需要手动确定比例这是最坑的,按照原文的比例训练出来的换脸几乎没有效果。提高L_id后要么可能产生各种鬼脸,要么生成图形存在噪声,要么不真实。
我没有在数据集上下太大功夫,只用了celeba。这可能是导致我训练结果不理想的一大原因。
训练过程图像(用第一排的人脸,第二排的属性,生成第三排的图像):
上面的训练出来的模型实际泛化效果:
这个效果和opencv官方出的传统换脸方案可差远了。
一点建议
不要对模型泛化效果有什么期待,最好还是拿应用的目标人脸相似的数据集来实际操作吧。