SiameseNetwork實現面部識別(基於PyTorch)
阿新 • • 發佈:2018-12-22
參考
文章連結(這篇文章有些圖已經掛了。。)
SiameseNetwork又叫孿生網路---詳細的介紹可以看這篇文章
網路的基本架構如圖
下面直接介紹:
1.資料集
資料集採用的是AT&T面部資料集,裡面是一些以pgm字尾的影象檔案,可以用Sublime Text開啟
是P5格式的,寬度為92,高度為112
用python進行視覺化可以參考下面的程式碼
from PIL import Image import matplotlib.pyplot as plt import numpy as np import os path="F:/Facial-Siamese/Siamese-Networks/data/faces/testing/s7/" files=os.listdir(path) for i in files: im = Image.open(path+i) im.show() i=i[:len(i)-4] #print(i) im.save(path+i+".bmp")
視覺化的同時,我給轉換成了bmp檔案,其實兩種格式的檔案都可以用來訓練。
2.網路架構
採用CNN架構,每次卷積後進行了批量歸一化(BatchNorm),然後dropout
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.ReflectionPad2d(1), nn.Conv2d(4, 8, kernel_size=3), nn.ReLU(inplace=True), nn.BatchNorm2d(8), nn.ReflectionPad2d(1), nn.Conv2d(8, 8, kernel_size=3), nn.ReLU(inplace=True), nn.BatchNorm2d(8), ) 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 output def forward(self, input1, input2): output1 = self.forward_once(input1) output2 = self.forward_once(input2) return output1, output2
3.對比損失
class ContrastiveLoss(torch.nn.Module): def __init__(self, margin=2.0): super(ContrastiveLoss, self).__init__() self.margin = margin def 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))
4.訓練
batch=64
epoch=200
用.bmp型別的圖片訓練
5.測試
用10對影象進行測試
原作者給的程式碼有些錯誤,我改了一些地方,如有問題請多加指正。程式碼連結。
谷歌盤:權重連結
百度盤:權重連結