使用Keras和OpenCV創建人臉驗證系統

2020-12-06 不靠譜的貓

什麼是人臉驗證?

這可以認為是分類問題,使用匹配分數來驗證人的身份。如果兩個圖像屬於同一個人,則它們應具有較高的匹配度;如果兩個圖像屬於兩個不同的人,則匹配度應較低。

您可能想到的第一件事是,為什麼不將捕獲的圖像與另一個像素逐個匹配呢?如果所捕獲圖像的像素值與另一個圖像的像素值之間的距離(均方或絕對)很小,則它們應該對應於同一個人。但是,由於光線,位置或方向略有變化,圖像中的像素值也會發生巨大變化,因此該方法實際上效果不佳。

那我們現在怎麼辦呢?這就是卷積神經網絡(俗稱CNN)發揮作用的地方。通過將每個圖像嵌入d維向量空間,此類網絡可以幫助我們更好地表示圖像。然後評估圖像嵌入的相似性。

解決問題的一些方法

SVM:這裡的想法是為訓練集中的每個示例訓練一個線性SVM分類器。DeepID:在這裡,驗證任務被視為人臉識別的子問題(為每個人分配標籤)。暹羅網絡:這是基於以下思想:個人內部的距離應該比人際之間的距離小得多。在研究暹羅網絡之前,讓我們首先討論暹羅網絡所基於的一個非常重要的概念。那就是One Shot Learning。

「One Shot Learning」是一個對象分類問題,主要出現在計算機視覺中,它試圖從一個或幾個訓練樣本中學習有關對象分類的信息。通常,在深度學習中,我們需要大量的機器學習數據,我們獲得的機器學習數據越多則機器學習模型越好。但在人臉驗證的情況下,一個人不可能獲得數千張照片。其次,我們的大腦也不需要成千上萬的人的照片來識別一個人。

對於面部驗證任務,我們希望系統能夠從一張/幾張圖像中判斷一個人的身份。

如前所述,卷積神經網絡(CNN)有助於圖像的向量化表示。但是卷積神經網絡(CNN)確實需要訓練很多實例。此外,每次將一個新用戶的圖像添加到機器學習數據集中,都要對機器學習模型進行訓練,這很不方便。因此,為什麼不建立一個模型來學習兩個不同的人之間的距離呢?這正是暹羅網絡所要做的。

圖像x(1)被饋送給卷積神經網絡(CNN),由卷積層和全連接層組成。卷積層提供了一個特徵空間,而附加到卷積層的全連接層則在該空間中學習一個函數(大部分是非線性的)。我們最後得到的是一個特徵向量(在特徵向量中沒有添加softmax激活,因為在這個階段它不會被用於分類)。圖像x(2)被輸入到一個與上面完全相同的卷積神經網絡(CNN)。在我們的例子中,我們有第三張圖像x(3)被提供給相同的CNN。

我們選擇x(1)作為anchor圖像,x(2)作為正圖像,x(3)作為負圖像。anchor和正圖像屬於同一人,而負圖像是另一個人。因此,我們的目標是最小化正圖像和anchor之間的距離,同時最大化anchor和負圖像之間的距離。

該目標可以寫為:

我們可以添加一個超參數alpha

這裡A = x(1),P = x(2),N = x(3)

現在,我們如何將其構造為損失函數。

這稱為三重損失函數。如我們所見,此損失函數可確保max函數中的第一項不超過0。

Python實現

創建數據

這是創建機器學習數據集的Python代碼。它使用稱為Haar frontal face classifier 的預訓練分類器,該分類器以級聯方式識別人臉。下面的代碼存儲使用網絡攝像頭捕獲的20張人臉圖像,並將其存儲在文件夾中。

創建模型並進行訓練

創建數據集時,您可以看到我在現有圖像上填充了一些值(此處寬度為22,高度為12)。之所以如此,是因為使用了在ImageNet數據集上預訓練的VGG16模型,該神經網絡模型期望輸入圖像的尺寸為(224、224、3),而我們使用的數據集的每個圖像都為(200、180、3)。

對於每個人(由數據集文件夾內的文件夾標記的人),我們存儲5個(A,P,N)的triplets。然後對它們進行訓練,該模型本身包含三個VGG16模型,並由一個實現三重損失函數的Lambda層連接。

使用模型進行驗證

接收圖像img(使用網絡攝像頭捕獲的人的圖像)的detect_face函數查找面部並將其裁剪。用驗證如下:

a)我們在數據集文件夾中找到命名的文件夾。我們從該文件夾中選擇一個圖像。

b)我們隨機選擇另外三個文件夾,並從每個文件夾中選擇一個圖像。這些將作為negative images。

c)我們找到每個圖像的編碼,由detect_face返回,一個來自步驟a),三個來自步驟b)。

d)我們求出步驟a)和步驟b中每個圖像編碼的均方誤差。

e)如果從步驟b)獲得的任何圖像的誤差小於從步驟a)獲得的圖像的誤差,我們說該人已被授權,否則就沒有授權。

相關焦點

  • 使用Python和Keras創建簡單語音識別引擎
    語音識別通過聲學和語言建模使用算法來工作。聲學建模表示語音和音頻信號的語言單元之間的關係;語言建模將聲音與單詞序列進行匹配,以幫助區分聽起來相似的單詞。通常,基於循環層的深度學習模型用於識別語音中的時間模式,以提高系統內的準確性。也可以使用其他方法,例如隱馬爾可夫模型(第一個語音識別算法是使用這種方法)。在本文中,我將僅討論聲學模型。
  • 史上最全 OpenCV 活體檢測教程!
    通過學習,你將能夠在人臉識別系統中創建一個可以發現偽造人臉並執行反人臉欺騙的活體檢測器。在過去一年中,本文作者已經寫過了多篇人臉識別教程,包括:然而,在我收到的一些郵件以及這些關於人臉識別的博文的評論中,我經常被問到的一個問題是:我如何才能區分真人臉和偽造人臉?
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    本文從實踐的角度介紹了如何使用 PHP 與 OpenCV 構建人臉檢測、人臉識別、超解析度與目標檢測等系統,因此 PHP 的各位擁躉們,可以盡情使用 OpenCV 探索計算機視覺了。本文首發於公眾號機器之心(ID:almosthuman2014),部分代碼格式有誤可參閱原文章。
  • 用PyTorch重新創建Keras API
    如果前一層是輸入層,則創建一個PyTorch線性層,其中輸入層返回的形狀和輸出神經元的數量作為Dense類初始化期間的參數。如果前一層是Dense層,我們通過在Dense類中增加一個PyTorch線性層和一個激活層來擴展神經網絡。如果前一層是卷積層或平坦層,我們將創建一個名為get_conv_output()的實用函數,通過卷積層和平坦層得到圖像的輸出形狀。
  • 如何在Keras中創建自定義損失函數?
    Keras 是一個創建神經網絡的庫,它是開源的,用 Python 語言編寫。Keras 不支持低級計算,但它運行在諸如 Theano 和 TensorFlow 之類的庫上。在本教程中,我們將使用 TensorFlow 作為 Keras backend。
  • 使用OpenCV和Python構建自己的車輛檢測模型
    然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。因此在本文中,我們將建立一個自動車輛檢測器和計數器模型。以下視頻是你可以期待的體驗:https://youtu.be/C_iZ2yivskE注意:還不懂深度學習和計算機視覺的新概念?
  • 使用Python,Keras和OpenCV進行實時面部活體檢測
    你可以在網際網路上找到的大多數面部識別算法和研究論文都受到照片攻擊。這些方法在檢測和識別來自網絡攝像頭的圖像、視頻和視頻流中的人臉方面非常有效。然而,他們不能區分活人的臉和照片上的臉。這是因為這些算法適用於2D frames。
  • 基於python+OpenCV模塊的人臉識別定位技術
    什麼是OpenCV模塊OpenCV是一款跨平臺的視覺庫,可以支持的作業系統有Linux、Windows和Mac OS作業系統,並且還提供了多種語言的接口,比如Python,java,MATLAB等常用語言。
  • 使用Keras將音樂分類為不同類型
    我們將創建一個包含我們所需數據的CSV文件。  我們使用librosa包計算了所有功能,並創建了一個帶有data.csv文件名的數據集,並在給定的標題中插入了給定音樂的所有特徵值。  在這裡,我們創建了一個流派和整數之間的映射。每個整數代表特定的類型。
  • 初學者怎樣使用Keras進行遷移學習
    訓練和評估模型。導入和構建所需的模型。 要檢查模型的體系結構,我們只需要使用下面給出的這行代碼。 for i,layer in enumerate(model.layers): print(i,layer.name) 現在我們有了模型,我們將使用預先訓練的權重,我們的模型已經在(Imagenet數據集)上訓練過了,我們必須將所有的權重設置為不可訓練。
  • 基於TensorFlow 、OpenCV 和 Docker 的實時視頻目標檢測
    此外,在次項目我還添加了一個視頻後處理功能,同樣使用 multiprocessing 庫來減少處理時間(使用 Tensorflow 原始目標檢測 API 處理時間會非常長)。實時和視頻目標識別都可以在我的個人筆記本電腦上以高性能運行,僅使用 8GB CPU。
  • Keras和TensorFlow究竟哪個會更好?
    如果你陷於「我應該使用 Keras 還是 TensorFlow」這樣的問題,你可以退一步再看,其實這是一個錯誤的問題,因為你可以選擇同時使用兩個。 我會使用基於 TensorFlow 的標準 keras 模塊和 tf.keras 模塊,來實現一個卷積神經網絡(CNN)。
  • 基於OpenCv 和 Python 的手指識別及追蹤
    使用閾值處理和濾波技術來進行背景消除以獲得最佳結果。我在手指識別時遇到的挑戰之一是將手與背景區分開並識別手指的尖端。我將向您展示我用於手指跟蹤的技術,我在此項目中使用了該技術。如果想要查看手指識別和跟蹤的實際操作,請觀看我上傳的視頻。
  • opencv-python獲取圖像:面向對象與面向過程
    關於圖片的來源:1973年6月,美國南加州大學的信號圖像處理研究所的一個助理教授和他的一個研究生打算為了一個學術會議找一張數字照片,而他們對於手頭現有成堆"無聊"照片感到厭煩。事實上他們需要的是一個人臉照片,同時又能讓人眼前一亮。這時正好有人走進實驗室,手上帶著一本當時的花花公子雜誌,結果故事發生了……而限於當時實驗室設備和測試圖片的需要,lenna的圖片只摳到了原圖的肩膀部分。
  • 僅使用opencv就能實現!(附源碼)
    隨著時代的發展,人臉識別系統的應用也正變得比以往任何時候都更加普遍。從智慧型手機上的人臉識別解鎖、到人臉識別打卡、門禁系統等,人臉識別系統正在各行各業得到應用。然而,人臉識別系統很容易被「非真實」的面孔所欺騙。比如將人的照片放在人臉識別相機,就可以騙過人臉識別系統,讓其識別為人臉。
  • 以SVM和HOG特性實現實時人臉檢測和識別
    人臉識別(face recognition)是機器學習領域中最受歡迎的技術之一。最近,該技術的使用案例已經從政府安全系統的特定監視應用擴展到多個產業的更廣泛應用,例如使用者的識別和認證、消費者體驗、健康和廣告。
  • 使用Keras構建具有自定義結構和層次圖卷積神經網絡
    相反,我們只是想提供一個使用keras自定義層實現自定義模型的示例!模型1:序列層的神經網絡作為基準,我們使用具有序列層的標準神經網絡(熟悉的keras序列模型)。我們可以繪製模型來查看序列結構。讓我們看看這個模型是如何運行的。
  • 了解1D和3D卷積神經網絡|Keras
    但是,現實世界中還使用了其他兩種類型的卷積神經網絡,即1維CNN和3維CNN。在本指南中,我們將介紹1D和3D CNN及其在現實世界中的應用。我假設你已經大體上熟悉卷積網絡的概念。2維CNN | Conv2D這是在Lenet-5架構中首次引入的標準卷積神經網絡。Conv2D通常用於圖像數據。
  • 如何使用Keras構建殘差神經網絡?
    使用Sequential類,我們無法添加skip connections。Keras的Model類可與Functional API一起使用,以創建用於構建更複雜的網絡體系結構的層。構造後,keras.layers.Input返回張量對象。Keras中的層對象也可以像函數一樣使用,以張量對象作為參數來調用它。
  • 如何快速簡單的安裝opencv-python
    :可以在使用pip的時候,加上參數-i和鏡像地址(如https://pypi.tuna.tsinghua.edu.cn/simple),例如:(2)永久修改,一勞永逸:windows下,直接在user\xxx目錄中創建一個pip目錄,如:C:\Users\xx\pip,然後新建文件pip.in