python 面部識別_一文教你在Python中打造你自己專屬的面部識別系統

原標題:一文教你在Python中打造你自己專屬的面部識別系統

人臉識別是用戶身份驗證的最新趨勢。蘋果推出的新一代iPhone X使用面部識別技術來驗證用戶身份。百度也在使“刷臉”的方式允許員工進入辦公室。對于很多人來說,這些應用程序有一種魔力。但在這篇文章中,我們的目的是通過教你如何在Python中制作你自己的面部識別系統的簡化版本來揭開這個主題的神秘性。

Github庫代碼:https://github.com/Skuldur/facenet-face-recognition

背景

在討論實現的細節之前,我想討論FaceNet的細節,它是我們將在我們的系統中使用的網絡。

FaceNetFaceNet是一個神經網絡,它可以學習從臉部圖像到緊湊的歐幾里得空間(Euclidean space)的映射,在這個空間里,距離對應的是人臉的相似性。也就是說,兩張面部圖像越相似,它們之間的距離就越小。

Triplet LossFaceNet使用了一種名為Triplet Loss的獨特的損失方法來計算損失。Triplet Loss最小化了anchor與正數之間的距離,這些圖像包含相同的身份,并最大化了anchor與負數之間的距離,這些圖像包含不同的身份。

圖1: Triplet Loss等式

f(a)指的是anchor的輸出編碼f(p)指的是正的輸出編碼f(n)指的是負的輸出編碼α是一個常量,用來確保網絡不會對f(a)-f(p)=f(a)-f(n)=0進行優化[…]+等于最大值(0,總和)

Siamese網絡

圖2:一個Siamese網絡的例子,它使用面部圖像作為輸入,輸出一個128位數字編碼的圖像。

FaceNet是一個Siamese網絡。Siamese網絡是一種神經網絡體系結構,它學習如何區分兩個輸入。這使他們能夠了解哪些圖像是相似的,哪些不是。這些圖像可以包含面部圖像。

Siamese網絡由兩個完全相同的神經網絡組成,每個神經網絡都有相同的權重。首先,每個網絡將兩個輸入圖像中的一個作為輸入。然后,每個網絡的最后一層的輸出被發送到一個函數,該函數決定這些圖像是否包含相同的身份。

在FaceNet中,這是通過計算兩個輸出之間的距離來完成的。

實現

既然我們已經闡明了這個理論,我們就可以直接去實現這個過程。在我們的實現中,我們將使用Keras和Tensorflow。此外,我們還使用了從deeplearning.ai的repo中得到的兩個實用程序文件來為所有與FaceNet網絡的交互做了個摘要:

fr_utils.py包含了向網絡提供圖像的函數,并獲取圖像的編碼inception_blocks_v2.py包含了準備和編譯FaceNet網絡的函數

Kera地址:https://keras.io/

Tensorflow地址:https://www.tensorflow.org/

deeplearning.ai的repo地址:https://github.com/shahariarrabby/deeplearning.ai/tree/master/COURSE%204%20Convolutional%20Neural%20Networks/Week%2004/Face%20Recognition

編譯FaceNet網絡我們要做的第一件事就是編譯FaceNet網絡,這樣我們就可以在面部識別系統中使用它。

import osimport globimport numpy as npimport cv2import tensorflow as tffrom fr_utils import *from inception_blocks_v2 import *from keras import backend as KK.set_image_data_format('channels_first')FRmodel = faceRecoModel(input_shape=(3, 96, 96))def triplet_loss(y_true, y_pred, alpha = 0.3): anchor, positive, negative = y_pred[0], y_pred[1], y_pred[2]pos_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, positive)), axis=-1) neg_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, negative)), axis=-1) basic_loss = tf.add(tf.subtract(pos_dist, neg_dist), alpha) loss = tf.reduce_sum(tf.maximum(basic_loss, 0.0)) return lossFRmodel.compile(optimizer = 'adam', loss = triplet_loss, metrics = ['accuracy'])load_weights_from_FaceNet(FRmodel)

我們將以一個(3,96,96)的輸入形狀開始初始化我們的網絡。這意味著紅-綠-藍(RGB)通道是向網絡饋送的圖像卷(image volume)的第一個維度。所有被饋送網絡的圖像必須是96×96像素的圖像。

接下來,我們將定義Triplet Loss函數。上面的代碼片段中的函數遵循我們在上一節中定義的Triplet Loss方程的定義。

一旦我們有了損失函數,我們就可以使用Keras來編譯我們的面部識別模型。我們將使用Adam優化器來最小化由Triplet Loss函數計算的損失。

Adam優化器:https://keras.io/optimizers/#adam

準備一個數據庫現在我們已經編譯了FaceNet,我們準備一個我們希望我們的系統能夠識別的個人數據庫。我們將使用圖像目錄中包含的所有圖像,以供我們的個人數據庫使用。

注意:我們將只在實現中使用每個單獨的圖像。原因是FaceNet網絡強大到只需要一個單獨的圖像就能識別它們!

def prepare_database(): database = {} for file in glob.glob("images/*"): identity = os.path.splitext(os.path.basename(file))[0] database[identity] = img_path_to_encoding(file, FRmodel) return database

對于每個圖像,我們將把圖像數據轉換為128個浮點數的編碼。我們通過調用函數img_path_to_encoding來實現這一點。該函數接受一個圖像的路徑,并將圖像輸入到我們的面部識別網絡中。然后,它返回來自網絡的輸出,這恰好是圖像的編碼。

一旦我們將每個圖像的編碼添加到我們的數據庫,我們的系統就可以開始識別人臉了!

識別人臉正如在背景部分所討論的,FaceNet被訓練來盡可能地最小化同一個體的圖像之間的距離,并使不同個體之間的圖像之間的距離最大化。我們的實現使用這些信息來確定為我們的系統饋送的新圖像最有可能是哪一個個體。

def who_is_it(image, database, model): encoding = img_to_encoding(image, model) min_dist = 100 identity = None # Loop over the database dictionary's names and encodings. for (name, db_enc) in database.items(): dist = np.linalg.norm(db_enc - encoding) print('distance for %s is %s' %(name, dist)) if dist < min_dist: min_dist = dist identity = name if min_dist > 0.52: return None else: return identity

上面的函數將新圖像輸入到一個名為img_to_encoding的效用函數中。該函數使用FaceNet處理圖像,并返回圖像的編碼。既然我們有了編碼,我們就能找到最可能屬于這個圖像的那個個體。

為了找到個體,我們通過數據庫,計算新圖像和數據庫中的每個個體之間的距離。在新圖像中距離最小的個體被選為最有可能的候選。

最后,我們必須確定候選圖像和新圖像是否包含相同的對象。因為在我們的循環結束時,我們只確定了最有可能的個體。這就是下面的代碼片段所發揮的作用。

if min_dist > 0.52: return Noneelse: return identity如果距離大于0.52,那么我們將確定新圖像中的個體不存在于我們的數據庫中。但是,如果距離等于或小于0.52,那么我們確定它們是相同的個體!

這里比較棘手的部分是,值0.52是通過在我的特定數據集上反復實驗來實現的。最好的值可能要低得多或稍微高一些,這取決于你的實現和數據。我建議嘗試不同的值,看看哪個值最適合你的系統!

使用面部識別建立一個系統在這篇文章的開頭,我鏈接到的Github庫中的代碼是一個演示,它使用筆記本電腦的攝像頭來為我們的面部識別算法饋送視頻幀。一旦算法識別出框架中的一個人,演示就會播放一個音頻信息,它允許用戶在數據庫中使用它們的圖像名稱。圖3顯示了演示示例。

圖3:當網絡在圖片中識別出個體時,圖片即時被捕捉。數據庫中圖像的名稱是“skuli.jpg”,因此播出的音頻信息是“Welcome skuli, have a nice day!”

結論

現在,你應該熟悉了面部識別系統的工作方式,以及如何使用python中的FaceNet網絡的預先訓練版本來創建你自己的簡化的面部識別系統。如果你想在Github庫中進行演示,并添加你認識的人的圖像,那么就可以繼續使用這個庫來進行你的下一次實驗。

本文為atyun出品,轉載請注明出處。更多內容關注微信公眾號atyun_com 或訪問網站www.atyun.com返回搜狐,查看更多

責任編輯:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393948.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393948.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393948.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Computer Vision Review Incompletely

機器視覺牛人及其相關領域分類科普轉載于:https://www.cnblogs.com/casperwin/p/6380484.html

php獲取特殊標簽,thinkphp特殊標簽使用

特殊標簽1、比較標簽eq或者 equal 等于neq 或者notequal 不等于gt 大于egt 大于等于lt 小于elt 小于等于heq 恒等于nheq 不恒等于2.范圍標簽in(in namen value9,10,11,12)在這些數字里面(else/)不在這些數字的范圍內(/in)(notin namen value9,10,11,12)在這些數字里面(else/)不…

leetcode面試題 08.08. 有重復字符串的排列組合(回溯)

有重復字符串的排列組合。編寫一種方法&#xff0c;計算某字符串的所有排列組合。 示例1: 輸入&#xff1a;S “qqe” 輸出&#xff1a;[“eqq”,“qeq”,“qqe”] 示例2: 輸入&#xff1a;S “ab” 輸出&#xff1a;[“ab”, “ba”] 代碼 class Solution {ArrayList&l…

4、Orcal數據庫dmp文件導入

1、CMD命令導入備份數據庫dmp文件&#xff1a; 以上一篇博客提到的gdnh用戶&#xff0c;我們需要在cmd窗口執行如下命令&#xff1a; imp gdnh/admin123orcl fileE:/createTable.dmp fully 截圖說明&#xff1a; 導入成功的標志&#xff1a; 導入完成之后刷新表&#xff1a; 轉…

iOS APP 安全測試

1、ipa包加殼 首先&#xff0c;我們可以通過iTunes 下載 AppStore的ipa文件(蘋果 把開發者上傳的ipa包 進行了加殼再放到AppStore中)&#xff0c;所以我們從AppStore下載的ipa都是加殼的&#xff0c;所以不能直接用來反編譯。 得到ipa文件 可以分析APP 里包含的一些資源&#x…

oracle 與 client端執行結果不一致_Oracle -PLSQLDeveloper 13 數據庫連接

關于oracle 及PLSQLDeveloper 13如何下載&#xff0c;安裝流程不一一贅述&#xff0c;網絡帖子很多&#xff0c;知乎直接搜索亦可。本次主要分享&#xff1a;學習前輩們關于安裝流程中出現設置報錯&#xff0c;應如何處理&#xff08;本人個例&#xff0c;通過網絡找思路&#…

去除文件頭部的u+feff_關于FEFF的簡短故事,一個不可見的UTF-8字符破壞了我們的CSV文件

去除文件頭部的ufeffToday, we encountered an error while trying to create some database seeds from a CSV. This CSV was originally generated by me using a Ruby script which piped the output to a file and saved as a CSV.今天&#xff0c;我們在嘗試從CSV創建一些…

Redis——學習之路一(初識redis)

在接下來的一段時間里面我要將自己學習的redis整理一遍&#xff0c;下面是我整理的一些資料&#xff1a; Redis是一款依據BSD開源協議發行的高性能Key-Value存儲系統&#xff08;cache and store&#xff09;&#xff0c;所以redis是可以查看源代碼https://github.com/MSOpenTe…

matlab 處理dat文件畫圖,matlab_DAT_processing matlab處理dat文件并進行繪圖 - 下載 - 搜珍網...

matlab實驗2/11.txtmatlab實驗2/B00001.datmatlab實驗2/B00002.datmatlab實驗2/B00003.datmatlab實驗2/B00004.datmatlab實驗2/B00005.datmatlab實驗2/B00006.datmatlab實驗2/B00007.datmatlab實驗2/corv.txtmatlab實驗2/cory.txtmatlab實驗2/matlab批量載入數據.txtmatlab實驗…

leetcode面試題 08.03. 魔術索引(二分)

魔術索引。 在數組A[0…n-1]中&#xff0c;有所謂的魔術索引&#xff0c;滿足條件A[i] i。給定一個有序整數數組&#xff0c;編寫一種方法找出魔術索引&#xff0c;若有的話&#xff0c;在數組A中找出一個魔術索引&#xff0c;如果沒有&#xff0c;則返回-1。若有多個魔術索引…

python返回序列中的最小元素_python實現獲取序列中最小的幾個元素

本文實例講述了python實現獲取序列中最小的幾個元素。分享給大家供大家參考。具體方法如下&#xff1a;import heapqimport randomdef issorted(data):data list(data)heapq.heapify(data)while data:yield heapq.heappop(data)alist [x for x in range(10)]random.shuffle(a…

apache訪問快捷方式

<VirtualHost *:80>   DocumentRoot "XXX"   ServerName XXX   Alias /pdodata/ "XXX"</VirtualHost> 其中 Alias /pdodata/ "XXX" /data/是快捷方式名稱 后面的代表快捷方式具體目錄名稱轉載于:https://www.cnblogs.com/…

css----實現checkbox圖片切換

1、效果圖 2、代碼 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>checkbox</title><style type"text/css">label {width: 20px;font-size: 12px;cursor: pointer;}label i {display: inline-block…

Node.js 究竟是什么?

在網上看到一篇介紹Node.js的文章&#xff0c;很好的介紹了Node.js Michael Abernethy, 自由程序員, Freelancer 2011 年 10 月 09 日 (最初于 2011 年 4 月 26 日) Node.js 究竟是什么&#xff1f; 一個 “編碼就緒” 服務器 Node 是一個服務器端 JavaScript 解釋器&#xff…

react中綁定點擊事件_在React中綁定事件處理程序的最佳方法

react中綁定點擊事件by Charlee Li通過李李 在React中綁定事件處理程序的最佳方法 (The best way to bind event handlers in React) Binding event handlers in React can be tricky (you have JavaScript to thank for that). For those who know the history of Perl and P…

json_decode php數組,json_decode轉化為數組加true,json_encode和json_decode區別

一、json_encode和json_decode區別1、json_encode&#xff1a;對象/數組 ---> json2、json_decode&#xff1a;json ---> 對象/數組二、json_decode轉化為數組轉化為數組時&#xff0c;第二個參數很重要&#xff1a;不加true會以PHP對象輸出, 加true輸出PHP數組&#xff…

leetcode1219. 黃金礦工(回溯)

你要開發一座金礦&#xff0c;地質勘測學家已經探明了這座金礦中的資源分布&#xff0c;并用大小為 m * n 的網格 grid 進行了標注。每個單元格中的整數就表示這一單元格中的黃金數量&#xff1b;如果該單元格是空的&#xff0c;那么就是 0。 為了使收益最大化&#xff0c;礦工…

【無刪減】Python老司機收藏夾的17個國外免費學習網站

用Python編寫代碼一點都不難&#xff0c;事實上它一直被贊譽為最容易學的編程語言。如果你準備學習web開發&#xff0c; Python是一個不錯的開始&#xff0c;甚至想做游戲的話&#xff0c;用Python來開發游戲的資源也有很多。這是快速學習這門語言的途徑之一。許多程序員都把Py…

iframe vue 前進 后退_vue常見面試題

1、說說你對 SPA 單頁面的理解&#xff0c;它的優缺點分別是什么&#xff1f;SPA&#xff08; single-page application &#xff09;僅在 Web 頁面初始化時加載相應的 HTML、JavaScript 和 CSS。一旦頁面加載完成&#xff0c;SPA 不會因為用戶的操作而進行頁面的重新加載或跳轉…

C#編寫運行在Linux環境下的采用Mediainfo來獲取多媒體文件信息的代碼

C#編寫運行在Linux環境下的采用Mediainfo來獲取多媒體文件信息的代碼 原文:C#編寫運行在Linux環境下的采用Mediainfo來獲取多媒體文件信息的代碼項目開始設計的是運行在windows下&#xff0c;所以一開始采用的是windows服務模式來獲取多媒體文件信息&#xff0c;后來要求調整為…