本文 GitHub https://github.com/Jack-Cherish/PythonPark 已收录,有技术干货文章,整理的学习资料,一线大厂面试经验分享等,欢迎 Star 和 完善。
一、隐秘的角落
用了一个周末,一口气刷完了《隐秘的角落》这部电视剧。
不得不说,这部网剧看得过瘾,回想起来,也总觉得意犹未尽。
剧情开篇,景区的山顶,一个戴眼镜的男人,借着拍照片,把一对老人推了下去。
这一幕,被在景区游玩的三个孩子意外拍摄下来,故事从此展开。
这部剧,让一个叫「张东升」男人的名字大火,也就是把那对老人推下山的凶手。
而跟他本人同样出名的场景,是他突然摘下假发后露出的发际线。
「张东升」秃头造型,火爆网络,他的经典语录有:
- 一起去爬山吗?
- 您看我还有机会吗?
作为脑力劳动的程序员,脱发可能都是曾担忧过的一个问题。
在「程序员界」,流传着这么一个段子:
「我变秃了,也变强了。」
想不想,看看变强后的自己?
今天,继续手把手教学。
算法原理、环境搭建、模型训练、效果测试,一条龙服务,尽在下文!
二、算法原理
我在曾经的文章里讲解过类似的算法原理,例如之讲解的 ALAE 算法,人脸属性编辑。
这个算法是发表在国外 Medium 网站上的一篇文章。
Medium 原文地址(需要翻墙):点击查看
这是一个名为 Azmarie Wang 的作品,作者是一位小姐姐。
而她也在自己的 Github 上开源了相应的代码。
项目地址:点击查看
但,这个篇文章传到国内,源码被别人做成了视频在「 B站 」分享出去,就「莫名其妙」的变成了"自制"。
很多公众号发文,都冠以「 B 站 Up 主自制」的标签。
自制个锤子哦!
人家文章、源码早就有了好吗?
槽吐完了,咱接着说算法原理。
这个算法的名字叫「 Hairstyle Transfer 」。
该算法也是站在巨人的肩膀上实现的,由 StyleGAN Encoder、Progressive GAN、InterFace GAN、SVM 多种算法组成。
算法流程:
换一个通俗一点的语言解释就是,先使用原图生成一个「人脸模型 」,这个「人脸模型 」是可以编辑的,然后找到控制头发的「控制器」,调整参数,改变发型。
专业一点的说法就是,先使用原图,用 StyleGAN Encoder 反算潜码( latent code ),获得多维的特征向量(头发、眼睛、嘴巴、肤色等)。
然后训练 SVM 分类器,用于找到控制头发的那个特征向量。
最后使用 Interface GAN 编辑特征,就可以完成头发属性编辑了。
想更深入的学习原理,需要先学习一下 StyleGAN Encoder 和 Interface GAN ,篇幅有限,本文就「点到为止」了。
三、环境搭建
你需要有在有 GPU 的机器上运行,如果能翻墙工具,强烈建议使用 Google Colab。
Google Colab 是一个 Google 提供的免费 GPU 服务器。
「 Hairstyle Transfer 」需要下载很多存放到 Google Drive 的权重文件。
使用 Google Colab 跑这个项目很方便,因为这个项目都是 ipynb 文件。
如果不能翻墙,也可以自己在本地,使用 Anaconda 新建虚拟环境。
「 Hairstyle Transfer 」算法,使用 Tensorflow 框架,并且必须是 1.x 的版本,不兼容 2.x。
首先,创建一个名为 tf 的 conda 虚拟环境。
1 | conda create -n tf python=3 jupyter notebook |
然后使用 conda 和 pip 按照如下顺序,安装如下第三方库即可:
1 2 3 4 5 | conda install scipy tensorflow-gpu==1.15 python -m pip install cmake python -m pip install dlib python -m pip install imutils tornado==4.1 conda install tqdm requests pillow keras opencv scikit-learn |
都安装好后,环境就算搭建完成了。
四、训练 & 效果测试
我们以「张东升」的图片为例进行训练以及效果测试。
图片下载地址:https://cuijiahua.com/wp-content/uploads/2020/07/photo_1.png
将项目下载到本地:
1 | git clone https://github.com/Azmarie/Hairstyle-Transfer |
然后你会得到三个 jupyter 的 ipynb 文件。
依照上述顺序跑通代码。
StyleGAN_Encoder 会生成 output_vectors.npy 文件。
Get_attribute_score_pairs 会 stylegan-dlatents.npy 和 9_score.npy 文件。
然后,Train_Boundaries 使用 stylegan-dlatents.npy 和 9_score.npy 训练 Boundaries。
这里用到了 SVM 分类器,将控制头发的特征向量分出来,得到 boundary.npy,用于后续发型的控制。
最后,再使用 output_vectors.npy 和 boundary.npy,即可控制头发的多少。
ipynb 详细说明了代码需要如何运行,依照它的教程,按照次序运行程序即可。
里面详细说明了,怎么裁剪图片,怎么训练等。
代码中用到了很多 Google Drive 保存的权重文件,我将这些权重文件,都上传到了我的百度网盘。
下载链接(提取码:2afm):https://pan.baidu.com/s/1sPqgyYqY06Z62jz2Up57MA
需要注意的是,下载好这些权重文件,在跑代码的时候需要将代码中所有的加载权重方式修改一下,都改为本地加载。
例如修改 pkl 的读取方式等。
很简单,这里就不一一说明了。
根据 ipynb 的说明,我们就可以顺利跑通所有代码。
完成模型训练和效果测试。
最后,一起看一下「张东升」的 「 Hairstyle Transfer 」效果吧!
就很“秃然”,有木有!
用自己照片试试看?一秒变超人。
五、最后
「 Hairstyle Transfer 」 算法也有一些小问题,比如控制头发变少,图片的色调也会变暗。