Siamese网络(孪生网络)
1. Why?Siamese
在人臉識別中,存在所謂的one-shot問題。舉例來說,就是對公司員工進行人臉識別,每個員工只有一張照片(因為每個類別訓練樣本少),并且員工會離職、入職(每次變動都要重新訓練模型是不現實的)。如果當成分類問題,直接訓練模型進行人臉識別在實際應用中是不可行。
為了解決one-shot問題,我們會訓練一個模型來輸出給定兩張圖像的相似度,所以模型學習得到的是similarity函數,通過對相似度設定一個閾值判斷是否屬于同一個人。
哪些模型能通過學習得到similarity函數呢?Siamese網絡就是這樣的一種模型。
2. What is Siamese network
?(Siamese網絡是一種模型設計框架,這里舉人臉驗證為例,用的是CNN模型,其他任務中可以是LSTM等模型,最早應該是[1]這篇論文)
上圖中上下兩個CNN模型的模型參數值完全相同。Siamese網絡輸出一個向量(比如上圖中是128個數值組成的一維特征向量,用于face embedding):
- 若輸入的圖像X1和X2為同一個人,則上下兩個模型輸出的一維特征向量歐氏距離較小
- 若輸入的圖像X1和X2不是同一個人,則上下兩個模型輸出的一維特征向量歐氏距離較大
所以通過對上下兩個模型輸出的向量做歐氏距離計算,就能得到輸入兩幅圖像的相似度。
3. How to train?Siamese network
對圖中的一幅照片A,如果給定了同一個人的另一幅照片P,則模型的輸出向量f(A)和f(P)應該是距離比較小的。如果給定了另一個人的照片N,則模型的輸出向量f(A)和f(N)之間的距離就比較大。所以d(A,P)<d(A,N)。
目標函數:(這里叫triple loss[2])
這個loss function 的三元組(A,P,N),表示A和P是相同類別的樣本,A和N是不同樣本的類別,最終通過梯度下降學習使得f(A)與f(P)的距離最小化,f(A)與f(N)的距離最大化。α是個超參數,用于做margin。
?
【pytorch教程】PyTorch 實現孿生網絡識別面部相似度
https://www.pytorchtutorial.com/pytorch-one-shot-learning/?
【代碼】https://github.com/harveyslash/Facial-Similarity-with-Siamese-Networks-in-Pytorch/tree/master
【代碼片段】
孿生網絡模型:
class SiameseNetwork(nn.Module):def __init__(self):super(SiameseNetwork, self).__init__()self.cnn1 = nn.Sequential(nn.ReflectionPad2d(1),nn.Conv2d(1, 4, kernel_size=3),nn.ReLU(inplace=True),nn.BatchNorm2d(4),nn.Dropout2d(p=.2),nn.ReflectionPad2d(1),nn.Conv2d(4, 8, kernel_size=3),nn.ReLU(inplace=True),nn.BatchNorm2d(8),nn.Dropout2d(p=.2),nn.ReflectionPad2d(1),nn.Conv2d(8, 8, kernel_size=3),nn.ReLU(inplace=True),nn.BatchNorm2d(8),nn.Dropout2d(p=.2),)self.fc1 = nn.Sequential(nn.Linear(8*100*100, 500),nn.ReLU(inplace=True),nn.Linear(500, 500),nn.ReLU(inplace=True),nn.Linear(500, 5))def forward_once(self, x):output = self.cnn1(x)output = output.view(output.size()[0], -1)output = self.fc1(output)return outputdef forward(self, input1, input2):output1 = self.forward_once(input1)output2 = self.forward_once(input2)return output1, output2?默認邊際價值為2的對比損失:
class ContrastiveLoss(torch.nn.Module):"""Contrastive loss function.Based on: http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf"""def __init__(self, margin=2.0):super(ContrastiveLoss, self).__init__()self.margin = margindef forward(self, output1, output2, label):euclidean_distance = F.pairwise_distance(output1, output2)loss_contrastive = torch.mean((1-label) * torch.pow(euclidean_distance, 2) (label) * torch.pow(torch.clamp(self.margin - euclidean_distance, min=0.0), 2))return loss_contrastive訓練孿生網絡:
net = SiameseNetwork().cuda() criterion = ContrastiveLoss() optimizer = optim.Adam(net.parameters(), lr=0.0005)counter = [] loss_history = [] iteration_number = 0for epoch in range(0, Config.train_number_epochs):for i, data in enumerate(train_dataloader, 0):img0, img1, label = dataimg0, img1, label = Variable(img0).cuda(), Variable(img1).cuda(), Variable(label).cuda()output1, output2 = net(img0, img1)optimizer.zero_grad()loss_contrastive = criterion(output1, output2, label)loss_contrastive.backward()optimizer.step()if i % 10 == 0:print("Epoch number {}\n Current loss {}\n".format(epoch, loss_contrastive.data[0]))iteration_number = 10counter.append(iteration_number)loss_history.append(loss_contrastive.data[0]) show_plot(counter,loss_history)?
4. Face verification supervised learning
通過孿生網絡得到人臉特征向量之后,通過監督學習(同一個人標簽為1,不是同一個人標簽為0),學習人臉特征向量每一維的權重和偏置項b。
5. RankIQA
Xialei Liu等人[4]提出RankIQA模型來評估無參考圖像的質量。之前的模型主要都是從提取特征和網絡方面做改進,并沒有考慮數據集圖像少的問題。而RankIQA正是從數據預處理出發,取得了NR-IQA最好效果。 為了解決IQA數據集不足的問題,通過已知質量的圖片使用圖像處理變換生成不同級別不同類型的排序的失真圖像。這些排序的圖像集是自動生成的,而不用人工標注。這樣就得到一個大數據集,然后就可以選擇一個更寬更深的網絡來訓練。作者首先選擇Siamese網絡學習出生成數據排序關系的表示特征,然后將訓練好的Siamese網絡中表示的知識遷移到傳統的CNN中,從而估算出單個圖像的絕對圖像質量。作者還改進了一個比傳統Siamese網絡更高效的反向傳播算法:以前Siamese網絡使用成對的樣本訓練網絡,這樣有大量樣本有重復計算,現在所有樣本只前向傳播一次,統計出loss,然后計算梯度進行反向傳播,這樣得到更快的訓練速度和更低的損失。作者實驗了三個從淺到深的網絡:Shallow,Alexnet,VGG16。Shallow包含4個卷積層和一個fc層,最后VGG16的結果最好。我們還可以訓練測試一些更深的網絡或者設計一些新網絡。作者測試TID2013表明,RankIQA超過state-of-the-art 5%,并且在LIVE測試中,RankIQA優于現有的NR-IQA技術,甚至超越了FR-IQA方法的最新技術,從而無需參考圖像就可以推斷IQA。
?
?
參考資料:
[1]?Learning a similarity metric discriminatively, with application to face verification
[2]?Hamming Distance Metric Learning
[3]?FaceNet: A Unified Embedding for Face Recognition and Clustering
[4]?RankIQA: Learning from Rankings for No-reference Image Quality Assessment
[5]?Siamese Network理解(附代碼)
[6]?詳解Siamese網絡
[7]?圖像質量評估綜述
[8]?[CVPR2019]我對Siamese網絡的一點思考(SiamMask)
?
學習資源:
1、https://mooc.study.163.com/course/2001281004?tid=2001392030&_trace_c_p_k2_=31afb2dc55f54ae6a5fe7e180c85f01b#/info
2、https://www.bilibili.com/video/av73508741?p=33
總結
以上是生活随笔為你收集整理的Siamese网络(孪生网络)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn之回滚到指定版本
- 下一篇: 多模态语义分析_「CV学霸开讲」卷积神经