赞
踩
在这堂课里,我们要学习两个具体的应用:人脸识别、风格迁移。
相信大家已经在很多地方见识过人脸识别应用了:在火车站,要通过身份证和人脸核实身份;办理业务时,可以用手机完成人脸识别以核实身份;进办公楼时,员工只要刷脸通过就可以打开门禁。通过这节课的学习,我们能够学会如何用CNN完成人脸识别。
神经网络风格迁移是一项有趣的应用。它利用了CNN捕捉图像抽象信息的特点,能够把一幅图像的风格转移到另一幅图像上,从而生成一幅新的图像。这项技术不需要从头训练网络,学完这门课后,我们能快速地用代码实现神经网络风格迁移。
准确来说,在人脸识别(Face Recognition)任务中,会给定一个有 K K K个人的数据库。之后,每一次识别都会输入一张图片,输出这张图片是 K K K个人中的哪一个,或者没有检测到相关人士。
有一个与这个相关的任务叫做人脸验证(Face Verification)。这个任务稍微简单一些,输入是一张图片和一个标记身份的数据(比如身份证号),要求输出图片中的人是否符合该身份。
按我们之前学的方法,假如我们在 K K K个人的数据库上做识别(分类)任务,应该套用一个CNN模型,并在模型最后接一个 K + 1 K+1 K+1类的softmax,表示输入图片是K个人中的哪一个,或者都不是。
但是,这样的架构不适合人脸识别任务。以公司的门禁识别为例,这种方法有如下的缺点:
理想情况下,我们希望模型能从一张人脸照片中学会分辨这张人脸,这样每个新同事只需要上传一张照片即可。这叫做单样本学习(One-shot Learning)。
为了完成单样本学习,我们可以从另一个角度来建模人脸识别问题:如果输入的人脸和数据库里某张人脸极为相似,我们就说识别出了这张人脸;否则,就说没有识别到有效的人脸。
这样,人脸识别问题就被转换为了一个求两张图片相似度的问题。我们可以让网络学习一个输入是两张图片,输出是二者相似度的一个映射。
在完成和相似度有关的问题时,一种常见的做法是使用孪生网络(Siamese Network)。
假设网络的倒数第二层有128个神经元。在普通分类网络中,这128个神经元输出的长度为128的向量会被输入进最后的softmax层。而在孪生网络中,我们要去掉softmax层,并用这个没有sofrmax的网络 f f f分别输出两张图片 x ( 1 ) , x ( 2 ) x^{(1)}, x^{(2)} x(1),x(2)对应的128维向量 f ( x ( 1 ) ) , f ( x ( 2 ) ) f(x^{(1)}), f(x^{(2)}) f(x(1)),f(x(2))。这样,每张图片有了唯一对应的一个128维向量,这个向量可以看成是该图片的编码(encoding)。而我们又知道,对向量求相似度是很方便的。我们可以利用两张图片的编码求出相似度。
说起向量的相似度,最容易想到是向量间的距离 ∣ ∣ v − u ∣ ∣ 2 ||v - u||^2 ∣∣v−u∣∣2。因此,我们可以i设法让网络学会这样一种关系:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。