自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用深度學(xué)習(xí)的方法進行人臉解鎖

人工智能 深度學(xué)習(xí)
使用深度學(xué)習(xí)來創(chuàng)建面部解鎖算法需要三個主要部分:查找人臉的算法;一種將人臉嵌入向量空間的方法;比較已編碼人臉的函數(shù)

 [[390275]]

 

今天,我們將使用深度學(xué)習(xí)來創(chuàng)建面部解鎖算法。 要完成我們的任務(wù)需要三個主要部分。

  • 查找人臉的算法
  • 一種將人臉嵌入向量空間的方法
  •  比較已編碼人臉的函數(shù)

人臉面孔查找和定位

首先,我們需要一種在圖像中查找人臉的方法。 我們可以使用一種稱為MTCNN(多任務(wù)級聯(lián)卷積網(wǎng)絡(luò))的端到端方法。

只是一點技術(shù)背景,所以稱為Cascaded,因為它由多個階段組成,每個階段都有其神經(jīng)網(wǎng)絡(luò)。 下圖顯示了該框架。

 

 

我們依靠facenet-pytorch中的MTCNN實現(xiàn)。

數(shù)據(jù)

我們需要圖像! 我整理了一些照片,萊昂納多·迪卡普里奧和馬特·戴蒙。

遵循PyTorch最佳做法,我使用ImageFolder加載數(shù)據(jù)集。 我創(chuàng)建了MTCNN實例,并使用transform參數(shù)將其傳遞給數(shù)據(jù)集。

我的文件夾結(jié)構(gòu)如下:

  1. ./faces  
  2. ├── di_caprio  
  3. │   ├── ....jpg  
  4. ├── matt_demon  
  5. │   ├── ....jpg  
  6. └── me  
  7. │   ├── ....jpg  

 

MTCNN自動裁剪輸入并調(diào)整其大小,我使用image_size = 160,因為模型將使用具有該尺寸的圖像進行訓(xùn)練。 我還要添加18像素的邊距,以確保我們包括整個臉部。

  1. import torch  
  2. import torchvision.transforms as T  
  3. import matplotlib.pyplot as plt  
  4.   
  5. from torch.utils.data import Dataset, DataLoader  
  6. from torchvision.datasets import ImageFolder  
  7. from facenet_pytorch import MTCNN, InceptionResnetV1  
  8. from pathlib import Path  
  9. from typing import Union, Callable  
  10.   
  11. data_root = Path('.')  
  12. create the MTCNN network  
  13. transform = MTCNN(image_size=160, margin=18)  
  14.   
  15. ds = ImageFolder(root=data_root / 'faces', transform=transform)  
  16. # our dataset is so small that the batch_size can equal to its lenght  
  17. dl = DataLoader(ds, batch_size=len(ds))  
  18.   
  19. ds[1]  

 

ds結(jié)構(gòu)如下:

  1. (tensor([[[ 0.9023, 0.9180, 0.9180, ..., 0.8398, 0.8242, 0.8242], [ 0.9023, 0.9414, 0.9492, ..., 0.8555, 0.8320, 0.8164], [ 0.9336, 0.9805, 0.9727, ..., 0.8555, 0.8320, 0.7930], ..., [-0.7070, -0.7383, -0.7305, ..., 0.4102, 0.3320, 0.3711], [-0.7539, -0.7383, -0.7305, ..., 0.3789, 0.3633, 0.4102], [-0.7383, -0.7070, -0.7227, ..., 0.3242, 0.3945, 0.4023]], [[ 0.9492, 0.9492, 0.9492, ..., 0.9336, 0.9258, 0.9258], [ 0.9336, 0.9492, 0.9492, ..., 0.9492, 0.9336, 0.9258], [ 0.9414, 0.9648, 0.9414, ..., 0.9570, 0.9414, 0.9258], ..., [-0.3633, -0.3867, -0.3867, ..., 0.6133, 0.5352, 0.5820], [-0.3945, -0.3867, -0.3945, ..., 0.5820, 0.5742, 0.6211], [-0.3711, -0.3633, -0.4023, ..., 0.5273, 0.6055, 0.6211]], [[ 0.8867, 0.8867, 0.8945, ..., 0.8555, 0.8477, 0.8477], [ 0.8789, 0.8867, 0.8789, ..., 0.8789, 0.8633, 0.8477], [ 0.8867, 0.9023, 0.8633, ..., 0.9023, 0.8789, 0.8555], ..., [-0.0352, -0.0586, -0.0977, ..., 0.7617, 0.7070, 0.7461], [-0.0586, -0.0586, -0.0977, ..., 0.7617, 0.7617, 0.8086], [-0.0352, -0.0352, -0.1211, ..., 0.7227, 0.8086, 0.8086]]]), 0)  

數(shù)據(jù)集返回張量。 讓我們可視化所有輸入。 它們已通過MTCNN圖像進行了歸一化,最后一行的最后三張圖像是我自己的自拍照:)

 

使用深度學(xué)習(xí)的方法進行人臉解鎖

 

嵌入向量空間

我們的數(shù)據(jù)已準備就緒。 為了比較人臉并找出兩個人臉是否相似,我們需要在向量空間中對它們進行編碼,如果兩個人臉相似,則與它們相關(guān)聯(lián)的兩個向量也都相似(接近)。

我們可以使用在一個著名的人臉數(shù)據(jù)集(例如vgg_face2)上訓(xùn)練的模型,并使用分類頭之前的最后一層的輸出(潛在空間)作為編碼器。

在這些數(shù)據(jù)集之一上訓(xùn)練的模型必須學(xué)習(xí)有關(guān)輸入的重要特征。 最后一層(在完全連接的層之前)對高級功能進行編碼。 因此,我們可以使用它將輸入嵌入向量空間中,希望相似圖像彼此靠近。

詳細地,我們將使用在vggface2數(shù)據(jù)集上訓(xùn)練的初始Resnet。 嵌入空間的尺寸為512。

  1. resnet = InceptionResnetV1(pretrained='vggface2').eval()  
  2.   
  3. with torch.no_grad():  
  4.     for (imgs, labels) in dl:  
  5.         embs = resnet(imgs)  
  6.         break  
  7.   
  8. embs.shape  
  9.   
  10. torch.Size([8, 512])  

 

完美,我們有8張圖片,我們獲得了8個矢量

相似度計算

為了比較向量,我們可以使用cosine_similarity來查看它們彼此之間的距離。 余弦相似度將輸出[-1,1]之間的值。 在樸素的情況下,兩個比較的向量相同,它們的相似度為1。因此,最接近1的相似度。

現(xiàn)在,我們可以在數(shù)據(jù)集中找到每對之間的所有距離。

  1. import seaborn as sns  
  2. import numpy as np  
  3.   
  4. similarity_matrix = torch.zeros(embs.shape[0], embs.shape[0])  
  5.   
  6. for i in range(embs.shape[0]):  
  7.     for j in range(embs.shape[0]):  
  8.         similarity_matrix[i,j] = torch.cosine_similarity(embs[i].view(1, -1), embs[j].view(1, -1))  
  9.   
  10.   
  11. fig = plt.figure(figsize=(15, 15))  
  12.   
  13. sns.heatmap(similarity_matrix.numpy(), annot = True,)  
  14.   
  15. numicons = 8  
  16. for i in range(numicons):  
  17.     axicon = fig.add_axes([0.12+0.082*i,0.01,0.05,0.05])  
  18.     axicon.imshow(un_normalize(ds[i][0]).permute(1,2,0).numpy())  
  19.     axicon.set_xticks([])  
  20.     axicon.set_yticks([])  
  21.   
  22.     axicon = fig.add_axes([0, 0.15 + 0.092 * i,.05,0.05])  
  23.     axicon.imshow(un_normalize(ds[len(ds) - 1 - i][0]).permute(1,2,0).numpy())  
  24.     axicon.set_xticks([])  
  25.     axicon.set_yticks([])  

 

 

使用深度學(xué)習(xí)的方法進行人臉解鎖

 

顯然,我與Matt或Leo不太相似,但是它們有一些共同點!

我們可以更加深入,在嵌入向量中運行PCA并將圖像投影到二維平面中

  1. from matplotlib.offsetbox import OffsetImage, AnnotationBbox  
  2.   
  3. def pca(x: torch.Tensor, k: int = 2) -> torch.Tensor:  
  4.     """  
  5.     From http://agnesmustar.com/2017/11/01/principal-component-analysis-pca-implemented-pytorch/  
  6.     """  
  7.     # preprocess the data  
  8.     X_mean = torch.mean(x, 0)  
  9.     x = x - X_mean.expand_as(x)  
  10.     # svd  
  11.     U, S, V = torch.svd(torch.t(x))  
  12.     return torch.mm(x, U[:, :k])  
  13.   
  14. points = pca(embs, k=2)  
  15. plt.rcParams["figure.figsize"] = (12,12)  
  16.   
  17. fig, ax = plt.figure(), plt.subplot(111)  
  18. plt.scatter(points[:,0], points[:,1])  
  19. for i, p in enumerate(points):  
  20.     x, y = p[0], p[1]  
  21.     img = un_normalize(ds[i][0])  
  22.     img_np = img.permute(1, 2, 0).numpy().squeeze()  
  23.     ab = AnnotationBbox(OffsetImage(img_np, zoom=0.6), (x, y), frameon=False)  
  24.     ax.add_artist(ab)  
  25.   
  26. plt.plot()  

 

 

使用深度學(xué)習(xí)的方法進行人臉解鎖

 

我們將512維壓縮為2,所以我們丟失了很多數(shù)據(jù)。

好的,我們有一種方法來找到臉,看看它們是否彼此相似,現(xiàn)在我們可以創(chuàng)建我們的臉解鎖算法。

我的想法是取n張允許的人的圖像,在嵌入空間中找到中心,選擇一個閾值,看d看中心和新圖像之間的余弦相似度是小于還是大于它。

  1. from dataclasses import dataclass, field  
  2. from typing import List, Callable  
  3. from PIL import Image  
  4.   
  5. @dataclass  
  6. class FaceUnlock:  
  7.       
  8.     images: List[Image.Image] = field(default_factory = list)  
  9.     th: float = 0.8  
  10.     transform: Callable =  MTCNN(image_size=160, margin=18)  
  11.     embedder: torch.nn.Module = InceptionResnetV1(pretrained='vggface2').eval()  
  12.     center: torch.Tensor = None  
  13.   
  14.     def __post_init__(self):  
  15.         faces = torch.stack(list(map(self.transform, self.images)))  
  16.         embds = self.embedder(faces)  
  17.   
  18.         self.center = embds.sum(0) / embds.shape[0]  
  19.       
  20.     def __call__(self, x: Image.Image) -> bool:  
  21.         face = self.transform(x)  
  22.         emb = self.embedder(face.unsqueeze(0))  
  23.   
  24.         similarity = torch.cosine_similarity(emb.view(1, -1), self.center.view(1, -1))  
  25.         is_me =  similarity > self.th  
  26.   
  27.         return is_me, similarity  
  28.   
  29. load pictures of myself  
  30. me = data_root / 'faces' / 'me'  
  31. images = list(map(Image.open, me.glob('*')))  
  32. # initialize face unlock with my images  
  33. face_unlock = FaceUnlock(images)  
  34.   
  35. from ipywidgets import interact, interactive, fixed, interact_manual  
  36.   
  37. def unlock_with_filepath(path):  
  38.     img = Image.open(path)  
  39.       
  40.     is_me, similarity =  face_unlock(img)  
  41.     print(f"{'' if is_me else ''} similarity={similarity.item():.3f}")  
  42.   
  43.     fig = plt.figure()  
  44.     plt.imshow(img)  
  45.     plt.plot()  
  46.   
  47. test_root = data_root / 'faces_test'  
  48.   
  49. interact(unlock_with_filepath, path=list(test_root.glob('*')))  

 

 

使用深度學(xué)習(xí)的方法進行人臉解鎖

 

 

使用深度學(xué)習(xí)的方法進行人臉解鎖

 

相似度得分比以前的圖像高,所以我猜是真的!

讓我們嘗試自己的新自拍

 

使用深度學(xué)習(xí)的方法進行人臉解鎖

 

總結(jié)

我們已經(jīng)看到了一種僅使用2D數(shù)據(jù)(圖像)創(chuàng)建人臉解鎖算法的有吸引力的方法。 它依靠神經(jīng)網(wǎng)絡(luò)對相似面孔彼此靠近的高維向量空間中的裁剪面孔進行編碼。 但是,我不知道該模型是如何訓(xùn)練的,并且可能很容易弄糊涂(即使在我的實驗中該算法效果很好)。

如果在沒有數(shù)據(jù)擴充的情況下訓(xùn)練模型怎么辦? 然后,可能只是翻轉(zhuǎn)同一個人可能會破壞潛在的表示。

更加健壯的訓(xùn)練例程將是無監(jiān)督的(類似于BYOL),它嚴重依賴于數(shù)據(jù)增強。

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2018-05-08 14:25:22

Pythondlib人臉檢測

2012-04-28 14:01:17

HTML5

2022-05-25 07:11:13

Python人臉識別代碼

2024-06-05 08:14:26

SpringElasticsea人臉數(shù)據(jù)

2024-03-26 09:11:13

TensorFlow深度學(xué)習(xí)Pipeline

2019-12-27 16:20:35

人臉識別深度學(xué)習(xí)人工智能

2019-02-13 19:20:12

人臉識別深度學(xué)習(xí)人工智能

2017-05-27 14:00:06

深度學(xué)習(xí)人臉建模

2024-07-02 10:28:59

2021-04-16 09:53:45

人工智能機器學(xué)習(xí)深度學(xué)習(xí)

2017-11-24 11:38:05

2022-01-10 16:40:06

神經(jīng)網(wǎng)絡(luò)AI算法

2018-05-09 20:08:09

人工智能深度學(xué)習(xí)Python

2017-09-04 20:06:32

深度學(xué)習(xí)檢測人臉追蹤

2024-07-12 15:27:58

2021-11-12 15:16:32

深度學(xué)習(xí)數(shù)據(jù)合成人工智能

2021-03-19 17:59:30

深度學(xué)習(xí)音頻程序

2021-03-29 10:56:51

人工智能深度學(xué)習(xí)

2023-10-07 09:00:00

人臉檢測Web應(yīng)用程序

2021-07-01 08:00:00

深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)架構(gòu)
點贊
收藏

51CTO技術(shù)棧公眾號