内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习使用。
文章目录
- 人脸识别
- 相关定义
- Similarity函数
- 使用Siamese网络实现函数d
- 使用Triplet损失学习参数
- 神经风格迁移
- 深度卷积网络可视化
- 神经风格迁移的代价函数
- 内容损失函数
- 风格损失函数
人脸识别
相关定义
-
人脸验证:
- 输入:图像、姓名/ID。
- 输出:判断输入图像是否为所声明的人。这是1:1的验证模式,即单一输入图像与单一声明身份进行比对。一对一对比,需要的正确率在99%。
-
人脸识别:
- 输入:获取一张输入图像。
- 输出:若数据库包含包含K个人,K = 100 。如果输入图像是数据库中K个人中的任何一个,则输出其ID;如果不是,则输出“未识别” 。一对K的识别,正确率需要很高,达到99.9%以上。
人脸识别会遇到两个问题:
-
录入的数据只有一份,也就是说,对于某个人脸,神经网络在训练的时候,只有一个数据,而不是很多的数据。
-
当前的神经网络是针对当前的数据库而训练的,如果数据库中新加了内容,难道要重新训练神经网络?
Similarity函数
定义函数 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) \leq \tau d(img1,img2)≤τ,则判断两张图像为“same(相同)” ;如果 d ( i m g 1 , i m g 2 ) > τ d(img1, img2) > \tau d(img1,img2)>τ,则判断为“different(不同)” 。
对比的过程是输入的图片和整个数据库中的图片做比较。
使用Siamese网络实现函数d
输入第一张图像 x ( 1 ) x^{(1)} x(1),经过一系列的网络层,最终经过全连接层后得到图像的编码,记为 f ( x ( 1 ) ) f(x^{(1)}) f(x(1));继续输入第二张图象 x ( 2 ) x^{(2)} x(2),也经过相同的网络层得到编码,记为 f ( x ( 2 ) ) f(x^{(2)}) f(x(2))。
计算两个特征向量之差的L2范数的平方,即 d ( x ( 1 ) , x ( 2 ) ) = ∥ f ( x ( 1 ) ) − f ( x ( 2 ) ) ∥ 2 2 d(x^{(1)}, x^{(2)}) = \|f(x^{(1)}) - f(x^{(2)})\|_2^2 d(x(1),x(2))=∥f(x(1))−f(x(2))∥22 ,衡量两张输入图像的差异程度来判断是否相似。
因为这两个网络有相同的参数,计算出的编码都可以用于函数 d d d。这是因为神经网络的参数定义了编码函数 f ( x ( 1 ) ) f(x^{(1)}) f(x(1)),输入 x ( 1 ) x^{(1)} x(1)到函数中,就会输出 x ( i ) x^{(i)} x(i)的一个编码。
使用Triplet损失学习参数
想要通过学习神经网络的参数,来获得优质的人脸图片编码,可以定义一个Triplet损失函数然后应用梯度下降。
定义:
- Anchor(锚样本,A):作为参考的样本。
- Positive(正样本,P):与Anchor属于同一类别的样本,比如同一个人的不同照片。
- Negative(负样本,N):与Anchor属于不同类别的样本,即不同人的照片。
计算:希望Anchor与Positive的特征向量距离 d ( A , P ) = ∥ f ( A ) − f ( P ) ∥ 2 d(A, P)=\|f(A) - f(P)\|^2 d(A,P)=∥f(A)−f(P)∥2小于Anchor与Negative的特征向量距离 d ( A , N ) = ∥ f ( A ) − f ( N ) ∥ 2 d(A, N)=\|f(A) - f(N)\|^2 d(A,N)=∥f(A)−f(N)∥2即 d ( A , P ) ≤ d ( A , N ) d(A, P) \leq d(A, N) d(A,P)≤d(A,N) 进一步可表示为 ∥ f ( A ) − f ( P ) ∥ 2 − ∥ f ( A ) − f ( N ) ∥ 2 + α ≤ 0 \|f(A) - f(P)\|^2 - \|f(A) - f(N)\|^2 + \alpha \leq 0 ∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+α≤0 α \alpha α是超参数,大于 0 的间隔值,避免计算出现 0 − 0 = 0 0-0=0 0−0=0的情况;同时用于加大正、负样本对之间的距离差异。假设, d ( A , P ) = 0.5 d(A, P)=0.5 d(A,P)=0.5, d ( A , N ) = 0.51 d(A, N)=0.51 d(A,N)=0.51,虽然满足不等式,但是仍不够好,加上 α \alpha α加大了正负样本之间的距离。
因此,三元组损失(Triplet Loss)函数:
给定三张图像,分别为Anchor(锚)、Positive(正样本)、Negative(负样本),记为 A A A、 P P P、 N N N。有损失函数 L ( A , P , N ) = m a x ( ∥ f ( A ) − f ( P ) ∥ 2 − ∥ f ( A ) − f ( N ) ∥ 2 + α , 0 ) L(A, P, N) = max(\|f(A) - f(P)\|^2 - \|f(A) - f(N)\|^2 + \alpha, 0) L(A,P,N)=max(∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+α,0)如果计算的结果为负值,直接用 0 0 0表示不满足结果;否则计算的结果为正值。
在训练时,假设有10000个图片的训练集,有1000个不同人的照片。使用这10000个图片生成三元组,然后训练网络。训练的三元组要选差值很小,否则不起好的效果。
神经风格迁移
神经风格迁移是将一张图像的内容与另一张图像的风格相结合,生成有特定风格的新图像。
深度卷积网络可视化
输入一张大小为 224 × 224 × 3 224 \times 224 \times 3 224×224×3的图像,经过一系列卷积层和池化层,最后连接两个全连接层(FC),维度分别为4096,最终输出 y ^ \hat{y} y^。
希望看到该网络不同隐藏单元计算结果的可视化图,在第一层隐藏单元中选取一个神经元,找出能使其激活值最大化的假设九个图像块,这九个图像块激活了神经单元,对于该层,能看见图片浅层的区域,找到了一些边缘或者线(右下角第一个块)。对该层的其他神经元重复此操作,可以看到其他的特征。
继续更深一层的卷积层,这些层的神经元会看到一张图片的更大的部分。
神经风格迁移的代价函数
定义损失函数: 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 ( G ) J(G) J(G) 是生成图像 G G G 的总损失。
- J c o n t e n t ( C , G ) J_{content}(C, G) Jcontent(C,G) 是内容图像 C C C 与生成图像 G G G 之间的内容损失,衡量二者内容的相似程。
- J s t y l e ( S , G ) J_{style}(S, G) Jstyle(S,G) 是风格图像 S S S 与生成图像 G G G 之间的风格损失,衡量二者风格的相似程度。
- α \alpha α 和 β \beta β 是超参数,调整内容损失和风格损失在总损失中的相对重要性。
内容损失函数
过程如下:
- 利用预训练的卷积神经网络(如VGG网络),选取隐藏层 l l l 来计算内容损失。 l l l一般选择网络的中间层。不要太深也不要太浅。
- 设 a [ l ] ( C ) a^{[l](C)} a[l](C) 和 a [ l ] ( G ) a^{[l](G)} a[l](G) 分别为内容图像 C C C 和生成图像 G G G 在网络隐藏层 l l l 的激活值。若二者相似,则表明两张图像内容相似, J c o n t e n t ( C , G ) = 1 2 ∥ a [ l ] ( C ) − a [ l ] ( G ) ∥ 2 J_{content}(C, G)=\frac{1}{2}\|a^{[l](C)}-a^{[l](G)}\|^2 Jcontent(C,G)=21∥a[l](C)−a[l](G)∥2 ,通过计算隐藏层激活值的均方误差来衡量内容上的差异。
风格损失函数
假设使用卷积神经网络中第 l l l层的激活值来衡量图像“风格”。风格的定义是该层不同通道激活值之间的相关性。通过这种方式,从神经网络的角度量化图像风格,在神经风格迁移等任务中,利用该定义来计算风格损失,以实现将一张图像的风格迁移到另一张图像上。
第 l l l层,假设有5个通道。如何计算前两个通道(红色和黄色)激活项的相关系数?假设在第一个通道的某个位置含有相关系数,第二个通道相同位置也包含某个激活值,它们组成一对数字,其他位置也是同样的组成很多对数字,这些数字如何计算如何计算相关系数?
在可视化中,如果红色对应的通道计算出的特征是可视化图的第二块,黄色对应通道是可视化的第四块。当这两个通道的数值有相关性,说明出现竖直线条的地方大概率颜色也是橙色的;不相关,说明出现竖直线条的地方大概率颜色不是橙色的。
设 a i , j , k [ l ] a_{i,j,k}^{[l]} ai,j,k[l] 为卷积神经网络第 l l l 层中位置 ( i , j ) (i,j) (i,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] 的矩阵( n c [ l ] n_c^{[l]} nc[l] 为第 l l l 层的通道数)。
- 风格图像 S S S: 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_{kk'}^{[l](S)} = \sum_{i = 1}^{n_H^{[l]}}\sum_{j = 1}^{n_W^{[l]}}a_{ijk}^{[l](S)}a_{ijk'}^{[l](S)} Gkk′[l](S)=∑i=1nH[l]∑j=1nW[l]aijk[l](S)aijk′[l](S)。
- 生成图像 G G G: 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_{kk'}^{[l](G)} = \sum_{i = 1}^{n_H^{[l]}}\sum_{j = 1}^{n_W^{[l]}}a_{ijk}^{[l](G)}a_{ijk'}^{[l](G)} Gkk′[l](G)=∑i=1nH[l]∑j=1nW[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 ∑ k ∑ k ′ ( G k k ′ [ l ] ( S ) − G k k ′ [ l ] ( G ) ) 2 J_{style}^{[l]}(S, G)=\frac{1}{(2n_H^{[l]}n_W^{[l]}n_c^{[l]})^2}\sum_{k}\sum_{k'}(G_{kk'}^{[l](S)}-G_{kk'}^{[l](G)})^2 Jstyle[l](S,G)=(2nH[l]nW[l]nc[l])21∑k∑k′(Gkk′[l](S)−Gkk′[l](G))2。
对于给定的卷积神经网络第 l l l 层,其通道数为 n c [ l ] n_c^{[l]} nc[l], k k k 和 k ′ k' k′ 的取值范围都是从 1 1 1 到 n c [ l ] n_c^{[l]} nc[l] 。 a i j k [ l ] ( S ) a_{ijk}^{[l](S)} aijk[l](S) 是风格图像 S S S 在第 l l l 层位置 ( i , j ) (i, j) (i,j) 、通道 k k k 处的激活值, a i j k ′ [ l ] ( S ) a_{ijk'}^{[l](S)} aijk′[l](S) 是风格图像 S S S 在第 l l l 层位置 ( i , j ) (i, j) (i,j) 、通道 k ’ k’ k’ 处的激活值 。
通过对所有空间位置 ( i , j ) (i, j) (i,j) 上,不同通道 k k k 与 k ′ k' k′ 对应的激活值乘积进行求和,得到 G k k ′ [ l ] ( S ) G_{kk'}^{[l](S)} Gkk′[l](S) 。 k k k 和 k ′ k' k′ 共同作用,获取不同通道激活值之间的相关性来定义图像的风格特征 。