04.卷积神经网络 W4.特殊应用:人脸识别和神经风格转换

文章目录

    • 1. 什么是人脸识别
    • 2. One-Shot学习
    • 3. Siamese 网络
    • 4. Triplet 损失
    • 5. 人脸验证与二分类
    • 6. 什么是神经风格迁移
    • 7. 深度卷积网络在学什么
    • 8. Cost function
    • 9. Content cost function
    • 10. Style cost function
    • 11. 一维到三维推广
    • 作业

参考:
吴恩达视频课
深度学习笔记

1. 什么是人脸识别

门禁闸机:人脸识别+活体检测

人脸验证(face verification)

  • 输入图片,ID / 人名
  • 输出图片是否是这个人(1对1问题)

人脸识别(face recognition)(1对多问题,比人脸认证更难)

  • 有 K 个人的数据库
  • 输入图片
  • 输出这个人的 ID 或者 未识别(不在数据库中)

2. One-Shot学习

人脸识别面临的挑战:要解决一次学习问题,通过单单 一张图片/人脸 就能去识别这个人

  • 然而小的训练集不足以去训练一个稳健的神经网络
  • 新人员的加入,你要重新训练吗?不是好的想法

办法: 学习 Similarity 函数,看差异是否小于某个超参数阈值


当加入了新的人,只需要将这个人与系统里的每个人,用 d 函数进行对比

3. Siamese 网络

学习目标
考查编码之差的范数
d(x(1),x(2))=∥f(x(1))−f(x(2))∥22d\left(x^{(1)}, x^{(2)}\right)=\left\|f\left(x^{(1)}\right)-f\left(x^{(2)}\right)\right\|_{2}^{2}d(x(1),x(2))=f(x(1))f(x(2))22

对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做Siamese网络架构

改变这个网络所有层的参数,得到不同的编码结果,用反向传播来改变这些所有的参数,以确保满足条件(相同的人,d 小,不同的人,d 大)

4. Triplet 损失

定义三元组损失函数然后应用梯度下降,来学习优质的神经网络参数

三元组
我们希望: ∥f(A)−f(P)∥2≤∥f(A)−f(N)∥2\|f(A)-f(P)\|^{2} \leq\|f(A)-f(N)\|^{2}f(A)f(P)2f(A)f(N)2

为了防止网络把所有的输入都学成固定的输出(也满足上式),加入一个超参数 aaa(间隔 margin)

∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+a≤0\|f(A)-f(P)\|^{2}-\|f(A)-f(N)\|^{2}+a \leq 0f(A)f(P)2f(A)f(N)2+a0

定义损失函数为:
L(A,P,N)=max⁡(∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+a,0)L(A, P, N)=\max \left(\|f(A)-f(P)\|^{2}-\|f(A)-f(N)\|^{2}+a, \quad0\right)L(A,P,N)=max(f(A)f(P)2f(A)f(N)2+a,0)

对于整个训练集:总的损失是所有的单个三元组损失之和

训练集选择原则

  • 同一个人需要有多张照片,不然不能产生足够多的数据(且AP,AN比例会不均衡)
  • 要选择比较难的组合来训练 d(A,P)≈d(A,N)d(A,P) \approx d(A,N)d(A,P)d(A,N) ,这样还可以增加学习的效率
  • 如果随机选择,其中很多样本太简单,算法不会有什么效果,因为网络总是很轻松的得到正确结果

注意:获得足够多的人脸数据不容易,可以下载别人的预训练模型,而不是一切从头开始

5. 人脸验证与二分类

Triplet loss 是一个学习人脸识别卷积网络参数的好方法,还可以把人脸识别当成一个二分类问题


把人脸验证当作一个监督学习,创建一个只有成对图片的训练集,不是三个一组,目标标签是1表示是一个人,0表示不同的人。
利用不同的成对图片,使用反向传播算法去训练Siamese神经网络。

6. 什么是神经风格迁移

7. 深度卷积网络在学什么

浅层的隐藏单元通常会找一些简单的特征,比如边缘或者颜色阴影

一个深层隐藏单元会看到一张图片更大的部分,在极端的情况下,可以假设每一个像素都会影响到神经网络更深层的输出,靠后的隐藏单元可以看到更大的图片块

8. Cost function


J(G)=α∗Jcontent(C,G)+β∗Jstyle(S,G)J(G) = \alpha*J_{\text{content}}(C,G) + \beta*J_{\text{style}}(S,G)J(G)=αJcontent(C,G)+βJstyle(S,G)

算法步骤:

  • 随机生成白噪声图片
  • 使用代价函数 J(G)J(G)J(G),梯度下降将其最小化
  • 更新 G:=G−∂∂GJ(G)G := G - \frac{\partial}{\partial G}J(G)G:=GGJ(G),更新像素值

图像生成过程

9. Content cost function

通常会选择网络的中间层 lll 出来计算损失

Jcontent (C,G)=12∥a[l][C]−a[l][G]∥2J_{\text {content }}(C, G)=\frac{1}{2}\left\|a^{[l][C]}-a^{[l][G]}\right\|^{2}Jcontent (C,G)=21a[l][C]a[l][G]2

a[l][C],a[l][G]a^{[l][C]},a^{[l][G]}a[l][C]a[l][G] 表示 lll 层的两个图片 C, G 的激活函数值

10. Style cost function

图片的风格定义为层 lll各个通道之间激活项的相关系数

style matrix 风格矩阵(又叫 Gram 矩阵):

Gkk′[l](S)=∑i=1nH[l]∑j=1nW[l]ai,j,k[l](S)ai,j,k′[l](S)G_{k k^{\prime}}^{[l](S)}=\sum_{i=1}^{n_{H}^{[l]}} \sum_{j=1}^{n_{W}^{[l]}} a_{i, j, k}^{[l](S)} a_{i, j, k^{\prime}}^{[l](S)}Gkk[l](S)=i=1nH[l]j=1nW[l]ai,j,k[l](S)ai,j,k[l](S)
Gkk′[l](G)=∑i=1nH[l]∑j=1nW[l]ai,j,k[l](G)ai,j,k′[l](G)G_{k k^{\prime}}^{[l](G)}=\sum_{i=1}^{n_{H}^{[l]}} \sum_{j=1}^{n_{W}^{[l]}} a_{i, j, k}^{[l](G)} a_{i, j, k^{\prime}}^{[l](G)}Gkk[l](G)=i=1nH[l]j=1nW[l]ai,j,k[l](G)ai,j,k[l](G)
Gkk′[l]=∑i=1nH[l]∑j=1nW[l]ai,j,k[l]ai,j,k′[l]G_{k k^{\prime}}^{[l]}=\sum_{i=1}^{n_{H}^{[l]}} \sum_{j=1}^{n_{W}^{[l]}} a_{i, j, k}^{[l]} a_{i, j, k^{\prime}}^{[l]}Gkk[l]=i=1nH[l]j=1nW[l]ai,j,k[l]ai,j,k[l]

然后两个图像的风格矩阵做差,再求 Frobenius范数,在乘以归一化常数,就得到 lll 层的风格损失

各层都使用风格代价函数,会让结果变得更好,在神经网络中使用不同的层,包括类似边缘的低级特征的层,以及高级特征的层,使得神经网络在计算风格时能够同时考虑到这些低级和高级特征


用梯度下降法,或更复杂的优化算法来找到一个合适的图像 GGG,并计算 J(G)J(G)J(G) 的最小值

11. 一维到三维推广

一维推广:

三维推广:

医学CT扫描(使用X光照射,输出身体的3D模型,CT扫描可以获取你身体不同片段)

还有例子,可以将电影中随时间变化不同视频切片看作是3D数据,将这个技术用于检测动作及人物行为

作业

作业:快乐屋人脸识别+图片风格转换

本文地址:https://michael.blog.csdn.net/article/details/108775763


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的封装,继承,多态

java的封装,继承,多态 1 封装 1.1 封装 指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的…

详解一个自己原创的正则匹配IP的表达式

第一种方法(可以匹配有点毛病):检测IP地址的正则表达式 正则表达式: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 红色块代…

天池在线编程 2020年9月26日 日常周赛题解

文章目录1. K步编辑2. 折纸3. 字符串的不同排列4. 硬币排成线题目地址,请点这 1. K步编辑 给出一个只含有小写字母的字符串的集合以及一个目标串(target),输出所有可以经过不多于 k 次操作得到目标字符串的字符串。 你可以对字符串进行一下的3种操作:…

使用parted划分GPT分区(转)

parted命令可以划分单个分区大于2T的GPT格式的分区,也可以划分普通的MBR分区,fdisk命令对于大于2T的分区无法划分,所以用fdisk无法看到parted划分的GPT格式的分区。 Parted 命令分为两种模式:命令行模式和交互模式。 1、命令行模式…

04.卷积神经网络 W4.特殊应用:人脸识别和神经风格转换(作业:快乐屋人脸识别+图片风格转换)

文章目录作业1:快乐房子 - 人脸识别0. 朴素人脸验证1. 编码人脸图片1.1 使用卷积网络编码1.2 Triplet 损失2. 加载训练过的模型3. 使用模型3.1 人脸验证3.2 人脸识别作业2:神经风格转换1. 问题背景2. 迁移学习3. 神经风格转换3.1 计算内容损失3.2 计算风…

Maven3路程(三)用Maven创建第一个web项目(1)

一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建一个包,不写也可以 5.创建好项目后,目录如下: 至此,项目已经创建…

数组排序(冒泡、排序)

目前对于数组的排序有主要的两种,一种是选择排序,一种是冒泡排序。当然大学学过数据结构的知道,还有一些其他的排序,这里就不说明了,有时间自己上网查查。其实排序在开发中并不常用, 我们学习它是学一种思想…

LeetCode 1598. 文件夹操作日志搜集器

文章目录1. 题目2. 解题1. 题目 每当用户执行变更文件夹操作时,LeetCode 文件系统都会保存一条日志记录。 下面给出对变更操作的说明: "../" :移动到当前文件夹的父文件夹。如果已经在主文件夹下,则 继续停留在当前文…

Java集合Set,List和Map等

Java集合Set,List和Map等 1 Java集合框架 因为Java是面向对象的语言,对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端 。Java集合就像一个容器&#x…

利用bootstrap框架做了一个采摘节节日活动网页

效果欣赏如下&#xff1a; 总共主要是一下两个块代码&#xff1a; 1.主题&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"width, initial-scale1.0&qu…

LeetCode 1599. 经营摩天轮的最大利润(模拟)

文章目录1. 题目2. 解题1. 题目 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但每次轮转都需要支付一定的运行成本 runningCost 。摩天轮每次轮转都恰好转动 1 / 4 周。 给你一…

LeetCode 1600. 皇位继承顺序(图的深度优先遍历)

文章目录1. 题目2. 解题1. 题目 一个王国里住着国王、他的孩子们、他的孙子们等等。每一个时间点&#xff0c;这个家庭里有人出生也有人死亡。 这个王国有一个明确规定的皇位继承顺序&#xff0c;第一继承人总是国王自己。我们定义递归函数 Successor(x, curOrder) &#xff…

Java泛型,枚举,注解

Java泛型&#xff0c;枚举&#xff0c;注解 1 泛型 1.1 什么是泛型 泛型&#xff1a;即参数化类型。在不创建新的类型的情况下&#xff0c;通过泛型指定的不同类型来控制形参具体限制的类型。允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值…

LeetCode 1601. 最多可达成的换楼请求数目(回溯+剪枝)

文章目录1. 题目2. 解题1. 题目 我们有 n 栋楼&#xff0c;编号从 0 到 n - 1 。每栋楼有若干员工。由于现在是换楼的季节&#xff0c;部分员工想要换一栋楼居住。 给你一个数组 requests &#xff0c;其中 requests[i] [fromi, toi] &#xff0c;表示一个员工请求从编号为 …

LeetCode 767. 重构字符串(堆)

文章目录1. 题目2. 解题1. 题目 给定一个字符串S&#xff0c;检查是否能重新排布其中的字母&#xff0c;使得两相邻的字符不同。 若可行&#xff0c;输出任意可行的结果。若不可行&#xff0c;返回空字符串。 示例 1: 输入: S "aab" 输出: "aba"示例 2…

LeetCode 729. 我的日程安排表 I(set 二分查找)

文章目录1. 题目2. 解题2.1 set 二分查找2.2 差分思想1. 题目 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排&#xff0c;则可以存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。 它意味着在 start 到 end 时间内增加…

开源代码分析技巧之——打印调用逻辑

开源代码分析技巧之——打印调用逻辑 在研究开源代码时&#xff0c;大家或许都有这样的感慨&#xff1a; &#xff08;1&#xff09;代码太庞大&#xff0c;少则几万行代码&#xff0c;多则几百万行代码&#xff0c;不知道如何入手&#xff1b; &#xff08;2&#xff09;相关的…

LeetCode 731. 我的日程安排表 II(set二分查找 / 差分思想)

文章目录1. 题目2. 解题2.1 set 二分查找2.2 差分思想1. 题目 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内不会导致三重预订时&#xff0c;则可以存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。 它意味着在 start 到 end 时间…

05.序列模型 W1.循环序列模型

文章目录1. 为什么选择序列模型2. 数学符号3. 循环Recurrent 神经网络模型4. 通过时间的反向传播5. 不同类型的循环神经网络6. 语言模型和序列生成7. 对新序列采样8. 循环神经网络的梯度消失9. Gated Recurrent Unit&#xff08;GRU单元&#xff09;10. LSTM&#xff08;long s…

LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)

文章目录1. 题目2. 解题1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走。 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止。 现在, 如果我们最后能走到终点&#xff0c;那么我们的起始节点是最终安全的。 更具体地说, 存在一个自然数 K…