侧脸生成正脸概论与精析(一)Global and Local Perception GAN
侧脸生成正脸我一直很感兴趣,老早就想把这块理一理的。今天来给大家分享一篇去年的老文章,如果有不对的地方,请斧正。
Beyond Face Rotation: Global and Local Perception GAN for Photorealistic and
Identity Preserving Frontal View Synthesis
文章下载地址:
https://arxiv.org/abs/1704.04086
有很多公众号和博客都写过了,翻译的文字我觉得有些生硬。俗话说,一千个读者有一千个哈姆雷特。今天我给大家我的视角,希望带来不一样的阅读体验。
温故而知新,可以为师矣。学习就是这样,去粗取精,去伪存真,由此及彼,由表及里。
第一节 侧脸生成正脸相关文献介绍
由此及彼:
干类似的事情的还有2篇文章,也很值得读。推荐如下:
自动化所胡一博老师的:
Pose-Guided Photorealistic Face Rotation
颜水成老师的:
Towards Pose Invariant Face Recognition in the Wild
这两篇都是今年的CVPR。
借用一下胡一博老师整理的图:
整个领域的文献基本都在这里了。颜老师的文章是图片中的PIM。
如果光是生成人脸,还有一个工作是谷歌大脑的:
BEGAN: Boundary Equilibrium Generative Adversarial Networks
他这个是直接生成脸,训练集有正脸有侧脸的。
领域知识都介绍完了,我们来说说这篇文章吧。
第二节 文章的主线:输入与输出
论文有的是讲方法论的,有的是讲技能的。这篇文章是讲技能的。讲技能的文章,我的阅读方式是先抓主干。一个软件的主干是什么呢?那就是输入输出嘛。
论文用的训练集是Multi-PIE。训练集的输入:侧脸和正脸训练对。侧脸有几个种类,90度,60度,45度等等。事实上,不光正脸的训练对,还做了预处理,通过关键点检测,把左眼、右眼、鼻子、嘴巴都抠出来了。做成了侧脸左眼、正脸左眼训练对。依次类推。
训练好的模型有两个输出:第一个是侧脸生成正脸。
这个很好看懂,最后一列是正脸,其它都是两列,第一列是侧脸,不同角度,第二列是合成的人脸。
第二个输出是提升了人脸识别的精度。这个是他跟一般的GAN文章不一样的地方。也是比较有意思的点。
这个表格如果你之前没有研究过侧脸和正脸方面的内容,是比较难看懂的。比如说,这个是怎么测试的,他这个一列加减60度,得到的精度代表什么意思,训练集和测试集是啥。
这个列表上写的Setting1,事实上论文里只是一个引用没有具体说,具体的定义在这个文章里:
Deep Learning Identity-Preserving Face Space
训练集和测试集的人是分开的,所谓的setting1是指这个训练集测试集的具体设置。
他这个测试精度是这样得来的: 选定一张正脸,让你用CNN来判别,比如说75度的脸跟这个正脸是不是同一个人。从文章可以看到,45度以内,一般的CNN都效果很好的,45度以上,TP-GAN提升了不少精度,他是怎么做到的呢?因为他先用侧脸生成一个正脸,然后比对生成的正脸和真实的正脸是不是同一个人,这样提升精度的。
第三节 实现主线输入输出的loss和网络结构设计
网络结构是比较清楚的。文章讲的也很透彻。一个GAN网络和一个分类网络,GAN网络由两个,一个全局的GAN生成一个正脸轮廓没有具体眼睛嘴巴鼻子的,四个局部的GAN分别生成左眼 右眼 鼻子 嘴巴。然后把他们两个结合起来。
分类网络就是一个简单的CNN,判别生成的人脸是哪个人。
图片中,上一层是GAN网络,下一层是分类网络。
接下来我们看loss的设计,loss是指挥棒,得好好琢磨一下。
先看目标函数:
InF 代表的是ground truth正脸,InP代表的是侧脸,目标函数前一项是合成的正脸和真实正脸之间的损失,是对应网络结构中的二路GAN的,后一项是分类的交叉熵损失,对应网络结构图中的light-cnn。
1、像素级损失
这个loss计算起来计算量会很大,它直接算合成的人脸与真实正脸每个点像素值的绝对差值。这个loss在三个地方起作用,一个是预测局局部区域例如左眼的时候,一个是全局的,还有是全局和局部合成一个最终正脸的时候。如果光训练这一个loss,要训练到收敛我觉得是比较难的。因为每个点的像素值都能影响到loss,训练过程中指挥棒比较分散。
2、对称损失
由于预测的是正脸,正脸是对称的,左右对称位置上的像素应该相同。这个损失就是算左右位置像素值的差的。
3、对抗损失
这个就是一般的GAN损失,让合成的人脸跟真实人脸更接近。
D代表的是判别网络,G代表的是生成网络。
4、保留身份的损失
这个损失的作用是让合成的人脸还是本人,而不是合成了另一个人。对抗损失是保证合成的人脸逼真,保留身份损失相当于更进一步,不光逼真,还是本人。
注意看这个公式,它的i是从1到2的,代表的是分类网络的最后两层卷积层,
W 和H呢代表的是卷积后得到的feature map的维度。
绝对值符号里面的两项相减,说的是真实正脸和合成正脸走CNN前向传播得到的feature map。
它的物理意义是相对像素级的损失的,他的损失是高级语义损失,由于CNN的高层值代表更抽象的语义信息,因而这个损失能保证合成的人脸主体特征的正确性,进而保证了合成人脸的身份。
这个损失类似的经典损失函数是感知损失。大家可以自己搜下perceptual loss。
最后,把上面这几个损失加权求和就是最终的损失函数了。
文末习题:
文章解说完了,接下来搞个题目试试看如何?
输入这样一张人脸,用训练好的网络测试能输出合成的很好的正脸吗?
微信扫一扫
关注该公众号
侧脸生成正脸概论与精析(一)Global and Local Perception GAN的更多相关文章
- MVVM大比拼之knockout.js源码精析
简介 本文主要对源码和内部机制做较深如的分析,基础部分请参阅官网文档. knockout.js (以下简称 ko )是最早将 MVVM 引入到前端的重要功臣之一.目前版本已更新到 3 .相比同类主要有 ...
- MVVM大比拼之AngularJS源码精析
MVVM大比拼之AngularJS源码精析 简介 AngularJS的学习资源已经非常非常多了,AngularJS基础请直接看官网文档.这里推荐几个深度学习的资料: AngularJS学习笔记 作者: ...
- jquery uploadify文件上传插件用法精析
jquery uploadify文件上传插件用法精析 CreationTime--2018年8月2日11点12分 Author:Marydon 一.参数说明 1.参数设置 $("#fil ...
- miaov- 自动生成正V反V大于号V小于号V楼梯等图案
1. 核心:控制 数量的长度-1-i的位置,是放在left上还是top上?是放在前面还是后面! <!DOCTYPE html> <html lang="en"&g ...
- Android长方形图片生成正圆形,以及矩形图片生成圆角
一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图: 变成正圆后: 下面上代码: public ...
- vue.js源码精析
MVVM大比拼之vue.js源码精析 VUE 源码分析 简介 Vue 是 MVVM 框架中的新贵,如果我没记错的话作者应该毕业不久,现在在google.vue 如作者自己所说,在api设计上受到了很多 ...
- TensorFlow练习24: GANs-生成对抗网络 (生成明星脸)
http://blog.topspeedsnail.com/archives/10977 从2D图片生成3D模型(3D-GAN) https://blog.csdn.net/u014365862/ar ...
- Dlib库中实现正脸人脸关键点(landmark)检测的测试代码
Dlib库中提供了正脸人脸关键点检测的接口,这里参考dlib/examples/face_landmark_detection_ex.cpp中的代码,通过调用Dlib中的接口,实现正脸人脸关键点检测的 ...
- java 类名.class、object.getClass()和Class.forName()的区别 精析
1.介绍 getClass()介绍 java是面向对象语言,即万物皆对象,所有的对象都直接或间接继承自Object类: Object类中有getClass()方法,通过这个方法就可以获得一个实 ...
随机推荐
- IPFS 探索
IPFS 探索 比特币当前是用于存金融交易数据,有leveldb 存关键小的交易数据.那么我们的文件,譬如一个网站里面的static file 怎么办? IPFS(InterPlanetary Fil ...
- [C++]_ELVE_Windows下QT5.12连接MySql8.0解决方案
#0x01 准备 1)要保证QT和MySQL都是一样的位数,我的就是都安装的64位. 2)安装Qt5.12,这里主要提一点,在安装时候,有个选择插件那块,尽量都选上,里面有个database选项,记得 ...
- 关于mysql自增主键
对于mysql表(其他数据库没测试过) 如果定义了自增主键,并且手动设置了主键的值,那么当再次自增创建数据的时候,回在设置的主键值的基础上进行自增. 如(id是主键): 起始插入(3,1),而后手动插 ...
- RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备-【申嵌视频-RK3399篇】
实验2:RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备,比如外接一个LED模块,通过GPIO1_A0管脚 1 介绍 LED模块 Matrix-LE ...
- react连连看
// Math.floor(t * Math.random()); var isInclude = function (array, element) { let alen = array.len ...
- 双网卡单IP实现网卡冗余与负载均衡
WINDOWS下: 所谓双网卡,就是通过软件将双网卡绑定为一个IP地址,这个技术对于许多朋友来说并不陌生,许多高档服务器网卡(例如intel8255x系列.3COM服务器网卡等)都具有多网卡绑定功能, ...
- Ubuntu 16.04 安装Go 1.9.2
系统环境 Ubuntu: 16.04 Go: 1.9.2 安装步骤 $ curl -O https://storage.googleapis.com/golang/go1.9.linux-amd64. ...
- Ubuntu14.04+ROS 启动本地摄像头
STEP1安装usb_cam 创建一个工作空间,make一下 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make STEP2下面是安装usb_c ...
- Linux下的快捷键
1:tab 键 命令补全 路径补全 2:Ctrl+C 命令的中止 3:Ctrl+D 退出当前的会话 exit logout 4:Ctrl+l clear 清屏 5 ...
- socket开发总结
1.connect 阻塞socket connect时会等待返回结果,等于0表示成功,小于0表示失败. 非阻塞socket connect时会立刻返回结果,等于0表示成功,小于0且errno == E ...