2018年11月版本
Week 13
面部识别 Face Recognition
- 面部验证:输入图片和身份ID,输出对于生成的人,这张输入图像是不是这个人(1:1问题)
- 面部识别:具有一个K个人的数据集,给出一张输入图像,输出其在这K个人中的身份ID(1:K问题)
- 对于面部验证,可能99%准确率已经足够,但是应用于面部识别场景,则需要更高的准确率
单样本学习 One-shot Learning
- 根据一个训练样本进行样本的识别,但是在一个训练样本的前提下,深入的学习算法并不能表现很好
- 对于面部识别应用,需要做到从一个样本中学习,同时认出这个人
- 一个样本的训练难以提升系统整体的鲁棒性
- 此外还要考虑新加入样本(目标类之一)后的训练策略
- 解决方案:学习一个相似度函数 d ( i m g 1 , i m g 2 ) = 两 张 图 片 之 间 的 区 别 程 度 d(img1, img2)=两张图片之间的区别程度 d(img1,img2)=两张图片之间的区别程度
- 尝试确定一个阈值 τ \tau τ,当 d ( i m g 1 , i m g 2 ) ≤ τ d(img1, img2) \le \tau d(img1,img2)≤τ时,认为两张图片是相似的
- 这样,在进行单样本学习时,我们只需要比较输入与个既有类别之间的相似度,来判断输入的类别
孪生网络 Siamese Network
- 将所有输入样本 x ( i ) x^{(i)} x(i)(图片)送入一个卷积网络,不使用softmax输出分类结果,保留最后一个FC的编码,称其为对这张图面的编码,记为 f ( x ( i ) ) f(x^{(i)}) f(x(i))
- 对所有图片通过同一网络产生这样的编码,我们可以定义 d ( x ( i ) , x ( j ) ) = ∣ ∣ f ( x ( i ) ) − f ( x ( j ) ) ∣ ∣ 2 2 d(x^{(i)},x^{(j)})=||f(x^{(i)})-f(x^{(j)})||_2^2 d(x(i),x(j))=∣∣f(x(i))−f(x(j))∣∣22
- 参考文献:Taigman et. al., 2014. DeepFace closing the gap to human level performance
- 产生编码的是同一个网络,即NN的参数决定了编码
- 训练思路:对同一个人的图片 x ( i ) , x ( j ) x^{(i)},x^{(j)} x(i),x(j), ∣ ∣ f ( x ( i ) ) − f ( x ( j ) ) ∣ ∣ 2 2 ||f(x^{(i)})-f(x^{(j)})||_2^2 ∣∣f(x(i))−f(x(j))∣∣22很小;对不同人的图片 x ( i ) , x ( j ) x^{(i)},x^{(j)} x(i),x(j), ∣ ∣ f ( x ( i ) ) − f ( x ( j ) ) ∣ ∣ 2 2 ||f(x^{(i)})-f(x^{(j)})||_2^2 ∣∣f(x(i))−f(x(j))∣∣22很大
- 使用反向传播以使网络满足上述条件
三重损失函数 Triplet Loss
- 查看锚照片(Anchor,A),然后得到锚照片与正例照片(Positive,P)的差距很小,同时对反例照片(Negative,N)的差距会觉得很大
- 同时查看三张图片,获取和三元相关的损失
- 形式化地,应当使编码的神经网络的参数拥有如下性质:
- d ( A , P ) = ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 2 ≤ ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 2 = d ( A , N ) d(A,P)=||f(A)-f(P)||_2^2 \le ||f(A)-f(N)||_2^2=d(A,N) d(A,P)=∣∣f(A)−f(P)∣∣22≤∣∣f(A)−f(N)∣∣22=d(A,N)
- 有一种比较麻烦的情况,就是当所有的输出都接近0时(即编码无效),上式还会成立
- 还有一种退化情况是,所有图片的编码都可能相同
- 为避免输出退化解,应修正为 ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 2 + α ≤ 0 ||f(A)-f(P)||_2^2 - ||f(A)-f(N)||_2^2 + \alpha \le 0 ∣∣f(A)−f(P)∣∣22−∣∣f(A)−f(N)∣∣22+α≤0
- 上式的 α \alpha α称为间距(Margin)
- 给定三张图片A,P和N,定义损失函数 L ( A , P , N ) = max ( ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 2 + α , 0 ) L(A,P,N)=\max(||f(A)-f(P)||_2^2 - ||f(A)-f(N)||_2^2 + \alpha,0) L(A,P,N)=max(∣∣f(A)−f(P)∣∣22−∣∣f(A)−f(N)∣∣22+α,0)
- 整体损失函数 J = ∑ i = 1 m L ( A ( i ) , P ( i ) , N ( i ) ) J=\sum\limits_{i=1}^{m}L(A^{(i)},P^{(i)},N^{(i)}) J=i=1∑mL(A(i),P(i),N(i))
- 是用训练集生成上述的三元组,使用三元损失进行梯度下降的学习
- 为了满足要求,必须确保三元组内有一对来自同一个人的图片,因此当数据集中每个人只有一张图片时,将无法完成训练
- 选择APN
- 一个麻烦的情况:当随机选择APN并要求A和P相同,A和N不同,上面的限制就非常容易满足
- 应当选择比较难训练的A,P和N,即 d ( A , P ) d(A,P) d(A,P)与 d ( A , N ) d(A,N) d(A,N)非常接近
- 网络会学习取尽可能将其分开
- 参考文献:Schroff et al., 2015, FaceNet: A unified embedding for face recognition and clustering
- 实践建议:使用他人基于千万计甚至亿计的数据集训练的模型进行改进和提升
人脸验证和二元分类 Face Verification and Binary Classification
- 将人脸识别过程当成二元分类:使用孪生网络生成编码(embeddings),再根据生成的编码输入到逻辑回归单元做出预测,其是否为同一个人(1为相同)
- 一种可行的逻辑分类过程为 y ^ = σ ( ∑ k = 1 128 w i ∣ f ( x ( i ) ) k − f ( x ( j ) ) k ∣ + b ) \hat y = \sigma(\sum\limits_{k=1}^{128}w_i|f(x^{(i)})_k-f(x^{(j)})_k|+b) y^=σ(k=1∑128wi∣f(x(i))k−f(x(j))k∣+b),将128个值是为输入特征,根据这些特征训练参数
- 绝对值部分可替换为 X 2 \Chi^2 X2公式: ( f ( x ( i ) ) k − f ( x ( j ) ) k ) 2 f ( 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
- 一种加快计算的技巧:将数据库图片的编码提前计算(precompute)并保存,只对新图片现场计算编码,再将二者送入逻辑回归单元
- 预计算同样适用于三重损失的训练系统中
神经风格迁移 Neural Style Transfer
- 根据风格图像(S)的画面风格,将输入图像(C)的内容处理成具有S风格的输出(G)
- 实现神经风格转移,需要查看卷积神经网络在不同层中提取的特征,包括浅层和深层的特征
- 感受域(receptive field):产生高度激活的输入部分
- 浅层的神经元更加关注边缘和色彩等简单的特征,随着深度加深,神经元更加关注纹理,物体的形状以及物体本身等复杂的特征
风格迁移的代价函数 Cost Function
- 风格迁移的代价函数
J
(
G
)
=
α
J
c
o
n
t
e
n
t
(
C
,
G
)
+
β
J
s
t
y
l
e
(
S
,
G
)
J(G)=\alpha J_{content}(C,G) + \beta J_{style}(S,G)
J(G)=αJcontent(C,G)+βJstyle(S,G)
- J c o n t e n t ( C , G ) J_{content}(C,G) Jcontent(C,G),内容代价,即生成图像与源图像之间内容的相似度
- J s t y l e ( S , G ) J_{style}(S,G) Jstyle(S,G),风格代价,即生成图像与风格图像之间风格的相似度
- α , β \alpha,\beta α,β用于调整两个代价值对最终代价值的影响比重
- 参考文献:Gatys et al., 2015. A neural algorithm of artistic style
- 寻找生成图像G
- 随机初始化G,其尺寸可以为 100 × 100 × 3 100 \times 100 \times 3 100×100×3
- 使用梯度下降来最小化 J ( G ) J(G) J(G)
内容代价函数 Content Cost Function
- 假设使用隐藏层 l l l来计算内容代价
- 使用一个较浅层,我们可以得到一个像素程度上与内容图像非常接近的图像;如果使用较深层,则会抽象到非常简略的内容上(原图有只狗,只要求生成结果也有一只狗,狗相比怎么样不关心)
- l l l应当选择中间的某一层
- 使用一个预训练的卷积网络
- 令 a [ l ] ( C ) a^{[l](C)} a[l](C)和 a [ l ] ( G ) a^{[l](G)} a[l](G)为两张图片在 l l l层的激活值
- 如果 a [ l ] ( C ) a^{[l](C)} a[l](C)和 a [ l ] ( G ) a^{[l](G)} a[l](G)是相似的(激活值差异程度),那么认为两张图片在内容上也是相似的
- 定义 J c o n t e n t ( C , G ) = 1 2 ∣ ∣ a [ l ] ( C ) − a [ l ] ( G ) ∣ ∣ 2 J_{content}(C,G)=\frac12||a^{[l](C)}-a^{[l](G)}||^2 Jcontent(C,G)=21∣∣a[l](C)−a[l](G)∣∣2
风格代价函数 Style Cost Function
- 假设使用隐藏层 l l l来计算风格代价
- 定义“风格”为不同激活通道之间的相关系数(correlation)
- 不同通道之间的相关性描述了不同的高级特征之间多经常出现以及多经常一同出现
- 计算风格矩阵
- 令 a i , j , k [ l ] a^{[l]}_{i,j,k} ai,j,k[l]表示在 l l l层的 i i i高度, j j j宽度以及 k k k通道上的激活值
- 风格矩阵 G [ l ] G^{[l]} G[l]的维数是 n c [ l ] × n c [ l ] n_c^{[l]} \times n_c^{[l]} nc[l]×nc[l],那么 G k k ′ [ l ] G^{[l]}_{kk^\prime} Gkk′[l]表示通道 k k k和通道 k ′ k^\prime k′激活之间的相关性
- G k k ′ [ l ] ( S ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i j k [ l ] ( S ) a i j k ′ [ l ] ( S ) G^{[l](S)}_{kk^\prime}=\sum\limits_{i=1}^{n_H^{[l]}}\sum\limits_{j=1}^{n_W^{[l]}}a^{[l](S)}_{ijk}a^{[l](S)}_{ijk^\prime} Gkk′[l](S)=i=1∑nH[l]j=1∑nW[l]aijk[l](S)aijk′[l](S),同样有 G k k ′ [ l ] ( G ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i j k [ l ] ( G ) a i j k ′ [ l ] ( G ) G^{[l](G)}_{kk^\prime}=\sum\limits_{i=1}^{n_H^{[l]}}\sum\limits_{j=1}^{n_W^{[l]}}a^{[l](G)}_{ijk}a^{[l](G)}_{ijk^\prime} Gkk′[l](G)=i=1∑nH[l]j=1∑nW[l]aijk[l](G)aijk′[l](G)
- J s t y l e [ l ] ( S , G ) = 1 ( 2 n H [ l ] n W [ l ] n C [ l ] ) 2 ∣ ∣ G [ l ] ( S ) − G [ l ] ( G ) ∣ ∣ F 2 = 1 ( 2 n H [ l ] n W [ l ] n C [ l ] ) 2 ∑ k ∑ k ′ ( G k k ′ [ l ] ( S ) − G k k ′ [ l ] ( G ) ) 2 J^{[l]}_{style}(S,G)=\frac1{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})^2}||G^{[l](S)}-G^{[l](G)}||^2_F=\frac1{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})^2}\sum\limits_{k}\sum\limits_{k^\prime}(G^{[l](S)}_{kk^\prime}-G^{[l](G)}_{kk^\prime})^2 Jstyle[l](S,G)=(2nH[l]nW[l]nC[l])21∣∣G[l](S)−G[l](G)∣∣F2=(2nH[l]nW[l]nC[l])21k∑k′∑(Gkk′[l](S)−Gkk′[l](G))2
- 结合浅层和深层不同特征之间的相关性,定义 J s t y l e ( S , G ) = ∑ l λ [ l ] J s t y l e [ l ] ( S , G ) J_{style}(S,G)=\sum\limits_{l}\lambda^{[l]}J^{[l]}_{style}(S,G) Jstyle(S,G)=l∑λ[l]Jstyle[l](S,G)
1D和3D的泛化 1D and 3D Generalizations
- 没啥区别好像……就是将二维情况推广到一维和三维,处理过程和计算方式都没有变化