1. 程式人生 > >SiameseNetwork實現面部識別(基於PyTorch)

SiameseNetwork實現面部識別(基於PyTorch)

參考

文章連結(這篇文章有些圖已經掛了。。)

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對影象進行測試

原作者給的程式碼有些錯誤,我改了一些地方,如有問題請多加指正。程式碼連結。

谷歌盤:權重連結

百度盤:權重連結