1 这个是什么?
基于全卷积神经网络 (FCN) 的自动生成口红 Python 程序.
图 1 FCN 生成口红的效果(注: 此两张人脸图来自人脸公开数据库 LFW)
2 怎么使用了?
首先能从这个 GitHub https://github.com/Kalafinaian/ai_lips_makeup ( https://github.com/Kalafinaian/ai_lips_makeup ) 中下载这个 python 项目. 下载解压后你得到这样一个程序.
图 2 口红 Python 程序
本项目的运行环境为 Python3.6, 需要的深度学习包 tensorflow , 脸部图形处理包 dlib, 通用计算机视觉处理包 cv2, 以上三个 python 软件包都可以通过如下 pip 命令按照
- pip install opencv-python
- pip instll dlib=19.16.0
- pip install tensorflow=1.12.0
安装好必要的 python 包后, 就直奔主题说如何给一张人脸图加上口红, 用 pycharm 打开项目运行 main_predict.py. 按照提示选择口红效果, 再输入人脸图片的地址, 最后加上口红的照片会在 test_out 文件夹中存储.
图 3 FCN 口红运行演示
同理类似处理 test_in 文件夹下的 002.jpg, 那么在 test_out 文件夹下可以获得加上亮面口红的人脸照片了.
图 4 FCN 口红的预测输出
3 程序的原理
这个基于全卷积神经网络的 FCN 口红的工作原理如下 (釉面口红为例)
(1) 训练集输入为没有口红的人脸, 训练集输出为有釉面口红人脸, 共 170
个训练集.(因版权原因本程序不提供完整人脸, 只提供口红照片)
图 5 没有口红的人脸
图 6 有釉面口红的人脸(诚如所见, 训练集口红都是人工 PS 的)
(2)使用 dlib 自带的模型提取出人脸嘴唇, 将所有嘴唇图片 resize 到 90*30 的大小那么训练的输入和输出
图 7 训练集原始嘴唇
图 8 训练集对应釉面口红输出
(3)构建一个三层全卷积神经网络
(3.1)第一层输入为 30*90*3 (RGB 三通道)的多维数组, 所以第一层卷积输入通道为 3 个, 另定义输出通道为 24 个, 采用 elu 激活函数, 没有下采样
(3.2)根据第一层输出通道可知第二层输入为 30*90*24 的多维数组, 另定义第二层输出通道为 45 个, 同样采用 elu 激活函数, 没有下采样
(3.3)根据第二层输出通道可知第三层输入为 30*90*45 的多维数组, 另定义第二层输出通道为 3 个, 同样采用 elu 激活函数, 没有下采样
(3.4)定义损失函数为均方差损失, 即 loss 等于第三次输出和训练输出每个像素点差的平方求平均数.
(4) 迭代训练 100 词, 将模型参数保持为 model 文件夹中 model_brightening
(详细过程可见代码)
(5) 高兴的使用模型参数进行口红生成
4 延伸阅读(全卷积神经网络和 ELU 激活函数)
简单来说 FCN 将传统 CNN 中的全连接层转化成一个个的卷积层 (本文中程序连 pooling 也省略了). 在传统的 CNN 结构中, 前 N 层是卷积层, 倒数第二层是一个长度为 4096 的一维向量, 倒数第一层是长度为 1000 的一维向量, 对应 1000 个类别的概率. FCN 将这 3 层表示为卷积层, 卷积核的大小(通道数, 宽, 高) 分别为(4096,1,1),(4096,1,1),(1000,1,1). 所有的层都是卷积层, 故称为全卷积网络. 简单来说 FCN 与 CNN 的区别在于 FCN 把 CNN 最后的全连接层换成卷积层, 输出一张已经 label 好的图.
图 9 FCN 演示图
关于 FCN 具体只是可参见 UC Berkeley 的 Jonathan Long 等人提出了 Fully Convolutional Networks (FCN)[1].
然后再介绍一下 ELU 激活函数[2], 这个函数长这样的
\[f\left( x \right) = \left\{ \begin{array}{l} x\;\;\;\;\;\;\;\;\;\;\;\;\;\;x> 0 \\ \alpha \left( {{e^x} - 1} \right)\;\;\;x \le 0 \\ \end{array} \right.,\;f'\left( x \right) = \left\{ \begin{array}{l} 1\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;x> 0 \\ f\left( x \right) + \alpha \;\;\;x \le 0 \\ \end{array} \right.\]
在 tensorflow 中 alpha 默认取 1( https://www.tensorflow.org/api_docs/
python/tf/nn/elu).
图 10 ELU 函数和其他几个激活函数的图像
Elu 函数可以加速训练并且可以提高分类的准确率. 它有以下特征:
(1) elu 由于其正值特性, 可以像 relu,lrelu,prelu 一样缓解梯度消失
(2 相比 relu,elu 存在负值, 可以将激输出均值往 0 推近, 输出均值接近 0 可以减少偏移效应进而使梯 度接近于自然梯度.
(3) Lrelu 和 prelu 虽然有负值存在, 但是不能确保是一个噪声稳定的去激活状态. Elu 在负值时是一个指数函数, 对于输入特征只定性不定量
5 总结
详细过程看代码, 具体原理读论文.
推荐论文:
[1] Fully Convolutional Networks for Semantic Segmentation
( https://arxiv.org/abs/1411.4038 )
[2] Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs)
( https://arxiv.org/abs/1511.07289v5 )
推荐资源
http://vis-www.cs.umass.edu/lfw/
来源: https://www.cnblogs.com/Kalafinaian/p/11479275.html