在前一篇博客"三秒换发型"中提到几种换发型的方法,去年和今年又有不少paper推出,其中效果最好的一篇是基于BarberShop的改进,发表于ECCV 2022的"Style Your Hair: Latent Optimization for Pose-Invariant Hairstyle Transfer via Local-Style-Aware Hair Alignment",这篇文章解决了人脸pose不对齐的问题,比我之前的方案好一些。我之前的方案为了减小调整pose后带来的发型改变,采用目标脸去对齐发型脸,这样的一个结果是,目标脸部pose改变,人脸ID有些情况也会不少变化;这篇文章的方法,采用发型脸对其目标脸,后期在用融合方案将原图的脸贴回去,ID保持较完整,效果更佳,但耗时和BarberShop同样巨大。
当然,基于StyleGAN或者其他GAN的方案,目前基本都是在人脸上做文章,当把图像扩展到半身或者全身,困难就被放大许多倍。调研了相关文章,有几个思路:
1. 通过网络采用光流信息对齐人脸+对齐后的发型生成,见论文HairFIT: Pose-Invariant Hairstyle Transfer via Flow-based Hair Alignment and Semantic-Region-Aware Inpainting,作者并没有开源,这个方案的作者和Style Your Hair是同一个team,印象在Style Your Hair的论文中提到HairFIT其实并不完善,所以才又出了Style Your Hair这篇paper,当然"Style Your Hair"也并不完美。
2. 是否有一种方法,可以直接训练半身人像,然后在潜向量中进行类似BarberShop或者Style Your Hair的操作方法,这个思路具备一定的可行性,我做了一些实验。这个方案的前提就是你得有完美的训练出一个半身人像模型,A. 基于GAN的方案,我做了集中尝试,StyleGAN无法拟合分布多样的数据,对于半身人像这种有大量背景和人体姿态情况,训练基本不可能成功,https://github.com/lucidrains/stylegan2-pytorch 提到的yoniker不知道怎么做到的,作者神出鬼没,也没pretrained,找不到有用信息,我自己训练失败调研了一些paper后,果断放弃。基于GAN的方案,我也尝试了MSGGAN,情况稍微好一点,结果也是不可用的。理论上BIGGAN应该可以,不过训练BATCH得1024这么大,我就放弃了。B. 基于auto encoder模型,比如vae,或者vae+diffusion,比如最近大火的latent diffusion,这类模型主要问题在于采样速度慢,另外很多东西还不成熟,潜向量的操作不如StyleGAN那么雷厉风行有效简单,我的实验也是失败告终。
3. 采用一个完整的pipeline流程来搞定这件事情。大体流程如下: 发型脸按人脸关键点对齐目标脸->目标脸取光头&做图像补全->发型脸发型分割下来贴到目标脸上。事情到这,其实也算基本完成了,这边也采用n个模型才搞定这个pipeline。不过读者肯定不满意,我自己也不满意。所以,后续又做了一些改进。主要集中在,图像补全、以及如何避开发型直接贴图让它采用一种更加自然的方式生长到目标脸上,最后还得完美的还原到目标原图。
待续...