文章目录

  • 人脸识别的限制
  • 孪生网络架构
  • 三胞损失(Triplet Loss)
  • 二元分类

人脸识别的限制

人脸识别的主要限制来源于数据集,对于我们想要用人脸识别管理的团队or公司,其中每个人的图像数据都非常有限,达不到我们训练深度网络动辄上千上万的要求。另外,如果训练一个对应团队内所有成员的多元分类器,当团队新增成员的时候训练工作就要推倒重来,非常地消耗算力。这种样本非常有限,乃至于只有一个样本的学习任务,就被称作单样本学习(one shot learning)

为了解决这种问题,我们不如转换一下思路,将多元分类问题转换为相似度比较问题。对于给定的两张照片,我们要求网络判断他们的差异值有多大,输出一个量化的实数,若该差异值低于某个阈值,我们就认为两张图片上是同一个人;反之则认为两者并不是同一人。这样,我们的核心算法就变成了一个相似度比较算法,当团队中新加入成员时,不需要对网络做任何修改,只需要把新成员的照片存入数据库即可。

孪生网络架构


在普通的CNN中,我们输入一张图片,经过卷积层、池化层、全连通层等等,最后得到一个多维列向量(比如128维),这128维储存了由输入的人像图片经过复杂运算得到的特征值,我们可以通过比对两张图像的特征向量,来得到两个人脸相似度的量化结果。由于两张图像通过的网络是完全相同的,因此这个架构被称为孪生网络架构。

要计算两个特征向量差异有多大,可以通过两向量之差的模长的平方来判断,即
d(x(i),x(j))=∣∣f(x(i))−f(x(2))∣∣22d(x^{(i)},x^{(j)})=||f(x^{(i)})-f(x^{(2)})||_2^2 d(x(i),x(j))=∣∣f(x(i))−f(x(2))∣∣22​

在训练网络的过程中,我们希望达到的效果就是,若两张照片中是同一个人,我们希望d(x(i),x(j))d(x^{(i)},x^{(j)})d(x(i),x(j))尽量小;若两张照片里不是同一个人,则希望d(x(i),x(j))d(x^{(i)},x^{(j)})d(x(i),x(j))尽量大。为了达到这样的效果,我们引入了三胞损失。

三胞损失(Triplet Loss)

为了定义训练的损失函数,我们采用三胞损失函数计算,这里的三胞指的是三张照片,其中两张是来自同一个人(anchor和positive),另一张是干扰项(negative)。我们希望由同一个人的两张照片计算出的差异值d(A,P)d(A,P)d(A,P)能小于等于来自不同的人的两张照片d(A,N)d(A,N)d(A,N)。且为了防止网络“摆烂”,即网络对于任何照片都输出相同的特征值,我们还设置了边距α\alphaα,最终我们的期望是
d(A,P)−d(A,N)+α≤0d(A,P)-d(A,N)+\alpha\le 0 d(A,P)−d(A,N)+α≤0

如此,通过调整α\alphaα,我们能控制网络分辨两张照片是否为同一人的严格程度。最后,定义损失函数如下,当区分度足够的时候损失为0,而区分度不够的时候就以多出来的部分作为损失:
L(A,P,N)=max⁡(d(A,P)−d(A,N)+α,0)\mathcal{L}(A,P,N)=\max(d(A,P)-d(A,N)+\alpha,0) L(A,P,N)=max(d(A,P)−d(A,N)+α,0)同理可得代价函数
J(⋯)=∑i=1mL(A(i),P(i),N(i))J(\cdots)=\sum_{i=1}^m\mathcal{L}(A^{(i)},P^{(i)},N^{(i)}) J(⋯)=i=1∑m​L(A(i),P(i),N(i))
要训练一个可靠的网络,大概需要有1k1k1k个人的10k10k10k张照片,也就是平均一人十张照片。不过在训练结束后,该网络就可用于单样本问题,即使你只有待检测成员的一张照片,它也能完成识别任务。

另外,在选择三胞损失中的第三张混淆照片时,如果随机的选择一张其他人的照片,网络很容易就能达到d(A,P)−d(A,N)+α≤0d(A,P)-d(A,N)+\alpha\le 0d(A,P)−d(A,N)+α≤0的要求,最好选择一些长相相似分辨难度高的混淆项,让网络的功能更强大。

二元分类

除了三胞损失,我们还可以将两个列向量作为输入给到一个二元分类网络中,输出1表示是同一个人,0表示不是同一个人。通过训练,使分类器能够通过获得一个合适的权重,能够在运算后输出两张照片是一个人的概率。
y^=σ(∑k=1nwi∣f(x(i))k−f(x(j))k∣+b)\hat{y}=\sigma(\sum_{k=1}^nw_i|f(x^{(i)})_k-f(x^{(j)})_k|+b) y^​=σ(k=1∑n​wi​∣f(x(i))k​−f(x(j))k​∣+b)
除了把两个特征向量之差的绝对值作为输入特征,还有其他的变种,比如χ2\chi^2χ2公式:
(f(x(i))k−f(x(j))k)2f(x(i))k+f(x(j))k\frac{(f(x^{(i)})_k-f(x^{(j)})_k)^2}{f(x^{(i)})_k+f(x^{(j)})_k} f(x(i))k​+f(x(j))k​(f(x(i))k​−f(x(j))k​)2​

虽然理论上的网络架构仍然是孪生网络,意味着我们要输入两张图片在两个一样的网络上运算。实际上对于数据库里用来对比的图片,我们可以预先计算出特征向量,这样进行人脸识别的时候只需计算待检测人脸的特征向量即可,节省一半的算力。

深度学习:人脸识别算法孪生网络(Siamese Network)相关推荐

  1. 「每周CV论文推荐」 初学深度学习人脸识别和验证必读文章

    欢迎来到<每周CV论文推荐>.在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的. 人脸识别和验证是当前人脸图像在身份认证领域中 ...

  2. 【每周CV论文推荐】 初学深度学习人脸识别和验证必读文章

    欢迎来到<每周CV论文推荐>.在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的. 人脸识别和验证是当前人脸图像在身份认证领域中 ...

  3. 【论文学习】人脸识别——DeepFace:深度学习人脸识别开山之作

    大家好,从今天开始就要学习人脸识别相关的知识啦,以后也会分享这一类的文章.人脸识别,必不可少的是Facebook AI研究院的这篇. 论文:DeepFace: Closing the Gap to H ...

  4. python人脸深度识别_基于Python的深度学习人脸识别方法

    基于 Python 的深度学习人脸识别方法 薛同来 ; 赵冬晖 ; 张华方 ; 郭玉 ; 刘旭春 [期刊名称] <工业控制计算机> [年 ( 卷 ), 期] 2019(032)002 [摘 ...

  5. 深度学习人脸识别核心技术—框架和优化目标

    注:本文选自人脸图像资深工程师言有三出版的新书<深度学习之人脸图像处理:核心算法与案例实战>(机械工业出版社出版)的6.2节,略有改动.经授权刊登于此. 人脸识别本质上是一个人脸验证和匹配 ...

  6. 如何走近深度学习人脸识别?你需要这篇超长综述 | 附开源代码

    作者丨葛政 学校丨早稻田大学硕士生 研究方向丨深度学习,计算机视觉 个人博客丨Xraft.Lab 相信做机器学习或深度学习的同学们回家总会有这样一个烦恼:亲朋好友询问你从事什么工作的时候,如何通俗地解 ...

  7. OpenCV深度学习人脸识别示例——看大佬如何秀恩爱

    (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 提到OpenCV人脸识别,你是否还停留在Haar级联人脸检测+LBP特征人脸识别上?对于小规模数据库如何用Open ...

  8. 【毕业设计】深度学习人脸识别系统 - python opencv 卷积神经网络

    文章目录 0 简介 1 人脸识别 - 常用实现技术 1.1 基于几何特征的人脸识别方法 1.2 初级神经网络方法. 1.3 深度学习方法. 2 人脸识别算法缺陷 3 人脸识别流程 3.1 相关数据集 ...

  9. python识别人脸多种属性_深度学习人脸识别仅9行python代码实现?同时高效处理100张相片?...

    随着人脸识别.视频结构化等计算视觉相关技术在安防.自动驾驶.手机等领域走向商业化应用阶段,计算视觉技术行业市场迎来大规模的爆发.伴随人脸识别.物体识别等分类.分割算法不断提升精度.计算视觉的核心算法深 ...

  10. 每周AI应用方案精选:虹膜识别;基于深度学习人脸识别方案等

    2019-12-12 17:52:41 每周三期,详解人工智能产业解决方案,让AI离你更近一步. 解决方案均选自机器之心Pro行业数据库. 方案1:虹膜识别解决方案 解决方案简介: 虹膜识别技术是基于 ...

最新文章

  1. plsql 为空显示 0 的函数_记住这三个检测函数,彻底清除公式当中的0值
  2. 滇西应用技术大学计算机专业在哪里,滇西应用技术大学
  3. struts2中s:select标签的使用
  4. 技术系列课|从0到1 构建实时音视频引擎
  5. UNIX(多线程):13---condition_variable、wait、notify_one、notify_all
  6. com+ system application 启动_dubbo启动引导过程(基于2.7.9)
  7. Win10乱码了怎么解决 Win10系统乱码解决办法
  8. 使用Akka持久化——消息发送与接收
  9. uva10256 凸包
  10. java day50【综合案例day02】
  11. Php调用工行支付接口时的问题解决
  12. 智能公交监控调度系统技术方案,等车不再等到心碎
  13. 如何用pe备份linux系统盘,使用轻松备份创建可启动光盘或U盘
  14. 企业微信自建内部应用Demo源码,附在线Demo及视频讲解,创建测试公司及测试应用简单配置即可使用
  15. 计算机的垃圾站是在硬盘,电脑垃圾回收站在哪里
  16. html文档字符间距怎么设置,Pages字符间距怎么设置 Pages字符间距设置教程
  17. 论文阅读笔记:A Network-based End-to-End Trainable Task-oriented Dialogue System
  18. 【看表情包学Linux】软件包管理器 yum | Vim 编辑器介绍 | Vim 文本批量化操作 | 配置 Vim
  19. 小甲鱼Python3笔记
  20. python图片自动上色_老旧黑白片修复机——使用卷积神经网络图像自动着色实战(附PyTorch代码)...

热门文章

  1. 【POJ 3279】【开关问题】Fliptile【暑期 No.5】
  2. Android studio 报错Failed to open zip file解决方法
  3. 多媒体计算机主机有哪些硬件,现在市场上多媒体电脑主要有哪些硬件部分组成?...
  4. mat opencv 修改roi_OpenCV开发笔记(七十三):红胖子8分钟带你使用opencv+dnn+yolov3识别物体...
  5. java多线程工具类_Java多线程同步工具类之Semaphore
  6. wordpress 关于裁剪图片错误问题
  7. Python3 函数参数
  8. [ZT]用CSC.exe来编译Visual C#的代码文件,解释CSC参数和开关的具体作用
  9. Netty之大名鼎鼎的EventLoop
  10. 【Shiro第九篇】SpringBoot + Shiro整合JWT