用深度学习技术FCN自动生成口红

2023-10-18 11:59

本文主要是介绍用深度学习技术FCN自动生成口红,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 这个是什么?

       基于全卷积神经网络(FCN)的自动生成口红Python程序。

1180694-20190907093739352-1030044718.jpg
图1 FCN生成口红的效果(注:此两张人脸图来自人脸公开数据库LFW)

2 怎么使用了?

       首先能从这个Github (https://github.com/Kalafinaian/ai_lips_makeup) 中下载这个python项目。下载解压后你得到这样一个程序。

1180694-20190907093800381-1199517162.jpg
图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文件夹中存储。

1180694-20190907093818599-1512370747.jpg
图3 FCN口红运行演示

       同理类似处理test_in文件夹下的002.jpg,那么在test_out文件夹下可以获得加上亮面口红的人脸照片了。

1180694-20190907093835142-1210689993.jpg
图4 FCN口红的预测输出

3 程序的原理

       这个基于全卷积神经网络的FCN口红的工作原理如下 (釉面口红为例)
       (1) 训练集输入为没有口红的人脸,训练集输出为有釉面口红人脸,共170
个训练集。(因版权原因本程序不提供完整人脸,只提供口红照片)

1180694-20190907093856372-755682918.jpg
图5 没有口红的人脸
1180694-20190907093911351-1758318314.jpg
图6 有釉面口红的人脸(诚如所见,训练集口红都是人工PS的?)

       (2)使用dlib自带的模型提取出人脸嘴唇,将所有嘴唇图片resize到90×30的大小那么训练的输入和输出

1180694-20190907093935462-871547840.jpg
图7 训练集原始嘴唇
1180694-20190907093951851-1681911056.jpg
图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好的图。

1180694-20190907094012350-80119309.jpg
图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)。

1180694-20190907094035359-621039891.jpg
图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

转载于:https://www.cnblogs.com/Kalafinaian/p/11479275.html

这篇关于用深度学习技术FCN自动生成口红的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/232439

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];