如果有我们一张低阶的、非常模糊的人脸图像,希望把它恢复成高清人脸,然后辨认这个人脸是否是某个人,应该怎么做?
举个例子,某个小区发生了一起盗窃案,我们只是从监控录像中截取到一个非常模糊的人脸,能够用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)把项目源代码下载下来,解压缩放到自己的工作目录下:
(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 四种可选。运行之后,你可能看到这样的结果:
结果就是一小条,这是 bimpy 窗口大小的设置问题。
运行一次 interactive_demo.py 之后,工作目录下会生成一个 imgui.ini 文件。
修改 Size 大小到 1500,1024 即可。
重新运行 interactive_demo.py,可以任意改变图像中人脸的性别、年龄、笑容、发质,也可以改变他们的性感程度、丰满程度、嘴唇和鼻子的大小等等,调整各个属性上的游标位置,点击【Display Reconstruction】按钮即可生成新的人脸。
评价:因为模型是基于 FFHQ、CelebA-HQ 等数据集训练的,因而生成的人脸通常偏欧美化,可以用黄种人的人脸进行训练以得到接近中国人的脸型表达。
下面是最后的结果:
原图pulse-master/realpics 32x32小图pulse-master/input 重建图pulse-master/runs 修改年龄(ALAE)
效果尚可,如果能用中国人的人脸模型替换 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 老师到中国来!
(完)