用深度学习技术FCN自动生成口红
1 这个是什么?
基于全卷积神经网络(FCN)的自动生成口红Python程序。
图1 FCN生成口红的效果(注:此两张人脸图来自人脸公开数据库LFW)
2 怎么使用了?
首先能从这个Github (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://github.com/shelhamer/fcn.berkeleyvision.org
- 深度学习之文本摘要自动生成
- 从深度学习研究论文中自动生成可执行源代码
- 惊不惊喜, 用深度学习 把设计图 自动生成HTML代码 !
- 自动生成硬件优化内核:陈天奇等人发布深度学习编译器TVM
- 技术人要失业了?深度学习自动编程催生的机器码农
- 深度学习之文本摘要自动生成
- 使用深度学习自动生成某一风格的图片
- 【自动驾驶】深度学习用于自动驾驶技术 DeepDriving(ICCV 2015)
- 【自动驾驶】深度学习用于自动驾驶技术 DeepDriving(ICCV 2015)
- 被垃圾分类逼疯?这个深度学习技术帮你做到垃圾自动分类
- 深度学习助力前端开发:自动生成GUI图代码(附试用地址)
- 前端慌不慌?用深度学习自动生成HTML代码
- 博世投资张翠波:自动驾驶需要突破芯片、传感器、深度学习算法等关键技术
- 厉害了!IBM发表DLPaper2Code: 从深度学习论文中自动生成Keras或Caffe代码 | AAAI2018论文
- Python深度学习-Keras应用-文本生成
- 6本互联网技术畅销书免费送(数据分析、深度学习、编程语言)!
- 深度剖析C++对象池自动回收技术实现
- 深度学习读书笔记之AE(自动编码AutoEncoder)
- 如何利用深度学习技术训练聊天机器人语言模型?
- python学习重温(1)---自动case生成工具