deeplearning.ai 卷积神经网络 Week 4 特殊应用:人脸识别和神经风格转换
本周课程的主题是两大应用:人脸检测和风格迁移。
1. Face verification vs. face recognition
Verification: 一对一的问题。
1) 输入:image, name/ID.
2) 输出:image是否对应这个name/ID。
Recognition: 一对多的问题。
1) 数据库存了K个人。
2)输入:图片。
3)输出:如果图片中的人属于数据库,则输出ID;否则显示“not recognized”。
Verification是基础组建,正确率足够高之后,则可以用于recognition。
2. One-shot learning
人脸检测比较难的地方在于只能通过一个样本来进行学习。对于常规的卷积神经网络(CONV -> softmax),表现很差,因为单个样本不足以训练鲁棒的神经网络;另一方面,如果加入新人,softmax的输出就得多一个元素,这意味着要重新训练网络。
解决的办法是学习“similarity”函数:d(img1, img2) = degree of difference between images. 如果d(img1, img2)小于某个阈值(这是一个超参数),则判断同一个人;否则判断是不同的人。
3. Siamese network(Taigman et. al., 2014. DeepFace closing the gap to human level performance.)
常规的卷积神经网络在卷积层、池化层、全连接层等之后会得到n*1的向量,然后把这个向量送入softmax函数,得到具体分类。Siamese network舍弃了最后的softmax层,把n*1(比如128*1)的向量 f(x(k)) 作为输入图片 x(k) 的编码,两张图片的相似性就用这个编码的差的范数 d(img i, img j)=||f(x(i))-f(x(j))||2 来表征。神经网络不同的权重参数,可以计算出不同的编码。我们训练网络的目的就是训练出一组编码,使得对于相同得人的图片d(img i, img j)足够高,对于不同的人的图片d(img i, img j)足够低。
4. Triplet loss(Schroff et al., FaceNet: A unified embedding for face reconition and clustering.)
叫triplet的原因是会同时看三张图片,一张是参照图片Anchor,一张是正例(Positive),一张是反例(Negative)。我们希望 d(A, P)+α≤d(A, N),其中d(A, P)=||f(A)-f(P)||2,d(A, N)=||f(A)-f(N)||2,α是margin。
单个样本的 Loss function: L(A, P, N) = max( ||f(A)-f(P)||2 - ||f(A)-f(N)||2 + α, 0),这里加上max的意思是只要小于等于0就可以了,不在乎让loss function更小。
整个网络的 Cost function:J = ∑L(A(i), P(i), N(i))。训练集可能是1000个人的10k张图片,把这10k张图片组合成(A, P, N)的三元组来训练网络。注意,这里需要同一个人的一对图片A和P,如果训练集里每个人只有一张图片,这个算法是训练不了的。训练好网络之后,可以每个人只有一张照片。
如何组合(A, P, N)三元组?如果随机选择,那么d(A, P)+α≤d(A, N)太容易训练了。所以我们要找难训练的,即d(A, P) ≈ d(A, N)的情况,神经网络会努力让左边的变小,右边的变大。
5. 二分类的算法(Taigman et. al., 2014. DeepFace closing the gap to human level performance.)
不同于triplet loss的算法,也可以把人脸检测定义为二分类问题,用同一个神经网络把任意两张图片分别转成编码,然后用sigmoid处理编码,如果是同一个人则输出1,否则输出0。
预测的分类 y_hat = σ( ∑wk|f(x(i))k - f(x(j))k| +b),这里σ()是sigmoid函数,f(x(i))k表示图片x(i)的编码f(x(i))的第k个元素,如果编码一共128个元素,则求和符号就是做128次加法。也可以选择其他的预测函数,比如 y_hat = σ( ∑wk (f(x(i))k - f(x(j))k)2 / (f(x(i))k + f(x(j))k)+b),这是χ2相似度(Kai平方)。
实际部署的时候,x(i)是要检测的新图片,x(j)是数据库里的图片,数据库里的图片可以不用每次都计算,可以直接预先计算(precompute)好编码f(x(j)),这样只需要每次计算x(i)的编码就行了。
6. 风格迁移(Gatys et. al., 2015. A neural algorithm of artistic style.)
一张内容(Content)图片C,一张风格(Style)图片S,生成(Generate)一张新的图片G。
Cost function: J(G) = αJcontent(C, G)+βJstyle(S, G)。前者评估C和G的相似度,后者评估S和G的相似度,α和β是权重(NG说这边一个超参数就够了,但原文作者使用了两个)。具体算法是:1)用随机数初始化G,得到一张白噪声的图片;2)梯度下降最小化J(G)。
Content cost function:用一个预训练过得卷积神经网络(比如VGG),选其中不要太浅(会非常具体地要求两张图片尽量相同)也不要太深(会非常抽象地检测图片中是否有狗)的隐藏层l。假设a[l](C)和a[l](C)分别表示内容图片C和生成图片G在第l层的激活函数值,如果这两个激活值相似,则两张图片内容相似。Jcontent(C, G) = 1/2*||a[l](c) - a[l](G)||2,对应元素的差的平方和。
Style cost function:图片的风格是用图片不同通道间的相关性来表征的。计算出两张图片在每一个隐藏层的style matrix的差,然后把所有层的都加起来。
7. 卷积神经网络主要针对2D的图像,但也可以推广到1D和3D的情况
1D的例子:心电图诊断,1*14的信号和1*5的filter做卷积(和图像一样,这里其实也是相关,因为信号没有flip),在信号中找filter类似的特征。如果信号有不同的通道,则filter对应的也有那么多通道。
3D的例子:CT诊断,14*14*14*1的数据和5*5*5*1的filter做卷积,最后一个数字1是指通道数量。另一个应用是视频中检测物体、人物行为等。