PULSE + ALAE:使用 StyleGAN 从低阶图像重建高清人脸

如果有我们一张低阶的、非常模糊的人脸图像,希望把它恢复成高清人脸,然后辨认这个人脸是否是某个人,应该怎么做?

举个例子,某个小区发生了一起盗窃案,我们只是从监控录像中截取到一个非常模糊的人脸,能够用StyleGAN的方法像公安刑侦的“嫌疑人画像”一样,快速地重建高清人脸吗?

或者,我们找到一张20年前的一张照片,只从上面提取到一个非常小的人脸,能够有办法把它复原成一张高清大图吗?

下面介绍两个 github.com 上的开源项目,一个用于重建人脸(PULSE),一个用于调整参数(ALAE)。

(一)PULSE: Self-Supervised Photo Upsampling via Latent Space Exploration of Generative Models

           PULSE:通过探索生成模型的潜码空间实现自监督图像上采样

这是美国杜克大学发表的研究成果,在 github.com 上的地址是:https://github.com/adamian98/pulse

在 Windows 10 环境下安装并运行,可以遵循下面的步骤:

(1.1)把项目源代码下载下来,解压缩放到自己的工作目录下:

PULSE + ALAE:使用 StyleGAN 从低阶图像重建高清人脸_第1张图片

(1.2)编辑用于创建编译环境的依赖描述文件:pulse.yml

可以手工编辑文件,删除每个依赖项后面的特定版本的 hash 值;同时删除运行 conda env create -n pulse -f pulse.yml 时会抛出错误的依赖项,比如:

(1.2.1)将依赖项:

dependencies
  - blas=1.0=mkl

修改为:

dependencies
  - blas=1.0

(1.2.2)删除若干会报错的依赖项:

  ...
  - libcxx=10.0.0=1
  ...
  - readline=8.0=h1de35cc_0
  ...
  

大家也可以直接参考我已经编辑好的pulse.yml文件,如下所示(最后一行是根据我安装的Anaconda目录指定的,大家可以根据自己的安装目录自行修改):

  - cffi=1.14.0
  - chardet=3.0.4
  - cryptography=2.9.2
  - cycler=0.10.0
  - freetype=2.9.1
  - idna=2.9
  - intel-openmp=2019.4
  - jpeg=9b
  - kiwisolver=1.2.0
  - libpng=1.6.37
  - libtiff=4.1.0
  - matplotlib=3.1.3
  - matplotlib-base=3.1.3
  - mkl=2019.4
  - mkl-service=2.3.0
  - mkl_fft=1.0.15
  - mkl_random=1.1.0
  - ninja=1.9.0
  - numpy=1.18.1
  - numpy-base=1.18.1
  - olefile=0.46
  - openssl=1.1.1g
  - pandas=1.0.3
  - pillow=7.1.2
  - pip=20.0.2
  - pycparser=2.20
  - pyopenssl=19.1.0
  - pyparsing=2.4.7
  - pysocks=1.7.1
  - python=3.8.2
  - python-dateutil=2.8.1
  - pytorch=1.5.0
  - pytz=2020.1
  - requests=2.23.0
  - scipy=1.4.1
  - setuptools=46.2.0
  - six=1.14.0
  - sqlite=3.31.1
  - tk=8.6.8
  - torchvision=0.6.0
  - tornado=6.0.4
  - urllib3=1.25.8
  - wheel=0.34.2
  - xz=5.2.5
  - zlib=1.2.11
  - zstd=1.3.7
  - pip:
    - dlib==19.19.0
prefix: d:/programdata/anaconda3/envs/pulse

(1.3)创建独立的 python + pytorch 运行环境并且激活它:

conda env create -n pulse -f pulse.yml
conda activate pulse

系统有时不会自动安装 dlib 包,需要手工安装: pip install dlib

(1.4) 下载必需的模型文件,放到工作目录下:

官网 https://github.com/adamian98/pulse  上提供了模型文件的下载地址,在源代码里也有需要下载模型文件的语句,但模型文件都放在 drive.google.com 上,要么由于防火墙的原因下载不了,要么告知流量已用完不能下载,因此我们把模型放在百度网盘上,方便大家下载(包括:StyleGAN 合成模型 synthesis.pt、StyleGAN映射模型 mapping.pt、dlib 人脸预测模型 shape_predictor_68_face_landmarks.dat):

链接: https://pan.baidu.com/s/1VRqOGc_7tlCMbxcqhj4tAA

提取码: ne4f

(1.5)修改源代码,使用本地模型:

(1.5.1)修改 align_face.py:

......
print("Downloading Shape Predictor")
# f=open_url("https://drive.google.com/uc?id=1huhv8PYpNNKbGCLOaYUjOgR1pY5pmbJx", cache_dir=cache_dir, return_path=True)
# predictor = dlib.shape_predictor(f)

predictor = dlib.shape_predictor("./models/shape_predictor_68_face_landmarks.dat")
......

(1.5.2)修改 pulse.py

     ......
        # with open_url("https://drive.google.com/uc?id=1TCViX1YpQyRsklTVYEJwdbmK91vklCo8", cache_dir=cache_dir, verbose=verbose) as f:
        #     self.synthesis.load_state_dict(torch.load(f))

        self.synthesis.load_state_dict(torch.load("./models/synthesis.pt"))
    ......
            # with open_url("https://drive.google.com/uc?id=14R6iHGf5iuVx3DMNsACAl7eBr7Vdpd0k", cache_dir=cache_dir, verbose=verbose) as f:
            #     mapping.load_state_dict(torch.load(f))

            mapping.load_state_dict(torch.load("./models/mapping.pt"))
    ......

(1.6)运行:

(1.6.1)将原图放到:./realpics 目录下,

(1.6.2)运行:python align_face.py

对齐原图中的人脸并降阶到 32x32 大小,降阶后的图片保存到:./input 目录中

(1.6.3)运行:python run.py

基于 32x32 的人脸小图,重建生成 1024x1024 的高清人脸大图,放在:./runs 目录中。

 

评价:从实践的效果看,一个是 32x32 图片丢失的信息过多,二是因为 StyleGAN 的合成模型和映射模型都是基于 CelebA-HQ 数据集训练得到的,大多数情况下重建人脸的效果偏欧美化,且年龄通常偏大。

对于欧美化的脸型,感兴趣的小伙伴可以自己基于黄种人脸型去训练 Pytorch 的模型,也许能得到更好的效果。

对于年龄问题,有一个现成的方法可以很方便地进行调整,见下面第二节的内容。

 

(二)Adversarial Latent Autoencoders

          对抗性潜码自动编码器

这是美国西弗吉尼亚大学的研究成果,在 github.com 上的地址是:https://github.com/podgorskiy/ALAE

在 Windows 10 环境下安装并运行,可以遵循下面的步骤:

(2.1)把项目源代码下载下来,解压缩放到自己的工作目录下。

(2.2)安装运行环境,升级 NVIDIA GPU driver,登录NVIDIA官网:http://www.nvidia.com/Download/index.aspx,下载并安装与 GPU 型号一致的驱动(NVIDIA Geforce GTX 1060即可运行,但只能运算一张图片;建议使用 NVIDIA Geforce RTX 2080Ti)。

(2.3)安装 Pytorch,第一步,登录Pytorch官网:(https://pytorch.org/),点击get started;第二步:选择与本机环境相匹配的版本,将相关命令复制到Windows 10 命令行来执行(建议使用 pip 的安装命令)。

(2.4)安装软件依赖项(可根据自己的环境选择安装或补充安装其他依赖项):

pip install bimpy

pip install dlutils

pip install sklearn

pip install yacs

(2.5)下载运行所需要的模型,可以从官网:https://github.com/podgorskiy/ALAE 给定的地址下载,也可以到百度网盘下载:

链接:https://pan.baidu.com/s/19GFKLTWu00jB3Qp4lsyAYw

提取码:in5l

(2.6)需要处理的图片拷贝,放到 .\dataset_samples\faces\realign_1024x1024 目录下,将原来的 00000.png 改名为:10000.png,把待处理的图片改名为:00000.png

(2.7)运行:python interactive_demo.py -c ffhq

-c 后接的参数就是选择哪个模型,一共有 bedroom、celeba、celeba-hq256、ffhq 四种可选。运行之后,你可能看到这样的结果:

PULSE + ALAE:使用 StyleGAN 从低阶图像重建高清人脸_第2张图片

结果就是一小条,这是 bimpy 窗口大小的设置问题。

运行一次 interactive_demo.py 之后,工作目录下会生成一个 imgui.ini 文件。

PULSE + ALAE:使用 StyleGAN 从低阶图像重建高清人脸_第3张图片

修改 Size 大小到 1500,1024 即可。

重新运行 interactive_demo.py,可以任意改变图像中人脸的性别、年龄、笑容、发质,也可以改变他们的性感程度、丰满程度、嘴唇和鼻子的大小等等,调整各个属性上的游标位置,点击【Display Reconstruction】按钮即可生成新的人脸。

评价:因为模型是基于 FFHQ、CelebA-HQ 等数据集训练的,因而生成的人脸通常偏欧美化,可以用黄种人的人脸进行训练以得到接近中国人的脸型表达。

下面是最后的结果:

原图pulse-master/realpics  32x32小图pulse-master/input    重建图pulse-master/runs     修改年龄(ALAE)

PULSE + ALAE:使用 StyleGAN 从低阶图像重建高清人脸_第4张图片                                                

效果尚可,如果能用中国人的人脸模型替换 PULSE 和 ALAE 中的人脸模型,则效果应该能更上一层楼。

 

【尾声】

有人用 PULSE 处理美国前总统奥巴马的图片,本期望生成一个黑人青年的榜样脸,不料却生成了一张“白人面孔”,在美国愈演愈烈的 Black Lives Matter 运动的裹挟下,深度学习开山人物之一、图灵奖得主、Facebook 首席 AI 科学家 Yann Lecun 甚至也被卷入,他为机器学习和数据集偏差所做的解释引发争议,并最终不得不宣布:

This will constitute my last substantial post on Twitter.

Farewell everyone.

报道链接:深度学习先驱Yann LeCun被骂退推特:你们都很懂,从此我不说话了

这真是一个神奇的时代,值得大家铭记的时代,欢迎 Yann Lecun 老师到中国来!

(完)

你可能感兴趣的:(PULSE + ALAE:使用 StyleGAN 从低阶图像重建高清人脸)