手把手的技術(shù)干貨教程,記錄從0到1的開發(fā)過(guò)程。
一、前言
1.1 內(nèi)容簡(jiǎn)介
這篇文章的內(nèi)容主要介紹:華為云人臉識(shí)別服務(wù)(FRS)接口的使用過(guò)程。 利用華為云提供的人臉識(shí)別服務(wù)(FRS),完成:人臉檢測(cè)
、人臉庫(kù)創(chuàng)建
,向人臉庫(kù)添加人臉
,在人臉庫(kù)里搜索匹配的人臉完成人臉對(duì)比
等幾個(gè)主要的功能。 只要完成了這幾個(gè)功能,就可以開發(fā)成品軟件,完成很多需要人臉服務(wù)的 場(chǎng)景,行業(yè)的項(xiàng)目落地。 比如:人臉識(shí)別考勤
、人臉識(shí)別簽到
、人臉門禁開鎖
等等場(chǎng)景。
人臉識(shí)別服務(wù)基于人的臉部特征信息,利用計(jì)算機(jī)對(duì)人臉圖像進(jìn)行處理、分析和理解,用戶通過(guò)實(shí)時(shí)訪問和調(diào)用API獲取人臉處理結(jié)果,幫助用戶自動(dòng)進(jìn)行人臉的識(shí)別、比對(duì)以及相似度查詢等。 人臉識(shí)別服務(wù)提供了開放API接口,提供人臉識(shí)別能力,用戶可以直接調(diào)用API接口訪問華為云人臉識(shí)別服務(wù),完成人臉識(shí)別后返回的結(jié)果為JSON格式,用戶通過(guò)API接口與人臉識(shí)別服務(wù)交互,就可以完成項(xiàng)目開發(fā)。
當(dāng)前開發(fā)案例時(shí),編譯語(yǔ)言采用Python
(畢竟環(huán)境安裝簡(jiǎn)單,符合大部分人的需求),開發(fā)環(huán)境使用華為云新推出的開發(fā)者空間的云主機(jī)
,也就是在開發(fā)者空間的云主機(jī)
里完成上面所說(shuō)的項(xiàng)目開發(fā)體驗(yàn)。
這里使用的華為云開發(fā)者空間云主機(jī),是華為云為全球開發(fā)者打造的一個(gè)云端開發(fā)環(huán)境,簡(jiǎn)化開發(fā)流程、提高開發(fā)效率,并促進(jìn)技術(shù)創(chuàng)新。這個(gè)平臺(tái)提供了一個(gè)無(wú)需成本即可探索和使用華為云服務(wù)的機(jī)會(huì),每位注冊(cè)的開發(fā)者在年度內(nèi)都能享有數(shù)百小時(shí)的云主機(jī)使用權(quán)。云主機(jī)預(yù)裝了CodeArts IDE(華為云的集成開發(fā)環(huán)境)、代碼倉(cāng)庫(kù)以及JDK、Python等關(guān)鍵運(yùn)行時(shí)插件,從而避免了本地環(huán)境配置的復(fù)雜性,讓開發(fā)者能夠快速上手并立即開始工作。
除了云主機(jī)外,華為云還提供了5GB的云存儲(chǔ)容量及定制化的場(chǎng)景模擬沙箱,這些資源幫助開發(fā)者在安全隔離的環(huán)境中進(jìn)行實(shí)驗(yàn)和測(cè)試。華為云開發(fā)者空間提供了豐富的技術(shù)培訓(xùn)課程和專業(yè)認(rèn)證資料,助力開發(fā)者提升技能,并通過(guò)認(rèn)證來(lái)證明自己的能力。該空間特別注重于應(yīng)用全周期管理,涵蓋從應(yīng)用構(gòu)建到運(yùn)維的全過(guò)程,確保開發(fā)者可以高效地完成云端應(yīng)用搭建。
華為云開發(fā)者空間云主機(jī)圍繞CodeArts IDE打造了一個(gè)全面的開發(fā)工具生態(tài)系統(tǒng),整合了鯤鵬、昇騰、鴻蒙等核心生態(tài)的開發(fā)資源,提供廣泛的開源軟件庫(kù)和實(shí)用開發(fā)插件,支持從代碼托管到應(yīng)用運(yùn)維的各個(gè)階段。這不僅提升了開發(fā)效率,也方便了開發(fā)者與華為先進(jìn)技術(shù)和全球開發(fā)者社區(qū)互動(dòng),共同推動(dòng)技術(shù)進(jìn)步和應(yīng)用創(chuàng)新。
華為云開發(fā)者空間云主機(jī)的操作系統(tǒng)版本為Ubuntu 22.04.4 LTS,并且內(nèi)置了一些常用的應(yīng)用程序如Gitcode等,為開發(fā)者提供了一個(gè)穩(wěn)定而高效的開發(fā)環(huán)境。
下面是運(yùn)行效果:
1.2 開發(fā)環(huán)境
在使用華為云人臉識(shí)別服務(wù)(FRS)進(jìn)行開發(fā)時(shí),開發(fā)環(huán)境是華為云新推出的開發(fā)者空間云主機(jī)。這個(gè)開發(fā)環(huán)境為開發(fā)者提供了便捷且功能豐富的云端工作空間,特別適合進(jìn)行各種云原生應(yīng)用的開發(fā)和測(cè)試。
當(dāng)前項(xiàng)目使用的相關(guān)軟件工具已經(jīng)上傳到網(wǎng)盤:[https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink]
(1)開發(fā)者空間云主機(jī)
云主機(jī)中預(yù)裝了華為云CodeArts IDE
開發(fā)工具,這是一款集成了多種開發(fā)插件的一站式開發(fā)環(huán)境,支持代碼編寫、調(diào)試、版本控制等功能。
(2)開發(fā)環(huán)境的具體配置
- 操作系統(tǒng) :云主機(jī)的操作系統(tǒng)版本為Ubuntu 22.04.4 LTS,這是一個(gè)廣泛使用的Linux發(fā)行版,擁有良好的社區(qū)支持和豐富的軟件包。
- 存儲(chǔ)容量 :每位注冊(cè)的開發(fā)者都能獲得5GB的云存儲(chǔ)空間,用于存放項(xiàng)目文件和個(gè)人數(shù)據(jù)。
- 開發(fā)語(yǔ)言 :選擇了Python為例。
(3)開發(fā)流程
- 初始化設(shè)置 :登錄華為云賬號(hào)后進(jìn)入開發(fā)者空間,領(lǐng)取并配置云主機(jī),包括選擇默認(rèn)配置以及等待初始化過(guò)程完成。
- 環(huán)境準(zhǔn)備 :在云主機(jī)上安裝必要的開發(fā)工具和依賴庫(kù),比如Python及其相關(guān)庫(kù)requests等,以便調(diào)用華為云API。
- 獲取API憑證 :在華為云平臺(tái)上創(chuàng)建并獲取Access Key ID和Secret Access Key,用于身份驗(yàn)證。
- 開發(fā)與測(cè)試 :利用Python腳本調(diào)用人臉識(shí)別服務(wù)的各種API接口,實(shí)現(xiàn)人臉檢測(cè)、人臉庫(kù)管理及人臉比對(duì)等功能,并進(jìn)行充分的測(cè)試以保證功能正確性。
- 部署與優(yōu)化 :根據(jù)實(shí)際應(yīng)用場(chǎng)景將開發(fā)完成的人臉識(shí)別解決方案部署到生產(chǎn)環(huán)境中,并持續(xù)優(yōu)化性能和用戶體驗(yàn)。
1.3 功能說(shuō)明
華為云人臉識(shí)別服務(wù)(FRS)提供了一系列功能,通過(guò)這些功能可以實(shí)現(xiàn)多種應(yīng)用場(chǎng)景中的人臉識(shí)別需求。
當(dāng)前使用華為云FRS接口完成的主要功能:
(1) 人臉檢測(cè) :這一功能用于從圖像或視頻流中識(shí)別人臉的位置和大小。它能夠返回人臉的邊界框、關(guān)鍵點(diǎn)以及姿態(tài)信息等,是進(jìn)行后續(xù)處理的基礎(chǔ)步驟。
(2) 人臉庫(kù)創(chuàng)建 :在實(shí)際應(yīng)用中,通常需要將特定的人臉數(shù)據(jù)存儲(chǔ)起來(lái)以便后續(xù)查詢對(duì)比。此功能允許用戶創(chuàng)建一個(gè)或多個(gè)人臉庫(kù),每個(gè)人臉庫(kù)可以包含多個(gè)不同的人臉記錄。
(3) 向人臉庫(kù)添加人臉 :當(dāng)創(chuàng)建了人臉庫(kù)后,可以通過(guò)上傳圖片的方式將人臉添加到已有的人臉庫(kù)中。每張圖片代表一個(gè)人臉樣本,并且可以與該人臉相關(guān)的額外信息一同保存,如姓名、ID號(hào)等。
(4) 人臉比對(duì)/搜索 :這項(xiàng)功能支持在指定的人臉庫(kù)中查找與給定人臉相似度最高的匹配項(xiàng)。通過(guò)比較兩張人臉圖片或者直接使用人臉特征值來(lái)進(jìn)行比對(duì),從而判斷是否為同一人。這一步驟對(duì)于實(shí)現(xiàn)諸如考勤系統(tǒng)、訪問控制等場(chǎng)景非常關(guān)鍵。
基于上述功能,開發(fā)者可以開發(fā)出多種實(shí)用的應(yīng)用程序,例如:
- 人臉識(shí)別考勤 :自動(dòng)記錄員工的上下班時(shí)間。
- 人臉識(shí)別簽到 :會(huì)議、活動(dòng)中的快速簽到解決方案。
- 人臉門禁開鎖 :通過(guò)識(shí)別訪客身份來(lái)控制物理訪問權(quán)限。
1.4 實(shí)現(xiàn)過(guò)程
- 環(huán)境準(zhǔn)備 :在華為云開發(fā)者空間的云主機(jī)上設(shè)置好Python開發(fā)環(huán)境,包括安裝必要的庫(kù)如requests等,以便調(diào)用華為云提供的API接口。
- 獲取API憑證 :在開始調(diào)用API之前,需要在華為云平臺(tái)上注冊(cè)并獲取相應(yīng)的認(rèn)證密鑰(Access Key ID 和 Secret Access Key),這些信息會(huì)在每次請(qǐng)求時(shí)用來(lái)驗(yàn)證身份。
- 調(diào)用人臉檢測(cè)API :使用Python腳本發(fā)送HTTP POST請(qǐng)求至華為云FRS的人臉檢測(cè)端點(diǎn),傳入待分析的圖片文件,接收J(rèn)SON格式的結(jié)果。
- 創(chuàng)建人臉庫(kù) :同樣地,通過(guò)發(fā)送合適的HTTP請(qǐng)求來(lái)創(chuàng)建新的人臉庫(kù),并獲取其唯一標(biāo)識(shí)符。
- 添加人臉至庫(kù) :將欲存儲(chǔ)的人臉圖片上傳至剛剛創(chuàng)建好的人臉庫(kù)中,同時(shí)關(guān)聯(lián)相關(guān)信息。
- 執(zhí)行人臉比對(duì) :最后,利用人臉比對(duì)API,將現(xiàn)場(chǎng)捕捉到的人臉與數(shù)據(jù)庫(kù)內(nèi)已有的記錄進(jìn)行對(duì)比,根據(jù)返回的相似度分?jǐn)?shù)做出決策。
二、華為云開發(fā)者空間
2.1 進(jìn)入開發(fā)者空間
鏈接地址:[https://developer.huaweicloud.com/space/devportal/desktop]
登錄華為云賬號(hào),進(jìn)去之后看到的頁(yè)面如下:
2.2 配置云主機(jī)
在左上角可以看到云主機(jī)的配置提醒,目前默認(rèn)是基礎(chǔ)版。
點(diǎn)擊配置云主機(jī)
,會(huì)彈出對(duì)話框,讓你選擇云主機(jī)的配置,進(jìn)行安裝系統(tǒng)。我這里選擇ubuntu 22.04
.
2.3 安裝系統(tǒng)
點(diǎn)擊安裝
后,會(huì)進(jìn)行安裝系統(tǒng)。需要等等一段時(shí)間。
2.4 啟動(dòng)云主機(jī)
安裝完畢之后,直接可以在瀏覽器里啟動(dòng)云主機(jī)。
啟動(dòng)需要一段時(shí)間初始環(huán)境。
進(jìn)去之后會(huì)有引導(dǎo)界面,提示云主機(jī)的使用技巧。
進(jìn)入桌面后的默認(rèn)效果如下。
2.5 全屏切換
在桌面頁(yè)面上有個(gè)按鈕可以全屏切換,切換全屏后,可視化空間更大,開發(fā)更加方便。
2.6 共享桌面
云主機(jī)還有共享桌面功能,如果需要遠(yuǎn)程演示項(xiàng)目,共享開發(fā)過(guò)程,對(duì)方還可以遠(yuǎn)程操作,這個(gè)功能非常的方便。 直接雙擊666
。
2.5 測(cè)試Python開發(fā)環(huán)境
點(diǎn)擊左下角的所有應(yīng)用程序
,可以看到開發(fā)
菜單里,有安裝好的Python環(huán)境,可以直接使用。
啟動(dòng)之后的效果如下。
進(jìn)去之后,點(diǎn)擊左上角,新建一個(gè)文件。
然后保存文件,名字叫:test.py
然后編寫一段簡(jiǎn)單的python
代碼,測(cè)試當(dāng)前的開發(fā)環(huán)境是否正常。
代碼如下:
import socket
def get_local_ip():
"""
獲取本地 IP 地址
"""
try:
# 創(chuàng)建一個(gè) socket 對(duì)象,并連接到一個(gè)公共地址
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
s.close()
return local_ip
except Exception as e:
return f"無(wú)法獲取本地 IP 地址: {e}"
if __name__ == '__main__':
print("本地 IP 地址是:", get_local_ip())
點(diǎn)擊左上角運(yùn)行。
結(jié)果如下:
2.6 安裝requests庫(kù)
接下來(lái)需要使用Python代碼的requests庫(kù),發(fā)起HTTP請(qǐng)求。先提前安裝環(huán)境。
2.7 安裝Pillow庫(kù)
Pillow
是 PIL
(Python Imaging Library)的一個(gè)分支,提供了圖片處理功能。
pip3 install Pillow
到此,云主機(jī)的開發(fā)環(huán)境已經(jīng)測(cè)試OK。
三、人臉識(shí)別服務(wù)使用
3.1 開通人臉識(shí)別服務(wù)
鏈接地址: https://console.huaweicloud.com/frs/?region=cn-north-4&locale=zh-cn#/frs/manage/index
開通之后的效果。
3.2 接口文檔
在控制臺(tái)頁(yè)面中,可以看到每個(gè)功能都有一個(gè)接口文檔
按鈕,點(diǎn)擊可以一鍵翻到對(duì)應(yīng)的幫助文檔頁(yè)面。快速了解此功能的使用辦法。
這里以人臉檢測(cè)V2
接口文檔介紹為例。 點(diǎn)擊進(jìn)去訪問的頁(yè)面如下。
向下翻,可以看到此接口如何調(diào)用,需要傳入什么參數(shù)。
在下面可以看到一個(gè)請(qǐng)求參數(shù)
的說(shuō)明。第一個(gè)參數(shù)是:X-Auth-Token
,這個(gè)很重要,調(diào)用華為云的API接口都需要填這個(gè)參數(shù)。 關(guān)于如何獲取這個(gè)X-Auth-Token
參數(shù)。 下面章節(jié)里會(huì)詳細(xì)介紹。
3.3 項(xiàng)目憑證
接下來(lái)調(diào)用人臉服務(wù)的API接口,都需要token進(jìn)行鑒權(quán),需要使用項(xiàng)目憑證
這個(gè)參數(shù)。
【1】獲取項(xiàng)目憑證 點(diǎn)擊左上角用戶名,選擇下拉菜單里的我的憑證
。 記住這個(gè)項(xiàng)目ID
,后面會(huì)用到。
3.4 創(chuàng)建IAM賬戶
創(chuàng)建一個(gè)IAM賬戶,因?yàn)榻酉聛?lái)使用人臉服務(wù)的API接口,這些接口都需要token進(jìn)行鑒權(quán)。簡(jiǎn)單來(lái)說(shuō),就是身份的認(rèn)證。 調(diào)用接口獲取Token時(shí),就需要填寫IAM賬號(hào)信息。所以,接下來(lái)演示一下過(guò)程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
鼠標(biāo)放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認(rèn)證
。
點(diǎn)擊右上角創(chuàng)建用戶
。
填寫用戶名和密碼信息:
繼續(xù)點(diǎn)擊下一步:
然后點(diǎn)擊創(chuàng)建用戶
。
創(chuàng)建成功:
創(chuàng)建完成
用戶信息如下:
主用戶名 xiao_ping_ping
IAM用戶 ds_abc
密碼 DS12345678
然后回到人臉服務(wù)去的控制臺(tái)頁(yè)面 要點(diǎn)擊開通管理,給新創(chuàng)建的IAM用戶賦予權(quán)限。 一定要開,不然后面訪問API是沒有權(quán)限的。
就像這樣,點(diǎn)擊開通服務(wù)
即可。
3.5 獲取token鑒權(quán)
【1】Token介紹
為了方便接下來(lái)調(diào)用華為云的API接口,這里先完成token
參數(shù)的獲取。
幫助文檔:https://support.huaweicloud.com/api-iam/iam_30_0001.html
獲取的Token有效性說(shuō)明:
Token的有效期為 24小時(shí) 。建議進(jìn)行緩存,避免頻繁調(diào)用。使用Token前請(qǐng)確保Token離過(guò)期有足夠的時(shí)間,防止調(diào)用API的過(guò)程中Token過(guò)期導(dǎo)致調(diào)用API失敗。重新獲取Token,不影響已有Token有效性。
【2】接口使用說(shuō)明
在文檔頁(yè)面,向下翻,可以看到對(duì)于此接口的詳細(xì)說(shuō)明。還支持使用在線調(diào)試。
【3】編寫代碼獲取token
import requests
import json
# 主賬號(hào)用戶名
MAIN_USER = "[填你自己的]"
# IAM 子賬戶用戶名
IAM_USER = "[填你自己的]"
# IAM 子賬戶密碼
IAM_PASSWORD = "[填你自己的]"
# 項(xiàng)目 ID
PROJECT_ID = "[填你自己的]"
# 服務(wù)器區(qū)域代號(hào)
SERVER_ID = "cn-north-4"
# 保存 TOKEN 的文件路徑
TOKEN_FILE_PATH = "token.txt"
def get_token():
"""
功能: 獲取 TOKEN 并保存到本地文件
"""
# 請(qǐng)求地址
request_url = f"https://iam.{SERVER_ID}.myhuaweicloud.com/v3/auth/tokens"
# 構(gòu)造請(qǐng)求頭
headers = {
"Content-Type": "application/json;charset=UTF-8"
}
# 構(gòu)造請(qǐng)求體
payload = {
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": MAIN_USER
},
"name": IAM_USER,
"password": IAM_PASSWORD
}
}
},
"scope": {
"project": {
"name": SERVER_ID
}
}
}
}
# 發(fā)出 POST 請(qǐng)求
try:
response = requests.post(request_url, headers=headers, data=json.dumps(payload))
# 打印狀態(tài)碼
print(f"狀態(tài)碼: {response.status_code}")
if response.status_code == 201:
# 讀取 X-Subject-Token 響應(yīng)頭
token = response.headers.get("X-Subject-Token")
# 打印返回的數(shù)據(jù)和 Token
print(f"反饋的數(shù)據(jù): {response.json()}")
print(f"Token: {token}")
# 保存 TOKEN 到本地文件
if token:
save_token_to_file(token)
print(f"TOKEN 已保存到 {TOKEN_FILE_PATH}")
else:
print("未能獲取到 TOKEN")
else:
print(f"獲取 TOKEN 失敗: {response.text}")
except Exception as e:
print(f"請(qǐng)求發(fā)生錯(cuò)誤: {e}")
def save_token_to_file(token):
"""
保存 TOKEN 到本地文件
"""
try:
with open(TOKEN_FILE_PATH, "w") as file:
file.write(token)
except Exception as e:
print(f"保存 TOKEN 時(shí)發(fā)生錯(cuò)誤: {e}")
def main():
# 獲取 TOKEN
get_token()
if __name__ == "__main__":
main()
代碼說(shuō)明:
(1) 依賴庫(kù) :使用requests庫(kù)發(fā)起 HTTP 請(qǐng)求。 如果沒有安裝,在運(yùn)行代碼前安裝依賴庫(kù):
pip install requests
(2) 主要邏輯 :構(gòu)造請(qǐng)求頭和請(qǐng)求體。發(fā)起 POST
請(qǐng)求,獲取響應(yīng)。從響應(yīng)頭中提取 X-Subject-Token
并保存到本地文件。
(3) TOKEN 保存 : TOKEN 被保存到 token.txt
文件中,方便后續(xù)直接讀取使用。
(4) 運(yùn)行方式 : 將代碼保存為get_token.py,可以通過(guò)命令運(yùn)行:
python get_token.py
也可以直接在終端運(yùn)行,更加方便。 代碼編寫完畢,點(diǎn)擊右上角的綠色三角形
按鈕,運(yùn)行。 得到了Token
然后保存到本地文件里。
3.6 人臉檢測(cè)功能
【1】接口地址
幫助文檔地址: https://support.huaweicloud.com/api-face/face_02_0084.html
人臉檢測(cè)功能的API接口地址:https://face.cn-north-4.myhuaweicloud.com/v2/{project_id}/face-detect
【2】請(qǐng)求參數(shù)
參數(shù) | 參數(shù)類型 | 描述 |
---|---|---|
X-Auth-Token | String | 用戶Token。 |
Content-Type | String | 參數(shù)值為application/json |
參數(shù)名 | 參數(shù)類型 | 說(shuō)明 |
---|---|---|
image_base64 | String | 圖像數(shù)據(jù),Base64編碼,要求:Base64編碼后大小不超過(guò)8MB,建議小于1MB。圖片為JPG/JPEG/BMP/PNG格式。 |
attributes | String | 是否返回人臉屬性,希望獲取的屬性列表,多個(gè)屬性間使用逗號(hào)(,)隔開。目前支持的屬性有:2:年齡4:裝束(帽子、眼鏡)6:口罩7:發(fā)型8:胡須11:圖片類型12:質(zhì)量13:表情21:人臉圖片旋轉(zhuǎn)角(順時(shí)針偏轉(zhuǎn)角度),支持0°、90°、180°和270°圖片旋轉(zhuǎn)。 |
【3】響應(yīng)參數(shù)
如果狀態(tài)返回400,表示肯定是調(diào)用出錯(cuò)了,如果返回狀態(tài)碼是 200,那么返回的值就是以下的幾種情況。
參數(shù) | 描述 |
---|---|
faces | 檢測(cè)到的人臉。 調(diào)用失敗時(shí)無(wú)此字段。 |
參數(shù) | 描述 |
---|---|
bounding_box | 人臉在圖像中的位置。 |
attributes | 人臉關(guān)鍵屬性,比如頭部姿態(tài)。 |
參數(shù) | 描述 |
---|---|
width | 人臉圖像所在矩形框的寬度。 |
top_left_y | 矩形框左上角縱坐標(biāo)。 |
top_left_x | 矩形框左上角橫坐標(biāo)。 |
height | 人臉圖像所在矩形框的高度。 |
參數(shù) | 描述 |
---|---|
dress | 包含glass和hat兩個(gè)屬性結(jié)果。 |
glass | 是否戴眼鏡:yes:戴眼鏡dark:戴墨鏡none:未戴眼鏡unknown:未知 |
hat | 是否戴帽子:yes:戴帽子none:未戴帽子unknown:未知 |
age | 年齡。 |
mask | 是否戴口罩:yes:戴口罩none:未戴口罩unknown:未知 |
beard | 胡須:yes:有胡須none:無(wú)胡須unknown:未知 |
phototype | 圖片類型:idcard:證件照monitor:攝像頭監(jiān)控internet photo:網(wǎng)絡(luò)圖片 |
quality | 圖片中人臉的遮擋度、模糊度、光照強(qiáng)度、姿態(tài)角度。 |
hair | 發(fā)型:long:長(zhǎng)發(fā)short:短發(fā)unknown:未知 |
expression | 人臉表情,包括中性、高興、害怕、驚訝、傷心、生氣、厭惡。 |
face_angle | 人臉圖片旋轉(zhuǎn)角(順時(shí)針偏轉(zhuǎn)角度),支持0°、90°、180°和270°圖片旋轉(zhuǎn)。 |
參數(shù) | 參數(shù)類型 | 描述 |
---|---|---|
glass | String | 是否戴眼鏡:yes:戴眼鏡dark:戴墨鏡none:未戴眼鏡unknown:未知 |
hat | String | 是否戴帽子:yes:戴帽子none:未戴帽子unknown:未知 |
參數(shù) | 參數(shù)類型 | 描述 | 推薦值 |
---|---|---|---|
total_score | Double | 人臉質(zhì)量總分,取值范圍[0-1],分值越大質(zhì)量越高。 | 大于0.45 |
blur | Double | 模糊度,取值范圍[0-1],分值越大模糊問題越嚴(yán)重。 | 小于0.3 |
pose | Double | 姿態(tài),取值范圍[0-1],分值越大姿態(tài)問題越嚴(yán)重。 | 小于0.3 |
occlusion | Double | 遮擋,取值范圍[0-1],分值越大遮擋問題越嚴(yán)重。 | 小于0.3 |
illumination | Double | 光照,取值范圍[0-1],分值越大光照問題越嚴(yán)重。 | 小于0.3 |
參數(shù) | 參數(shù)類型 | 描述 |
---|---|---|
type | String | 人臉表情類型:neutral:中性happy:高興fear:害怕surprise:驚訝sad:傷心angry:生氣disgust:厭惡unknown:圖片質(zhì)量問題導(dǎo)致未識(shí)別 |
probability | Double | 表情置信度,取值范圍[0-1]。 |
【4】準(zhǔn)備測(cè)試的圖片
打開文件管理器,在/home/developer
目錄下創(chuàng)建一個(gè)image
文件夾。
然后打開瀏覽器,下載幾張測(cè)試的圖片。
準(zhǔn)備好兩張測(cè)試的照片。
【5】編寫代碼
重新新建一個(gè)face_detect.py
文件。用于編寫測(cè)試人臉檢測(cè)代碼。
編寫代碼如下:
import requests
import base64
import json
# 項(xiàng)目 ID 和服務(wù)器區(qū)域代號(hào)
PROJECT_ID = "填你自己的"
SERVER_ID = "cn-north-4"
# TOKEN 文件路徑
TOKEN_FILE_PATH = "token.txt"
def read_token_from_file():
"""
從文件中讀取 TOKEN
"""
try:
with open(TOKEN_FILE_PATH, "r") as file:
token = file.read().strip()
return token
except Exception as e:
print(f"讀取 TOKEN 文件時(shí)發(fā)生錯(cuò)誤: {e}")
return None
def image_to_base64(image_path):
"""
將圖片轉(zhuǎn)換為 Base64 編碼
"""
try:
with open(image_path, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
return encoded_string
except Exception as e:
print(f"圖片編碼為 Base64 時(shí)發(fā)生錯(cuò)誤: {e}")
return None
def face_detect(image_path):
"""
人臉檢測(cè)功能
"""
# 獲取 TOKEN
token = read_token_from_file()
if not token:
print("TOKEN 無(wú)法加載,檢測(cè)失敗")
return
# 請(qǐng)求地址
request_url = f"https://face.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/face-detect"
# 將圖片轉(zhuǎn)換為 Base64 編碼
img_data = image_to_base64(image_path)
if not img_data:
print("圖片無(wú)法轉(zhuǎn)換為 Base64,檢測(cè)失敗")
return
# 構(gòu)造請(qǐng)求頭
headers = {
"Content-Type": "application/json",
"X-Auth-Token": token
}
# 構(gòu)造請(qǐng)求體
payload = {
"image_base64": img_data,
"attributes": "1,2,4,6,7,8" # 自定義返回字段
}
# 發(fā)送 POST 請(qǐng)求
try:
response = requests.post(request_url, headers=headers, data=json.dumps(payload))
# 打印狀態(tài)碼
print(f"狀態(tài)碼: {response.status_code}")
# 解析和打印返回結(jié)果
if response.status_code == 200:
print("人臉檢測(cè)成功,結(jié)果如下:")
print(json.dumps(response.json(), indent=4, ensure_ascii=False))
else:
print(f"人臉檢測(cè)失敗: {response.text}")
except Exception as e:
print(f"請(qǐng)求發(fā)生錯(cuò)誤: {e}")
def main():
# 圖片路徑,替換為你要檢測(cè)的圖片路徑
image_path = "/home/developer/image/1.jpeg"
# 執(zhí)行人臉檢測(cè)
face_detect(image_path)
if __name__ == "__main__":
main()
以下是用 Python 實(shí)現(xiàn)的人臉檢測(cè)功能代碼,使用 requests
庫(kù)來(lái)發(fā)出 HTTP 請(qǐng)求,并從本地的 token.txt
文件中讀取 TOKEN。代碼也包含將圖片轉(zhuǎn)換為 Base64 編碼的邏輯:
import requests
import base64
import json
# 項(xiàng)目 ID 和服務(wù)器區(qū)域代號(hào)
PROJECT_ID = "填你自己的"
SERVER_ID = "cn-north-4"
# TOKEN 文件路徑
TOKEN_FILE_PATH = "token.txt"
def read_token_from_file():
"""
從文件中讀取 TOKEN
"""
try:
with open(TOKEN_FILE_PATH, "r") as file:
token = file.read().strip()
return token
except Exception as e:
print(f"讀取 TOKEN 文件時(shí)發(fā)生錯(cuò)誤: {e}")
return None
def image_to_base64(image_path):
"""
將圖片轉(zhuǎn)換為 Base64 編碼
"""
try:
with open(image_path, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
return encoded_string
except Exception as e:
print(f"圖片編碼為 Base64 時(shí)發(fā)生錯(cuò)誤: {e}")
return None
def face_detect(image_path):
"""
人臉檢測(cè)功能
"""
# 獲取 TOKEN
token = read_token_from_file()
if not token:
print("TOKEN 無(wú)法加載,檢測(cè)失敗")
return
# 請(qǐng)求地址
request_url = f"https://face.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/face-detect"
# 將圖片轉(zhuǎn)換為 Base64 編碼
img_data = image_to_base64(image_path)
if not img_data:
print("圖片無(wú)法轉(zhuǎn)換為 Base64,檢測(cè)失敗")
return
# 構(gòu)造請(qǐng)求頭
headers = {
"Content-Type": "application/json",
"X-Auth-Token": token
}
# 構(gòu)造請(qǐng)求體
payload = {
"image_base64": img_data,
"attributes": "1,2,4,6,7,8" # 自定義返回字段
}
# 發(fā)送 POST 請(qǐng)求
try:
response = requests.post(request_url, headers=headers, data=json.dumps(payload))
# 打印狀態(tài)碼
print(f"狀態(tài)碼: {response.status_code}")
# 解析和打印返回結(jié)果
if response.status_code == 200:
print("人臉檢測(cè)成功,結(jié)果如下:")
print(json.dumps(response.json(), indent=4, ensure_ascii=False))
else:
print(f"人臉檢測(cè)失敗: {response.text}")
except Exception as e:
print(f"請(qǐng)求發(fā)生錯(cuò)誤: {e}")
def main():
# 圖片路徑,替換為你要檢測(cè)的圖片路徑
image_path = "/home/developer/image/1.jpeg"
# 執(zhí)行人臉檢測(cè)
face_detect(image_path)
if __name__ == "__main__":
main()
代碼說(shuō)明:
(1) 依賴庫(kù) :
- 使用
requests
進(jìn)行 HTTP 請(qǐng)求。 - 使用
base64
將圖片轉(zhuǎn)換為 Base64 編碼。 - 確保安裝了依賴庫(kù):pip install requests
(2) 主要邏輯 :
- 讀取 TOKEN :從
token.txt
文件中讀取 TOKEN。 - 圖片編碼 :將輸入圖片文件轉(zhuǎn)為 Base64 格式。
- 構(gòu)造請(qǐng)求 :設(shè)置請(qǐng)求頭和請(qǐng)求體,指定自定義返回字段。
- 發(fā)送請(qǐng)求 :調(diào)用 API 完成人臉檢測(cè),打印響應(yīng)結(jié)果。
(3) 錯(cuò)誤處理 :捕獲文件讀取、圖片編碼以及 HTTP 請(qǐng)求的異常,方便排查問題。
(4) 運(yùn)行方式 :
- 將代碼保存為
face_detect.py
。 - 替換
image_path
為本地圖片的實(shí)際路徑。 - 運(yùn)行代碼:
python face_detect.py
(5) 輸出 :
- 成功時(shí),打印 API 返回的 JSON 數(shù)據(jù)。
- 失敗時(shí),打印錯(cuò)誤狀態(tài)碼及返回信息。
【6】終端運(yùn)行測(cè)試
也可以直接在終端運(yùn)行,更加方便。 代碼編寫完畢,點(diǎn)擊右上角的綠色三角形
按鈕,運(yùn)行。
當(dāng)前調(diào)用測(cè)試的圖片是:
接口返回的結(jié)果:
{
"faces": [
{
"bounding_box": {
"width": 150,
"top_left_y": 431,
"top_left_x": 192,
"height": 182
},
"attributes": {
"gender": "female",
"age": 25,
"dress": {
"glass": "none",
"hat": "none"
},
"mask": "none",
"hair": "long",
"beard": "none"
}
},
{
"bounding_box": {
"width": 148,
"top_left_y": 428,
"top_left_x": 358,
"height": 188
},
"attributes": {
"gender": "female",
"age": 26,
"dress": {
"glass": "none",
"hat": "none"
},
"mask": "none",
"hair": "long",
"beard": "none"
}
}
]
}
JSON數(shù)據(jù)表示的含義如下:
- 檢測(cè)到了兩張人臉。
- 第一張人臉 :
- 位置:左上角坐標(biāo)(192, 431),寬度150像素,高度182像素。
- 屬性:女性,年齡25歲,未戴眼鏡和帽子,長(zhǎng)發(fā),無(wú)胡須,未戴口罩。
- 第二張人臉 :
- 位置:左上角坐標(biāo)(358, 428),寬度148像素,高度188像素。
- 屬性:女性,年齡26歲,未戴眼鏡和帽子,長(zhǎng)發(fā),無(wú)胡須,未戴口罩。
這些信息提供了每張人臉的位置以及一些基本屬性如性別、年齡、是否佩戴眼鏡或帽子等。
到此,接口就已經(jīng)調(diào)用成功了。從返回的
3.7 創(chuàng)建人臉庫(kù)
【1】人臉庫(kù)的作用
如果我們要做考勤系統(tǒng),簽到系統(tǒng),那么設(shè)計(jì)之前需要?jiǎng)?chuàng)建人臉庫(kù),錄入每個(gè)人員的人臉信息,才可以設(shè)計(jì)后面的考勤,簽到的人臉對(duì)比識(shí)別功能。
【2】接口地址
創(chuàng)建人臉庫(kù)的幫助文檔地址: https://support.huaweicloud.com/api-face/face_02_0088.html
繼續(xù)向下翻,可以看到接口地址
和請(qǐng)求參數(shù)
的說(shuō)明。
接口地址: https://face.cn-north-4.myhuaweicloud.com/v2/{project_id}/face-sets
【3】請(qǐng)求參數(shù)
參數(shù) | 描述 |
---|---|
X-Auth-Token | 用戶Token。 |
Content-Type | 參數(shù)值為application/json |
參數(shù) | 描述 |
---|---|
external_fields | 用戶自定義數(shù)據(jù),自定義字段不能以vector、bounding_box、external_image_id、face_id、create_time、_id、_all、_source等字段命名,這些字段為內(nèi)置字段,自定義字段避免使用。自定義字段的key值長(zhǎng)度范圍為[1,36],string類型的value長(zhǎng)度范圍為[1,256]。如果在后續(xù)操作中,使用該自定義字段向人臉庫(kù)中添加人臉,需要在創(chuàng)建人臉庫(kù)時(shí)定義該字段。 |
face_set_name | 人臉庫(kù)的名稱,字符串長(zhǎng)度1-64。建議人臉庫(kù)的名稱不要以下劃線(_)開頭,否則云監(jiān)控服務(wù)會(huì)無(wú)法采集人臉數(shù)量。 |
face_set_capacity | 人臉庫(kù)最大的容量,填寫1萬(wàn)整數(shù)倍的數(shù)字,例如:30000。默認(rèn)為100000,最大值為100000,可通過(guò)創(chuàng)建新的人臉庫(kù)進(jìn)行擴(kuò)容,每個(gè)用戶可使用10個(gè)人臉庫(kù),每個(gè)人臉庫(kù)容量為10萬(wàn)個(gè)人臉特征。如需擴(kuò)容單個(gè)人臉庫(kù)規(guī)模,請(qǐng)聯(lián)系華為云客服確認(rèn)擴(kuò)容規(guī)模與價(jià)格。 |
參數(shù) | 描述 |
---|---|
type | 數(shù)據(jù)類型支持string、integer、double、long等。 |
【4】響應(yīng)參數(shù)
正常情況下,返回的狀態(tài)碼:200
參數(shù) | 描述 |
---|---|
face_number | 人臉庫(kù)中已有的人臉特征的數(shù)量。 |
external_fields | 用戶的自定義字段。 |
face_set_id | 人臉庫(kù)ID,隨機(jī)生成的包含八個(gè)字符的字符串。 |
face_set_name | 人臉庫(kù)名稱。 |
create_date | 創(chuàng)建時(shí)間。 |
face_set_capacity | 人臉庫(kù)最大的容量。創(chuàng)建人臉庫(kù)時(shí),請(qǐng)求參數(shù)如果不設(shè)置face_set_capacity參數(shù),默認(rèn)每個(gè)人臉庫(kù)最大容量為10萬(wàn)個(gè)人臉特征。 |
【5】編寫代碼
創(chuàng)建一個(gè)新文件名字為:face-sets.py
編寫代碼:
import requests
# 項(xiàng)目ID和服務(wù)器區(qū)域代號(hào)
PROJECT_ID = "填你自己的"
SERVER_ID = "cn-north-4"
# 從當(dāng)前目錄下的token.txt文件讀取Token
with open('token.txt', 'r') as file:
Token = file.read().strip()
def create_face_database(face_lib_name):
# 設(shè)置請(qǐng)求地址
url = f"https://face.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/face-sets"
# 構(gòu)造請(qǐng)求頭
headers = {
"Content-Type": "application/json",
"X-Auth-Token": Token
}
# 構(gòu)造請(qǐng)求體
payload = {
"external_fields": {
"face_name": {"type": "string"},
"face_phone": {"type": "string"},
"face_class": {"type": "string"}
},
"face_set_name": face_lib_name
}
# 發(fā)送POST請(qǐng)求
response = requests.post(url, json=payload, headers=headers)
# 輸出響應(yīng)狀態(tài)碼及內(nèi)容
print(f"Status Code: {response.status_code}")
print(f"Response: {response.json()}")
# 調(diào)用函數(shù)創(chuàng)建人臉庫(kù)
create_face_database("face_1")
運(yùn)行代碼的時(shí)候,要修改最前面的項(xiàng)目ID參數(shù),和最后創(chuàng)建的人臉庫(kù)名稱。 代碼從本地文件token.txt
中讀取認(rèn)證Token。記得在運(yùn)行此腳本之前檢查token.txt
文件是否存在且包含有效的Token值(最前面已經(jīng)說(shuō)了怎么得到這個(gè)Token值)。
【6】終端運(yùn)行代碼測(cè)試
返回的結(jié)果如下:
Response: {'face_set_info': {'face_number': 0, 'face_set_id': 'tKzQuUW4', 'face_set_name': 'face_1', 'create_date': '2024-11-28 08:41:49', 'face_set_capacity': 100000, 'external_fields': {'face_name': {'type': 'string'}, 'face_phone': {'type': 'string'}, 'face_class': {'type': 'string'}}}}
根據(jù)返回的JSON響應(yīng)數(shù)據(jù)以及華為云人臉識(shí)別服務(wù)FRS的文檔說(shuō)明,下面是JSON數(shù)據(jù)信息的總結(jié):
face_set_info :包含了創(chuàng)建的人臉庫(kù)的具體信息。
- face_number :人臉庫(kù)中已有的人臉特征數(shù)量。當(dāng)前值為0,表示剛剛創(chuàng)建的人臉庫(kù)還沒有添加任何人臉特征。
- face_set_id :人臉庫(kù)的唯一標(biāo)識(shí)符,隨機(jī)生成的字符串。這里的ID是
tKzQuUW4
。 - face_set_name :用戶指定的人臉庫(kù)名稱。這里命名為
face_1
。 - create_date :人臉庫(kù)的創(chuàng)建時(shí)間。這里是
2024-11-28 08:41:49
(UTC+08:00)。 - face_set_capacity :人臉庫(kù)的最大容量。默認(rèn)情況下為100,000個(gè)人臉特征,這里顯示的也是100,000。
- external_fields :用戶自定義字段的信息。
- face_name :類型為
string
,用于存儲(chǔ)人臉名稱。 - face_phone :類型為
string
,用于存儲(chǔ)電話號(hào)碼。 - face_class :類型為
string
,用于存儲(chǔ)人臉分類信息。
- face_name :類型為
JSON響應(yīng)表明成功創(chuàng)建了一個(gè)名為face_1
的人臉庫(kù),該庫(kù)的ID是tKzQuUW4
,創(chuàng)建于2024年11月28日08:41:49,并且設(shè)置了三個(gè)自定義字段(face_name
、face_phone
和face_class
),每個(gè)字段的類型都是string
。目前該人臉庫(kù)尚未添加任何人臉特征。
3.8 向人臉庫(kù)添加人臉
【1】接口地址
幫助文檔:https://support.huaweicloud.com/api-face/face_02_0093.html
接口地址: https://face.cn-north-4.myhuaweicloud.com/v2/{project_id}/face-sets/{face_set_name}/faces
參數(shù) | 參數(shù)類型 | 描述 |
---|---|---|
project_id | String | 項(xiàng)目ID |
face_set_name | String | 人臉庫(kù)名稱,字符串長(zhǎng)度1-64。 |
【2】請(qǐng)求參數(shù)
參數(shù) | 是否必選 | 參數(shù)類型 | 描述 |
---|---|---|---|
X-Auth-Token | 是 | String | 用戶Token。 |
Content-Type | 是 | String | 發(fā)送的實(shí)體的MIME類型,參數(shù)值為“application/json”。 |
參數(shù)名 | 參數(shù)類型 | 說(shuō)明 |
---|---|---|
image_base64 | String | 圖像數(shù)據(jù),Base64編碼,要求:Base64編碼后大小不超過(guò)8MB,建議小于1MB。圖片為JPG/JPEG/BMP/PNG格式。 |
external_image_id | String | 用戶指定的圖片外部ID,與當(dāng)前圖像綁定。用戶沒提供,系統(tǒng)會(huì)生成一個(gè)。該ID長(zhǎng)度范圍為1~36位,可以包含字母、數(shù)字、中劃線或者下劃線,不包含其他的特殊字符。 |
external_fields | Object | 根據(jù)用戶自定義數(shù)據(jù)類型,填入相應(yīng)的數(shù)值。需在創(chuàng)建人臉庫(kù)時(shí)定義external_fields字段,才可以在添加人臉時(shí)使用該字段。 |
single | boolean | 是否將圖片中的最大人臉添加至人臉庫(kù)。可選值包括:true:傳入的單張圖片中如果包含多張人臉,則只將最大人臉添加到人臉庫(kù)中。false:默認(rèn)為false。傳入的單張圖片中如果包含多張人臉,則將所有人臉添加至人臉庫(kù)中。 |
【3】響應(yīng)參數(shù)
狀態(tài)碼:200
參數(shù) | 描述 |
---|---|
face_set_id | 人臉庫(kù)ID。 調(diào)用失敗時(shí)無(wú)此字段。 |
face_set_name | 人臉庫(kù)名稱。 調(diào)用失敗時(shí)無(wú)此字段。 |
faces | 調(diào)用失敗時(shí)無(wú)此字段。 |
【4】編寫代碼
創(chuàng)建新文件:face-sets_lib.py
編寫代碼如下:
import requests
import base64
import io
# 項(xiàng)目ID和服務(wù)器區(qū)域代號(hào)
PROJECT_ID = "填你自己的"
SERVER_ID = "cn-north-4"
# 從當(dāng)前目錄下的token.txt文件讀取Token
with open('token.txt', 'r') as file:
Token = file.read().strip()
def to_base64(image_path):
"""將圖片轉(zhuǎn)換為Base64編碼的字符串"""
with open(image_path, 'rb') as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
def register_face(image_path, face_lib, name):
# 讀取圖片并進(jìn)行Base64編碼
img_data = to_base64(image_path)
# 設(shè)置請(qǐng)求地址
url = f"https://face.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/face-sets/{face_lib}/faces"
# 構(gòu)造請(qǐng)求頭
headers = {
"Content-Type": "application/json",
"X-Auth-Token": Token
}
# 構(gòu)造請(qǐng)求體
payload = {
"image_base64": img_data,
"external_fields": {"face_name": name},
"single": True
}
# 發(fā)送POST請(qǐng)求
response = requests.post(url, json=payload, headers=headers)
# 輸出響應(yīng)狀態(tài)碼及內(nèi)容
print(f"Status Code: {response.status_code}")
print(f"Response: {response.json()}")
# 調(diào)用函數(shù)注冊(cè)人臉
register_face("/home/developer/image/1.jpeg", "face_1", "xiaolong")
運(yùn)行代碼時(shí),替換"face_1"
和"xiaolong"
為你實(shí)際的人臉庫(kù)名稱和自定義字段值。代碼從本地文件token.txt
中讀取認(rèn)證Token,并從指定路徑讀取圖片進(jìn)行Base64編碼。
【5】終端運(yùn)行測(cè)試
返回的結(jié)果如下:
Response: {'face_set_id': 'tKzQuUW4', 'face_set_name': 'face_1', 'faces': [{'face_id': '1cOqkdyg', 'external_image_id': 'JAHIqXTA', 'bounding_box': {'width': 148, 'top_left_x': 358, 'top_left_y': 428, 'height': 188}, 'external_fields': {'face_name': 'xiaolong'}}]}
Response: {'face_set_id': 'tKzQuUW4', 'face_set_name': 'face_1', 'faces': [{'face_id': '1cOqkdyg', 'external_image_id': 'JAHIqXTA', 'bounding_box': {'width': 148, 'top_left_x': 358, 'top_left_y': 428, 'height': 188}, 'external_fields': {'face_name': 'xiaolong'}}]}
Response: {'face_set_id': 'tKzQuUW4', 'face_set_name': 'face_1', 'faces': [{'face_id': '1cOqkdyg', 'external_image_id': 'JAHIqXTA', 'bounding_box': {'width': 148, 'top_left_x': 358, 'top_left_y': 428, 'height': 188}, 'external_fields': {'face_name': 'xiaolong'}}]}
Response: {'face_set_id': 'tKzQuUW4', 'face_set_name': 'face_1', 'faces': [{'face_id': '1cOqkdyg', 'external_image_id': 'JAHIqXTA', 'bounding_box': {'width': 148, 'top_left_x': 358, 'top_left_y': 428, 'height': 188}, 'external_fields': {'face_name': 'xiaolong'}}]}
根據(jù)返回的JSON響應(yīng)數(shù)據(jù)以及華為云人臉識(shí)別服務(wù)FRS的文檔,以下是JSON數(shù)據(jù)信息的總結(jié):
- face_set_id :人臉庫(kù)的唯一標(biāo)識(shí)符。這里的ID是
tKzQuUW4
。 - face_set_name :人臉庫(kù)的名稱。這里是
face_1
。 - faces :一個(gè)數(shù)組,包含了成功添加到人臉庫(kù)中的人臉信息。
- face_id :系統(tǒng)生成的唯一標(biāo)識(shí)符,用于標(biāo)識(shí)該人臉。這里的ID是
1cOqkdyg
。 - external_image_id :用戶指定的圖片外部ID,與當(dāng)前圖像綁定。這里的ID是
JAHIqXTA
。 - bounding_box :描述了人臉在圖像中的位置。
- width :矩形框的寬度。這里是148像素。
- top_left_x :矩形框左上角的橫坐標(biāo)。這里是358像素。
- top_left_y :矩形框左上角的縱坐標(biāo)。這里是428像素。
- height :矩形框的高度。這里是188像素。
- external_fields :用戶自定義字段的信息。
- face_name :自定義字段
face_name
的值,這里是xiaolong
。
- face_name :自定義字段
- face_id :系統(tǒng)生成的唯一標(biāo)識(shí)符,用于標(biāo)識(shí)該人臉。這里的ID是
這個(gè)JSON響應(yīng)表明成功將一張包含人臉的圖片添加到了名為face_1
的人臉庫(kù)中。人臉庫(kù)的ID是tKzQuUW4
。添加的人臉具有以下特征:
- 人臉I(yè)D為
1cOqkdyg
。 - 圖片外部ID為
JAHIqXTA
。 - 人臉在圖片中的位置由矩形框表示,寬度為148像素,高度為188像素,左上角坐標(biāo)為(358, 428)。
- 自定義字段
face_name
的值為xiaolong
。
3.9 從人臉庫(kù)匹配人臉
【1】功能說(shuō)明
人臉?biāo)阉魇侵冈谝延械娜四槑?kù)中,查詢與目標(biāo)人臉相似的一張或者多張人臉,并返回相應(yīng)的置信度。如果圖片中包含多個(gè)人臉,選取圖片中檢測(cè)到的最大尺寸人臉作為檢索的輸入。 支持傳入圖片或者faceID進(jìn)行人臉?biāo)阉鳌?/p>
【2】幫助文檔
地址:https://support.huaweicloud.com/api-face/face_02_0086.html
【3】接口地址
https://face.cn-north-4.myhuaweicloud.com/v2/{project_id}/face-sets/{face_set_name}/search
參數(shù) | 參數(shù)類型 | 描述 |
---|---|---|
project_id | String | 項(xiàng)目ID |
face_set_name | String | 人臉庫(kù)名稱,字符串長(zhǎng)度1-64。 |
【4】請(qǐng)求參數(shù)
參數(shù) | 是否必選 | 參數(shù)類型 | 描述 |
---|---|---|---|
X-Auth-Token | 是 | String | 用戶Token。 |
Content-Type | 是 | String | 發(fā)送的實(shí)體的MIME類型,參數(shù)值為“application/json”。 |
參數(shù)名 | 說(shuō)明 |
---|---|
image_base64 | 圖像數(shù)據(jù),Base64編碼,要求:Base64編碼后大小不超過(guò)8MB,建議小于1MB。圖片為JPG/JPEG/BMP/PNG格式。 |
face_id | 導(dǎo)入人臉時(shí),系統(tǒng)返回的人臉編號(hào),即人臉I(yè)D。 |
top_n | 返回查詢到的最相似的N張人臉,N默認(rèn)為10,取值范圍[0,1000]。N張人臉按照置信度降序排序,置信度越大越靠前。 |
threshold | 人臉相似度閾值,低于這個(gè)閾值則不返回,取值范圍[0,1],一般情況下建議取值0.93,默認(rèn)為0。 |
sort | 支持字段排序 |
filter | 過(guò)濾條件 |
return_fields | 指定返回的自定義字段。 |
【5】響應(yīng)參數(shù)
狀態(tài)碼:200
參數(shù) | 參數(shù)類型 | 描述 |
---|---|---|
faces | Array of SearchFace objects | 查找的人臉集合。 調(diào)用失敗時(shí)無(wú)此字段。 |
參數(shù) | 參數(shù)類型 | 描述 |
---|---|---|
bounding_box | BoundingBox object | 人臉在圖像中的位置。 |
similarity | Double | 人臉?biāo)阉鲿r(shí)用于被檢索的相似度。 |
external_fields | Object | 用戶添加的額外自定義字段。 |
external_image_id | String | 人臉?biāo)诘耐獠繄D片ID。 |
face_id | String | 人臉I(yè)D,由系統(tǒng)內(nèi)部生成的唯一ID。 |
參數(shù) | 參數(shù)類型 | 描述 |
---|---|---|
width | Integer | 矩形框?qū)挾取?/td> |
top_left_y | Integer | 矩形框左上角縱坐標(biāo)。 |
top_left_x | Integer | 矩形框左上角橫坐標(biāo)。 |
height | Integer | 矩形框高度。 |
【6】編寫代碼
新建文件。face-sets_search.py
代碼編寫如下:
import base64
import requests
import io
# 項(xiàng)目ID
PROJECT_ID = "填你自己的"
# 服務(wù)器區(qū)域代號(hào)
SERVER_ID = "cn-north-4"
# 從當(dāng)前目錄下的token.txt文件中讀取Token
with open('token.txt', 'r') as file:
TOKEN = file.read().strip()
def image_to_base64(image_path):
"""
將圖片轉(zhuǎn)換為 Base64 編碼
"""
try:
with open(image_path, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
return encoded_string
except Exception as e:
print(f"圖片編碼為 Base64 時(shí)發(fā)生錯(cuò)誤: {e}")
return None
def to_base64(image):
"""將圖片轉(zhuǎn)換為Base64編碼"""
buffered = io.BytesIO()
image.save(buffered, format="JPEG")
img_str = base64.b64encode(buffered.getvalue()).decode('utf-8')
return img_str
def find_face(image_path, face_lib, threshold=0.93):
# 將圖片轉(zhuǎn)換為 Base64 編碼
img_data = image_to_base64(image_path)
if not img_data:
print("圖片無(wú)法轉(zhuǎn)換為 Base64,檢測(cè)失敗")
return
# 設(shè)置請(qǐng)求地址
request_url = f"https://face.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/face-sets/{face_lib}/search"
# 設(shè)置數(shù)據(jù)提交格式及請(qǐng)求頭
headers = {
"Content-Type": "application/json",
"X-Auth-Token": TOKEN
}
# 構(gòu)造請(qǐng)求體
payload = {
"image_base64": img_data,
"return_fields": ["face_name"],
"threshold": threshold
}
# 發(fā)送POST請(qǐng)求
response = requests.post(request_url, json=payload, headers=headers)
# 檢查響應(yīng)狀態(tài)碼
if response.status_code == 200:
print("人臉?biāo)阉鞒晒?", response.json())
else:
print("人臉?biāo)阉魇?", response.status_code, response.text)
# 調(diào)用函數(shù)
find_face("/home/developer/image/1.jpeg", "face_1")
替換'/home/developer/image/1.jpeg'
和'face_1'
為實(shí)際的圖片路徑和人臉庫(kù)名稱。確保在調(diào)用此腳本之前,已正確配置好token.txt
文件,并且該文件位于與腳本相同的目錄下 [前面說(shuō)了這個(gè)token怎么來(lái)的]。
【7】終端運(yùn)行代碼測(cè)試
返回的結(jié)果如下:
人臉?biāo)阉鞒晒? {'faces': [{'face_id': '1cOqkdyg', 'external_image_id': 'JAHIqXTA', 'bounding_box': {'width': 148, 'top_left_x': 358, 'top_left_y': 428, 'height': 188}, 'external_fields': {'face_name': 'xiaolong'}, 'similarity': 1.0}]}
根據(jù)返回的JSON響應(yīng)數(shù)據(jù)以及華為云人臉識(shí)別服務(wù)FRS的文檔,以下是JSON數(shù)據(jù)信息的總結(jié):
- faces :一個(gè)數(shù)組,包含了搜索到的人臉信息。
- face_id :系統(tǒng)生成的唯一標(biāo)識(shí)符,用于標(biāo)識(shí)該人臉。這里的ID是
1cOqkdyg
。 - external_image_id :用戶指定的圖片外部ID,與當(dāng)前圖像綁定。這里的ID是
JAHIqXTA
。 - bounding_box :描述了人臉在圖像中的位置。
- width :矩形框的寬度。這里是148像素。
- top_left_x :矩形框左上角的橫坐標(biāo)。這里是358像素。
- top_left_y :矩形框左上角的縱坐標(biāo)。這里是428像素。
- height :矩形框的高度。這里是188像素。
- external_fields :用戶自定義字段的信息。
- face_name :自定義字段
face_name
的值,這里是xiaolong
。
- face_name :自定義字段
- similarity :人臉?biāo)阉鲿r(shí)的相似度分?jǐn)?shù)。這里的值為1.0,表示完全匹配。
- face_id :系統(tǒng)生成的唯一標(biāo)識(shí)符,用于標(biāo)識(shí)該人臉。這里的ID是
這個(gè)JSON響應(yīng)表明成功搜索到了一張人臉,并且該人臉與人臉庫(kù)中的一張人臉完全匹配。
- 人臉I(yè)D為
1cOqkdyg
。 - 圖片外部ID為
JAHIqXTA
。 - 人臉在圖片中的位置由矩形框表示,寬度為148像素,高度為188像素,左上角坐標(biāo)為(358, 428)。
- 自定義字段
face_name
的值為xiaolong
。 - 相似度分?jǐn)?shù)為1.0,表示完全匹配。
四、圖形化項(xiàng)目開發(fā)
4.1 安裝Tkinter庫(kù)
為了方便能直觀的展示項(xiàng)目的整體功能,接下來(lái)安裝 Tkinter ,完成人臉識(shí)別系列功能的設(shè)計(jì)。
在Python中, Tkinter用于創(chuàng)建圖形用戶界面(GUI)。這是Python的標(biāo)準(zhǔn)GUI庫(kù)。
下面是安裝方法:
4.2 測(cè)試Tkinter環(huán)境
創(chuàng)建一個(gè)新的文件。
編寫代碼:
import tkinter as tk # 導(dǎo)入 Tkinter 模塊
# 創(chuàng)建主窗口
window = tk.Tk()
# 設(shè)置窗口標(biāo)題
window.title("Hello Tkinter")
# 設(shè)置窗口大?。▽?x 高)
window.geometry("400x300")
# 顯示窗口并進(jìn)入事件循環(huán)
window.mainloop()
運(yùn)行效果如下:
代碼解析
(1)導(dǎo)入 Tkinter
import tkinter as tk
tkinter
是 Python 的標(biāo)準(zhǔn)庫(kù)模塊,用于創(chuàng)建和管理 GUI 界面。
(2)創(chuàng)建主窗口
window = tk.Tk()
Tk()
方法創(chuàng)建了一個(gè)主窗口對(duì)象,稱為“頂級(jí)窗口”。
(3)設(shè)置窗口標(biāo)題
window.title("Hello Tkinter")
title()
方法用來(lái)設(shè)置窗口標(biāo)題。
(4)設(shè)置窗口大小
window.geometry("400x300")
geometry()
方法用來(lái)設(shè)置窗口的尺寸,這里是寬400像素,高300像素。
(5)運(yùn)行窗口
window.mainloop()
mainloop()
方法啟動(dòng)窗口的事件循環(huán),程序會(huì)在這里等待用戶的操作(例如關(guān)閉窗口或點(diǎn)擊按鈕)。
4.3 設(shè)計(jì)界面
編寫代碼如下:
import tkinter as tk
from tkinter import filedialog, messagebox
# 全局變量,保存當(dāng)前載入的圖片路徑
current_image_path = None
# 創(chuàng)建主窗口
window = tk.Tk()
window.title("人臉識(shí)別服務(wù)工具")
window.geometry("600x400") # 增大窗口尺寸以顯示圖片
# 圖片顯示標(biāo)簽
image_label = tk.Label(window, text="圖片顯示區(qū)域", width=50, height=20, relief="solid")
image_label.pack(pady=10)
# 定義功能函數(shù)
def load_image():
global current_image_path
file_path = filedialog.askopenfilename(
title="選擇圖片文件",
filetypes=[("圖片文件", "*.jpg *.jpeg *.png *.bmp")]
)
if file_path:
current_image_path = file_path
display_image(file_path)
def display_image(file_path):
try:
img = Image.open(file_path)
img = img.resize((300, 300)) # 調(diào)整圖片尺寸
img_tk = ImageTk.PhotoImage(img)
image_label.config(image=img_tk, text="") # 顯示圖片,清除文本
image_label.image = img_tk # 防止垃圾回收
except Exception as e:
messagebox.showerror("錯(cuò)誤", f"無(wú)法載入圖片:{e}")
def face_detection():
if not current_image_path:
messagebox.showwarning("提示", "請(qǐng)先載入圖片!")
return
messagebox.showinfo("功能提示", f"人臉檢測(cè)功能待實(shí)現(xiàn)!當(dāng)前圖片路徑:{current_image_path}")
def create_face_library():
messagebox.showinfo("功能提示", "創(chuàng)建人臉庫(kù)功能待實(shí)現(xiàn)!")
def add_face_to_library():
if not current_image_path:
messagebox.showwarning("提示", "請(qǐng)先載入圖片!")
return
messagebox.showinfo("功能提示", f"向人臉庫(kù)添加人臉功能待實(shí)現(xiàn)!當(dāng)前圖片路徑:{current_image_path}")
def search_face():
if not current_image_path:
messagebox.showwarning("提示", "請(qǐng)先載入圖片!")
return
messagebox.showinfo("功能提示", f"搜索匹配人臉功能待實(shí)現(xiàn)!當(dāng)前圖片路徑:{current_image_path}")
# 創(chuàng)建按鈕
btn_load_image = tk.Button(window, text="載入圖片", command=load_image, width=20)
btn_face_detection = tk.Button(window, text="人臉檢測(cè)", command=face_detection, width=20)
btn_create_library = tk.Button(window, text="創(chuàng)建人臉庫(kù)", command=create_face_library, width=20)
btn_add_face = tk.Button(window, text="添加人臉到庫(kù)", command=add_face_to_library, width=20)
btn_search_face = tk.Button(window, text="搜索匹配人臉", command=search_face, width=20)
# 布局按鈕
btn_load_image.pack(pady=5)
btn_face_detection.pack(pady=5)
btn_create_library.pack(pady=5)
btn_add_face.pack(pady=5)
btn_search_face.pack(pady=5)
# 運(yùn)行主事件循環(huán)
window.mainloop()
運(yùn)行界面如下:
五、總結(jié)
華為云人臉識(shí)別服務(wù)(FRS)及其開發(fā)者空間云主機(jī)為開發(fā)者提供了一個(gè)功能強(qiáng)的開發(fā)平臺(tái),使得人臉識(shí)別技術(shù)的應(yīng)用和實(shí)現(xiàn)變得更加簡(jiǎn)單和便捷。通過(guò)調(diào)用開放的API接口,開發(fā)者可以輕松實(shí)現(xiàn)人臉檢測(cè)、人臉庫(kù)管理、人臉對(duì)比等關(guān)鍵功能,為考勤、簽到、門禁等場(chǎng)景提供智能化解決方案。
開發(fā)者空間云主機(jī)為用戶提供了預(yù)配置的云端開發(fā)環(huán)境,避免了繁瑣的本地配置過(guò)程,快速上手成為可能。結(jié)合CodeArts IDE以及預(yù)裝的開發(fā)工具鏈,開發(fā)者能夠?qū)W⒂诤诵拈_發(fā)任務(wù),提升效率。借助華為云豐富的資源,如云存儲(chǔ)、沙箱測(cè)試環(huán)境、技術(shù)培訓(xùn)課程等,開發(fā)者不僅能快速驗(yàn)證創(chuàng)意,還能通過(guò)學(xué)習(xí)和認(rèn)證不斷提升技能。
此外,華為云開發(fā)者空間云主機(jī)深度整合了鯤鵬、昇騰和鴻蒙等生態(tài)資源,助力開發(fā)者在廣泛的技術(shù)領(lǐng)域展開創(chuàng)新,并與全球開發(fā)者社區(qū)互動(dòng)交流,共同推動(dòng)技術(shù)進(jìn)步。這一平臺(tái)為云端開發(fā)提供了全面支持,涵蓋從開發(fā)到運(yùn)維的全周期服務(wù),是開發(fā)者實(shí)現(xiàn)技術(shù)突破和項(xiàng)目落地的重要助力。
審核編輯 黃宇
-
嵌入式
+關(guān)注
關(guān)注
5095文章
19189瀏覽量
307951 -
華為云
+關(guān)注
關(guān)注
3文章
2697瀏覽量
17607
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
樹莓派做人臉識(shí)別
人臉識(shí)別
奇谷人臉識(shí)別技術(shù)
華為云深度學(xué)習(xí)服務(wù),讓企業(yè)智能從此不求人
人臉識(shí)別在安防系統(tǒng)的應(yīng)用研究
RV1126 適配 Debian10(搭建人臉識(shí)別云服務(wù)器)
人臉識(shí)別模塊mini版【ESP32+百度云在線識(shí)別】UART串口輸出方便連接使用
如何在Core-1126-JD4上搭建一套類似的服務(wù)完成云人臉識(shí)別呢
【開發(fā)教程14】AI語(yǔ)音人臉識(shí)別(會(huì)議記錄儀-人臉打卡機(jī))-AI人臉系統(tǒng)架構(gòu)
【開發(fā)教程17】AI語(yǔ)音人臉識(shí)別(會(huì)議記錄儀-人臉打卡機(jī))-AI人臉注冊(cè)認(rèn)證與識(shí)別
【開發(fā)教程17】瘋殼·AI語(yǔ)音人臉識(shí)別(會(huì)議記錄儀-人臉打卡機(jī))-AI人臉注冊(cè)認(rèn)證與識(shí)別
高性能應(yīng)用 + 安全可信丨華為云人臉識(shí)別服務(wù) FRS 保障企業(yè)提升智能業(yè)務(wù)效率與安全
華為云 API 人臉識(shí)別服務(wù) FRS 的感知力—偷偷藏不住的你
![<b class='flag-5'>華為</b><b class='flag-5'>云</b> API <b class='flag-5'>人臉</b><b class='flag-5'>識(shí)別</b><b class='flag-5'>服務(wù)</b> <b class='flag-5'>FRS</b> 的感知力—偷偷藏不住的你](https://file1.elecfans.com//web2/M00/A7/C6/wKgaomUmvGaAL_XdAACyEEiRZ4w232.png)
ElfBoard開源項(xiàng)目|百度智能云平臺(tái)的人臉識(shí)別項(xiàng)目
![ElfBoard開源項(xiàng)目|百度智能<b class='flag-5'>云</b>平臺(tái)的<b class='flag-5'>人臉</b><b class='flag-5'>識(shí)別</b>項(xiàng)目](https://file1.elecfans.com/web3/M00/03/91/wKgZO2dqImyAMrkHAABBmezrNfQ419.png)
評(píng)論