使用Siamese神經網路進行人臉識別

2021-09-11 09:10:15 字數 2052 閱讀 8751

本文由 「

使用siamese神經網路進行人臉識別

作者|firdaouss doukkali

譯者|孫浩

編輯|emily

一次性學習

為了理解為什麼我們有一次性學習的原因,我們需要討論下深度學習和資料。通常,在深度學習中,我們需要大量的資料,而我們擁有的資料越多,結果就越好。可是,假如可以用僅僅很少的資料學習就更方便了,因為我們並不是所有人都有豐富的資料。

另一方面,為了識別物體,大腦並不需要見過成千上萬相同物體的。這裡我們不討論與大腦的模擬,因為它太複雜,太強大,很多事情都涉及到我們學習和記憶的過程,比如感覺、先驗知識和互動等等。

本文的思路是,我們只從很少的幾個資料中學習物件類,這就是一次性學習演算法的原理。

人臉識別

在這個人臉識別系統中,我們只想通過向系統提供一張人臉的**便可識別乙個人的身份。而且,如果它不能識別,那就意味著這個人的影象沒有儲存在系統的資料庫中。

為了解決這個問題,我們不能只使用卷積神經網路,有兩個原因:1)cnn 並不在乙個小的訓練集上工作 ;2) 我們每次向系統新增乙個新人的時,不方便對模型進行再訓練。然而,我們可以使用 siamese 神經網路來進行人臉識別。

siamese 神經網路

siamese 神經網路有乙個目標,就是找出兩個相似的東西有多相似 (例如,簽名驗證、人臉識別等)。這個網路有兩個相同的子網路,它們都具有相同的引數和權重。

來自 c4w4l03 siamese network.andrew ng 建立

上面的是來自 deeplearning.ai 的乙個例子,它很好地使用 siamese 神經網路體系結構進行了人臉識別。正如您所看到的,第乙個子網路的輸入是乙個影象,然後是一系列的卷積、池化、全連線層,最後是乙個特性向量 (我們不打算使用 softmax 函式進行分類)。最後乙個向量 f(x1) 是輸入 x1 的編碼。然後,我們對影象 x2 做同樣的事情,把它輸入到與第乙個子網路完全相同的第二個子網路中,得到了輸入 x2 的編碼 f(x2)。

為了比較這兩個影象 x1 和 x2,我們計算編碼 f(x1) 和 f(x2) 之間的距離 d。如果它小於乙個閾值 (乙個超引數),這就意味著這兩個影象是同乙個人,否則便是兩個不同的人。

x1 和 x2 的兩種編碼之間的距離函式

此方法適用於任意兩張 xi 和 xj。

那麼,我們如何學習這些引數以便為輸入影象獲得良好的編碼呢?

我們可以通過三聯體損失函式使用梯度下降法,這是乙個使用三張的損失函式:一張錨點影象 a,一張正確的影象 p(和錨點影象中人物一樣),以及乙個不正確的影象 n(人物與錨點影象不同)。我們想讓影象 a 與影象 p 的距離 d(a,p) 小於等於影象 a 與影象 n 的距離 d(a,n)。換句話說,我們想讓有同乙個人的**間的距離接近,而有不同人的**距離則遠離對方。

「三聯」的損失使錨與正之間的距離最小化,兩者都具有相同的身份,並使錨與乙個不同的身份之間的距離最大化。《facenet: 人臉識別和聚類的統一嵌入》

這裡有個問題,模型可以學習對不同的影象進行相同的編碼,這就會使其間距離為 0,同時它仍滿足三元組損失函式。由於這個原因,我們新增了乙個邊際 alpha(乙個超引數) 值,以防止這種情況發生,這樣在 a 和 p 及 a 和 n 之間便可一直存在差值。

三元組損失函式

max 是指,只要 d(a,p)-d(a,n)+alpha 小於或等於零,損失 l(a,p,n) 便是零,但是如果大於零,損失將是正的,此函式將設法使其最小化為零或小於零。

代價函式是所有訓練集的不同三元組的個體損失的總和。

訓練集:

訓練集應該包含同乙個人的多張,讓他們擁有一對 a 和 p,這樣模型一旦訓練完成,我們就能認出只有一張**的人。

我們如何選擇三元組來訓練這個模型呢?

如果我們隨機選擇它們,就很容易滿足損失函式的約束,因為距離多數情況下都是比較大的。梯度下降的方法並不會從訓練集中學到太多。因為這個原因,我們需要找到 a,p,n,其中 a 和 p 需要跟 n 盡可能接近。我們的目標是,讓梯下降方法越來越難從模型訓練中得到優化。

卷積神經網路文字輸入 使用卷積神經網路進行文字分類

cnn 是卷積神經網路,通常用於影象領域,並且在影象分類取得非常好的效果。2014 年 yoon kim 在 convolutional neural networks for sentence classification 中將 cnn 的思想應用到文字處理中,後續很多把 convnet 用在 n...

迴圈神經網路進行分類

rnn網路相對於lstm網路很難收斂 import torch from torch import nnfrom torch.autograd import variable import torchvision.datasets as dsets import torchvision.transf...

神經網路 卷積神經網路

這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了...