動手實操 | 如何用 Python 實現人臉識別,證明這個楊冪是那個楊冪?

来源:https://www.cnblogs.com/Python6359/archive/2018/07/23/9357197.html
-Advertisement-
Play Games

需求分析 要做安全方面的內容,依靠人臉識別通過和庫中的臉比對後判定相似率來驗證用戶身份。 快速從圖片中識別出人的信息,用於尋人功能等。 其實從安全的角度出發有很多可以囊括的。比如智能家居中的刷臉開門,支付軟體的刷臉支付等都是例子。 人臉特征提取的步驟 真正的人臉識別需要很多的知識,大體上粗略的可以分 ...


需求分析

要做安全方面的內容,依靠人臉識別通過和庫中的臉比對後判定相似率來驗證用戶身份。

快速從圖片中識別出人的信息,用於尋人功能等。

其實從安全的角度出發有很多可以囊括的。比如智能家居中的刷臉開門,支付軟體的刷臉支付等都是例子。

人臉特征提取的步驟

真正的人臉識別需要很多的知識,大體上粗略的可以分為以下步驟:

  1.人臉檢測(從圖片中找到人臉):返回人臉位置和大小的參數。
  2.人臉特征定位:一般 69 點或者 106 個點對人臉的特征定位,技術上有 Adaboost&haar,以及 MSRA 的 alignment。
  3.人臉特征歸一化(幾何歸一/灰度歸一):前者對圖像進行仿射變化使得不同的臉可以進行比對,後者則能使圖像展現更多的細節以及減弱光線光照的應用。
  4.特征提取-特征後期融合。(基於特征近似度的多特征融合)
  5.特征距之間的距離來比對相似度、三氏距離。(馬氏、歐氏 、巴氏)

操作過程中的註意事項

  1. 每張圖片要先上傳到 bucket 中才可以利用。
  2. API 對人臉匹配再返回很大程度依賴於用戶的網路帶寬。
  3. 當用戶網路不好的情況下需要很久的時間才能得到返回結果。
  4. 要經過壓縮處理,一般識別的較為準確最多可將圖片壓縮至 25 kb 左右。

我們要進行如下的步驟:

1)得到我們剛剛通過攝像頭取得的人像
2)對我們的人像圖片進行壓縮
3)上傳我們的人像圖片到我們的 bucket 中
(這裡要申明一點,七牛所有支持的 API 都要求文件在華東的 Bucket 下)
4)得到我們上傳的圖片的鏈接地址
5)對鏈接進行 urlbase64 加密(這裡只要 import python 的 base64 庫即可)
6)請求 API
7)得到網頁的 JSON 格式數據
8)通過 JSON 庫對數據進行分析
9)判斷人臉的相似度是否符合,輸出結果
10)刪除 Bucket 中上傳的臨時圖片

返回的 JSON 格式分析

{"status":"ok","confidence":0.73065597}複製代碼

我們可以看到返回的 JSON 信息很簡單, status 的意思是成功和不成功,而 confidence 則是相似度,所以我們對返回的信息進行分析會很簡單。 status 如若成功則為 ok,不成功則為 invalid。

人臉相似度的判斷

 

 

上表中所用的圖片都來自己互聯網,從表數據我們可以大致將本人的相似度以 0.7 為分界線。不過有趣的是,不知道為什麼按楊冪進行整容的為什麼相似度竟然低於楊冪和範冰冰的相似度(其他女星照的圖片為範冰冰的人像),不同性別的相似度差異明顯,所以就粗略的根據表格定為 >0.7 即可認為是本人。

安裝所需的庫

在 python 中,我分享的這個例子總共需要引入 6 個庫


1 #import SDK
2 #Python學習交流群:125240963,群內每天分享乾貨,包括最新的python企業案例學習資料和零基礎入門教程,歡迎各位小伙伴入群學習交流
3 from qiniu import Auth,put_file,etag
4 import qiniu.config
5 import requestsimport base64
6 import json
7 from PIL import Image
8 import os

requests 庫,json 庫,PIL 庫請自行安裝;
base64 庫和 OS 庫為自帶所以無需安裝。

(由於電腦已經安裝了較多庫,所以對於這些庫是否為自帶也記得不太清楚,如果出現了錯誤,請大家對應自己安裝。)

程式的實現

請見下方的代碼,採集到的人臉為 face.jpg。 (這裡用了楊冪的兩張圖片作為示例)

  1 #七牛雲"人臉識別"功能的python實現方法:by xlxw
  2 #請得到自己的Secret和Access key用於上傳圖片到空間中進行處理
  3 #人像識別是七牛雲的一項收費項目,價格為 ¥1.5/1000次 測試時請先存2元避免意外
  4 
  5 #import SDK
  6 from qiniu import Auth,put_file,etag
  7 import qiniu.config
  8 import requests
  9 import base64
 10 import json
 11 from PIL import Image
 12 import os
 13 
 14 #上傳
 15 def upload(bucket,path,filename,key,url):
 16     token = key.upload_token(bucket, filename, 3600)
 17     print('正在上傳..')
 18     reform,inform = put_file(token, filename, path)
 19     if reform != None:
 20         print('已經成功地將{}->>{}'.format(filename,bucket))
 21         print("正在處理您的圖片...")
 22         url=url + '/' + filename
 23         path=path.split('/')[-1]
 24     else:
 25         print('這裡出現了一個小錯誤.無法上傳..')
 26 
 27 #調用API
 28 def apiget(urlbucket,url):
 29     try:
 30         url=urlbucket + '/001.jpg' + '?face-analyze/verification/url/' + url
 31         #標準對比的圖片地址,名稱為001.jpg
 32         r=requests.get(url)
 33         r.raise_for_status()
 34         r.encoding=r.apparent_encoding
 35         return r.text
 36     except:
 37         print("網路發生故障,請重試..")
 38 
 39 #base64 Encode
 40 def base64encode(url):
 41     try:
 42         print("正在加密鏈接..")
 43         enurl=base64.urlsafe_b64encode(bytes(url, "utf-8"))
 44         print("加密完成")
 45         enurl=str(enurl)
 46         enurl=enurl.split("'")[1]
 47         return enurl
 48     except:
 49         print("這裡出現了一個問題,請重試..")
 50 
 51 #PIL 圖片壓縮
 52 def pilresize(per,path):
 53     im=Image.open(path)
 54     imsize=im.size
 55     sizex=int(imsize[0]*per)
 56     sizey=int(imsize[1]*per)
 57     im=im.resize((sizex,sizey))
 58     im.save('trans.jpg','JPEG')
 59     print('圖片壓縮完成,輸出成功')
 60     print('{}->>({},{})'.format(imsize,sizex,sizey))
 61 
 62 def pilwork(path):
 63     try:
 64         size=os.path.getsize(path)
 65         size = float(size)
 66         kb=size/1024
 67         per=10/kb
 68         pilresize(per,path)
 69     except:
 70         print("請檢查您的地址是否輸入錯誤")
 71 
 72 
 73 #JSON分析
 74 def jsonanal(jtext):
 75     print("正在分析,請稍後..")
 76     rj=json.loads(jtext)
 77     stat=rj['status']
 78     confi=rj['confidence']
 79     return stat + ',' +str(confi)
 80 
 81 #主體
 82 def main():
 83     #填寫你的 AK 和 SK
 84     accesskey = input('請輸入您在七牛雲的AccessKey:')
 85     secretkey = input('請輸入您在七牛雲的SecretKey:')
 86 
 87     #鑒定身份
 88     keyq=Auth(accesskey,secretkey)
 89 
 90     #所要操作的空間
 91     bucketname =input("請輸入要操作的空間(公開)名字:")
 92 
 93     #所要操作空間的外鏈地址
 94     urlbucket = input("請輸入空間所綁定的功能變數名稱或者預設外鏈地址:")
 95 
 96     #判定操作類型
 97     while 1:
 98         order=input('請輸入你需要進行的操作:')
 99         mode=order.split(' ')[0]
100         if mode == '識別':
101             path=order.split(' ')[1]
102             fname=path.split('/')[-1:][0]
103             unrl=urlbucket+'/trans.jpg'
104             print('正在壓縮圖片.請稍後..')
105             #調用函數
106             pilwork(path)  #壓縮圖片
107             print("正在上傳token,請稍後..")
108             upload(bucketname,'./trans.jpg','trans.jpg',keyq,urlbucket) #上傳文件
109             enurl=base64encode(unrl)   #base64加密
110             jtext=apiget(urlbucket,enurl) #調用七牛api並得到返回的json數據
111             result=jsonanal(jtext)  #分析返回的json,得到最終相似度
112             if result.split(',')[0] == 'invalid':
113                 print('識別發生了錯誤')
114             else:
115                 if eval(result.split(',')[1]) >= 0.7:
116                     print("識別成功,鑒定為本人,相似度為{:.1f}".format(eval(result.split(',')[1])*100))
117                 else:
118                     print("識別成功,鑒定不是本人,相似度過低")
119         if mode == '退出':
120             print("歡迎您的使用..")
121             break
122 
123 #終端提示顯示
124 print("+----------------------------------------+")
125 print("|        歡迎使用七牛的人臉識別功能      |")
126 print("+----------------------------------------+")
127 print("|本程式須知:                            |")
128 print("|1.本程式測試圖片為楊冪的人像,見face.jpg |")
129 print("|2.您需要提供服務的Accesskey,Secretkey  |")
130 print("|3.您需要提供 bucket名字和bucket外鏈地址 |")
131 print("+----------------------------------------+")
132 print("|使用方法:                               |")
133 print("|1.識別輸入格式: 識別 圖片位置(包括尾碼)|")
134 print("|2.退出輸入格式: 退出                   |")
135 print("+----------------------------------------+")
136 main()

程式運行的截圖:

 

 

用到的楊冪的兩張照片為:
(均來自百度圖片)

 

 

(用於比對的標準人像圖片)
(已用 PIL 壓縮 x0.3,y0.3)

 

 

(用於比對的圖片)

作者:七牛雲
鏈接:https://juejin.im/post/59719caef265da6c4741cdd7

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 小紅,女小紅,女小紅,女小紅,女小紅,女小紅,女小紅,女小紅,女小紅,女 出現以上結果??消費者一直消費或者生產者一直生產 解決方法:生產者生產完成後消費者方可消費,否者不可消費,消費者未消費或者未消費完生產者不可生產,一次生產一次消費。其實也就是保證對res共用資源的操作同一時刻僅有同一個線程進行 ...
  • 多線程之間通訊,其實就是多個線程在操作同一個資源,但是操作的動作不同。 第一個線程寫入count,另一個線程取讀取count的值.實現讀一個,寫一個操作。 小明,男 小明,女 小紅,女 小明,男數據格式發生錯誤?????System.out.println(res.username+","+res. ...
  • 設計模式不管對於何種語言都是存在的,這裡介紹的是java的模式 裝飾者模式是在二次開發中應用比較多的一款模式,當然了用反射也是可以實現的,今天介紹的是裝飾模式,有興趣的朋友可以自己去瞭解一下反射是怎麼實現的。 在實際的開發中是無法拿到源碼的,代碼的可使用性也被final了,所以最常見的二次開發(二次 ...
  • 本文內容: 什麼是流 位元組流 字元流 首發日期:2018-07-24 什麼是流 流是個抽象的概念,是對輸入輸出設備的抽象,輸入流可以看作一個輸入通道,輸出流可以看作一個輸出通道。 輸入流是相對程式而言的,外部傳入數據給程式需要藉助輸入流。 輸出流是相對程式而言的,程式把數據傳輸到外部需要藉助輸出流。 ...
  • 一、構造方法 在使用類創建對象的時候(就是類後面加括弧)就自動執行__init__方法。 Python中派生類可以繼承父類的構造方法 1.基於super() 遇到super()就表示去執行父類的xxx屬性 2.通過父類的名稱執行父類的構造方法。 這兩種方式中推薦super,使用第二中方法的時候,進行 ...
  • 原創 尋求圖中最短路徑的方法有很多,最近剛開始學習,先用深搜實現,用鄰接矩陣來存儲圖。 直接上圖上代碼: 尋求從0~4的最短路徑 利用深搜找出所有從0~4的路徑,一一比較選擇出最小的 測試數據: 輸入: 5 8 0 1 2 0 4 10 1 2 3 1 4 7 2 0 4 2 3 4 3 4 5 4 ...
  • java.io包下的File類用於描述和創建一個文件或文件夾對象,只能對文件或文件夾做一些簡單操作,不能修改文件的內容,功能比較有限。下麵是對於File類中常用方法的程式演示。 [1] 演示程式一 [2] 演示程式二 註:希望與各位讀者相互交流,共同學習進步。 ...
  • 在debug VS c工程文件時,碰到cannot convert from 'int (__cdecl *)(char *)' to 'xxx'這個問題,發現問題在於typedef函數指針類型時,將函數調用方法__cdecl寫成了_stdcall。 後來百度了兩者的區別,如下: __cdecl 是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...