TensorFlow 人脸识别网络与对抗网络搭建

原创 2017年11月16日 00:00:00



640.gif?wxfrom=5&wx_lazy=1

本文来自作者 沧夜 在 GitChat 上分享「TensorFlow 人脸识别网络与对抗网络搭建」,阅读原文」查看交流实录

文末高能

编辑 | 嘉仔

写在前面的话

本次文章坑挖的有些大,有些很不好写,想了想其实人脸识别网络大约也是一个简单的前馈神经网络。

但是这么说又没有神秘感,要是要用RNN模型又有些高射炮打蚊子。所以准备介绍介绍人脸识别是怎么回事。

这里挂一漏万,从人脸监测开始,那么什么是人脸检测呢:

人脸识别任务

其实总结起来人脸识别工作可以分为几个部分人脸检测(detection),人脸校准(aliment),人脸识别(recognise)。

还记得手机照相过程那个小框框吧,那个就属于人脸检测,有个非常有名的是MTCNN,名字比较唬人,其实就是三个简单的卷积神经网络综合起来的。

第一个用于大致确定人脸的位置,第二三个用于精确的识别、定位人脸。这是一种效率与精度兼顾的方式,因为第一层网络参数量少,计算速度快,识别后把人脸截出来需要做精确处理的时候再去多加点参数。

人脸识别recognise的话这个就复杂了,就是通过图片和视频去鉴别不同的人。这个需要更细节的一些东西,相比较而言应用范围也广得多,比如用来识别身份证上不同的人,比如某个AI智障机器人用来提供个性化服务。从人脸监测开始:

MTCNN

这个部分的内容可以看文章《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 》,同时还有两张转疯了的照片在这里(https://zhuanlan.zhihu.com/p/28988009),我就不转图了,防止有些只看图的人说我抄袭。

有些英语不好的人将其叫做MTCNN。第一层网络叫PNet,这个网络主要的作用就是监测人脸是否存在整个网络没有识别特征,来看下训练集:

0?wx_fmt=png

大体上就是一些人脸,是不是感觉图片很小?因为只有像素,当然还有负面样本,就是不是人头像的,用来判别,都说现在的机器学习是在模仿人的认知。

但是我作为人,感觉还是看不清,所以机器识别起来也会有困难,但是参数少速度快。

这个loss函数选取平平无奇,对于是否为人脸选择的函数为交叉熵,而对于人脸的 box 和 landmark 则用点的距离或者说二范数来表示。

这三个函数在训练过程中所对应的权值是不同的,PNet、RNet中权值比较低,而最后一个ONet中的权值进行了提高。这个意思是ONet中更侧重于人脸特征点的识别。

第一层网络之后形成的图片,为避免侵权用新闻图片来看一看,选取尊敬的三胖领袖:

0?wx_fmt=png

可以看到效果很明显,每个人脸都识别出来了,这个是做后续处理的基础,也就是不漏报。

你第一层就有几个人脸没有拾取到是不行的,后续只能越来越少。但是出现了一个严重的问题就是膝盖也被识别成了人脸。

之于膝盖为什么会被识别成人脸,用下图解释一下:

0?wx_fmt=png

还有一个小的问题就是,人脸框框太多了,这个稍后说。

主要是第一层网络做的太大概了,精确度不高,所以产生了像素的CNN网络,这也是一个多层的神经网络,但是自由参数数据更多一些,所以错误率会降低,这层中开始出现了全链接网络,所以不能处理任意大小图片,需要利用 PNet 所截取的图片:

0?wx_fmt=png

可以看到绝大部分膝盖的错误预测已经没有了。剩下的一个手那个地方的可信度也不高。再来看看比较像人脸的膝盖:

0?wx_fmt=png

没有什么问题,错误判断已经消失了,同时还把左上角的小女哈标注了出来。

这时候框框减少了,其实上一步之中也有这个操作,就是极大值抑制(NMS)这种方式来约束框的数量,这个是在物体识别和人脸识别中的常用算法,通俗说法是从重叠的里找一个最好的。

具体的算法步骤是首先从堆叠的框中按照概率从大到小排序,从第一个开始,如果之后box的重叠面积与前一个超过一个设定值,那么就把其从box序列中删掉。之后再从box序列(删减后)中选择第二个重复上面的过程,通过这个过程来合并人脸识别的框(box)。

还有一个小的补充,在识别过程中由于人脸大小不一样,但是我们的MTCNN网络结构要求人脸大小不能有太大的变化,因此对于图片需要进行多个尺度的变换,这个图节选自维基百科)体面的人都会给出引文地址。

0?wx_fmt=png

到此为止,内容已经介绍的差不多了,还差最后一步,直接输出最终结果,这个是通过所谓的ONet,其实它依然是一个比较浅的卷积神经网络。但是最后一层为一个全链接层。

这个全链接层使得无法如第一个全卷积神经网络那样来处理任意大小的图片(用现有库的话肯定不成),来看看最终的结果:

0?wx_fmt=png

由于图片人脸清晰,使得识别效果很好,不重不漏,再来一张:

0?wx_fmt=png

这个是一个比赛的图片,可以看到带了眼镜的也能识别,同时对于一些模糊的人脸也较好的进行了识别。可以说MTCNN这种结构对于人脸识别来说还是挺成功的。

深度网络

前面 MTCNN 的结构已经可以对拾取图片中的人脸了,那么接下来的工作就是区分每个脸是谁,这就是所说的 recognise。

当然我们需要用到 MTCNN 所截取的人脸。用于人脸ID这个网络就复杂了,因为网络层数很多,常用的一些结构包括 Inception,ResNet 都是一种很深的网络结构,而 TensorFlow 包含一个 Inception 网络实现:

Conv2d_1a_3x3 Conv2d_2a_3x3 Conv2d_2b_3x3 MaxPool_3a_3x3 Conv2d_3b_1x1 Conv2d_4a_3x3 MaxPool_5a_3x3 Mixed_5b Mixed_5c Mixed_5d Mixed_6a Mixed_6b Mixed_6c Mixed_6d Mixed_6e Mixed_7a Mixed_7b Mixed_7c

这个mix代表一系列网络结构的综合,之于文章在这里(https://arxiv.org/pdf/1512.00567.pdf),有兴趣的可以翻阅。可以用tensorboard点开一个节点看看:

0?wx_fmt=png

大概就是一系列卷积之后再来个连接,把每个卷积层学到的都留着继续处理。

输出是一个几百个长度的向量谷歌的facenet的向量长度是128,整个过程类似于将一个图片压缩成一个定长的向量,这是一个信息压缩的过程,如果两张人脸的向量二范数很小的话那么就说明很大可能是同一个人脸。

具体例子就不演示了,训练起来实在是挺麻烦。当然实现并不麻烦 TensorFlow 已经实现了,麻烦是数据寻找和处理,网上开源数据库一大堆,数据量不大几百万个图片吧。

GAN

这是附加内容

最后来聊聊老夫感觉挺神奇的一个应用就是对抗生成网络,有些英语不好的人喜欢叫GAN网络,这个网络结构并不复杂,但是可以完全用神经网络来生成图片。

也就是给一些随机数列,自动生成需要的图片,当然可以用来开车,这完全取决于你的猥琐程度。
这个网络中很重要的一个函数就是:

tf.nn.conv2d_transpose

执行的作用与卷积相反,传统卷积是这样的:

0?wx_fmt=gif

反卷积是这样:

0?wx_fmt=gif

这两张图片都节选自开源项目(https://github.com/vdumoulin/conv_arithmetic)体面人抄袭都会给链接。简单点说就是把一张图片像素数提高了。

有些宅用这些函数可以画漫画:

0?wx_fmt=png

还发了文章,文章名字叫:Learning to Simplify: Fully Convolutional Networks for Rough Sketch Cleanup。图片就是节选自这个文章。

接着说我们的GAN网络,其分为两个部分,第一部分为生成器,第二部分为判别器:生成器用于生成图片以骗过判别器,而判别器用于判别图片是否为生成器所生成,于是二人产生了一种博弈。

生成器将随机噪声生成图片,用到的就是 conv2d_transpose 函数。其实可以看成是判别器网络倒过来,而判别器是几层卷积网络,最后有一个输出,当图片是真实图片输出1,当为生成器生成的图片输出为0。

最后来看一看结果:

0?wx_fmt=png

效果还可以,但是给多个标签,神经网络就会懵逼:

0?wx_fmt=png

比如同时给了两个标签2,3就会这样。其实可以看成2、3两个数字的合体。


 近期热文

Java 多线程编程核心技术有哪些

Python 的 C 扩展开发惯例

如何成为一名程序员面霸

轻松入门 | 用 WordPress 和主题模板做网站

Java 8 Stream API 实用指南

GitChat 与 CSDN 联合推出

《GitChat 达人课:AI 工程师职业指南》

0?wx_fmt=jpeg

「阅读原文」看交流实录,你想知道的都在这里

版权声明:本文为GitChat作者的原创文章,未经 GitChat 允许不得转载。

Python调用Matlab的混合编程

Python调用Matlab的混合编程 一. 配置方法 二. 使用方法 三. 测试用例(Python2) 四. 注意点...

python调用matlab环境配置,非常详细!!!

因为要用到python中调用matlab写的m函数文件,所以最近查找各种资料手动配置了下。 只要一配置环境,基本上就会遇到各种问题,网上查找的参考度又比较有限,还好最后顺利解决了。 1.电脑有matl...

TensorFlow 人脸识别网络与对抗网络搭建

写在前面的话 本次文章坑挖的有些大,有些很不好写,想了想其实人脸识别网络大约也是一个简单的前馈神经网络。 但是这么说又没有神秘感,要是要用RNN模型又有些高射炮打蚊子。所以准备介绍介绍人脸...

苹果博客解读iPhone上的人脸识别深度神经网络

苹果首次将深度学习应用于人脸识别是在 iOS 10 上。通过 Vision 框架,开发者现在可以在 App 中将该技术与其他很多计算机视觉算法进行整合。为了保护用户隐私,保证有效运行,苹果在开发这个框...

论文理解:多任务学习及卷积神经网络在人脸识别中的应用

在已有的基于深度学习的人脸识别框架中,每个任务(人脸鉴别、认证和属性分类等)是相互独立设计的。本文提出一种基于多任务框架的深度卷积网络,通过将人脸鉴别、认证和属性分类同时作为网络的目标函数,端到端地训...

Deep Learning学习 - VGG-Face网络人脸识别

记录一下使用VGGNet进行人脸识别的实验过程。 数据集:训练集 9W+张人脸图片,包含10000 ID。 1.数据集准备 将数据集图片分为训练集以及测试集两个部分,并生成标签文件,记录在.txt...

Qt+Caffe+OpenCV——【一个基于VGG网络的人脸识别考勤系统】

前言将PC端的一个基于深度学习的考勤系统的初版在这里发一发,会不断的更新。这一次的代码比以往的有一个【基于深度学习的人脸识别系统】要更加简洁完善,并且外带了GUI,可以移植到USB摄像头,正在开发连接...

DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)

> DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)@author:wepon@blog:http://blog.csdn.net/u01216...

人脸识别技术--双层异构深度神经网络

基本原理 人类的神经系统在处理信息时是分级的,例如在看一张人脸照片时,首先会从像素中提取人脸的边缘特征,然后将边缘特征组合成部件特征,接下来将部件特征组合成能表达整张人脸的特征,最后基于人脸...

【神经网络】MCCN(Multi-task Cascaded Convolutional Networks )人脸识别与特征点检测论文解析

在使用faceNet的时候,看到faceNet官方使用的人脸识别和归一化方法是MCCN(Multi-task Cascaded Convolutional Networks ),看代码貌似是使用三个网...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TensorFlow 人脸识别网络与对抗网络搭建
举报原因:
原因补充:

(最多只允许输入30个字)