一. 百度AI人臉接口介紹
1.基本介紹
接口能力
- 兩張人臉圖片相似度對比:比對兩張圖片中人臉的相似度,並返回相似度分值;
- 多種圖片類型:支持生活照、證件照、身份證芯片照、帶網紋照四種類型的人臉對比;
- 活體檢測:基於圖片中的破綻分析,判斷其中的人臉是否爲二次翻拍(舉例:如用戶A用手機拍攝了一張包含人臉的圖片一,用戶B翻拍了圖片一得到了圖片二,並用圖片二僞造成用戶A去進行識別操作,這種情況普遍發生在金融開戶、實名認證等環節。);
- 質量檢測:返回模糊、光照等質量檢測信息,用於輔助判斷圖片是否符合識別要求;
業務應用
用於比對多張圖片中的人臉相似度並返回兩兩比對的得分,可用於判斷兩張臉是否是同一人的可能性大小。
典型應用場景:如人證合一驗證,用戶認證等,可與您現有的人臉庫進行比對驗證。
2.請求參數和返回參數
請求參數
參數 | 必選 | 類型 | 說明 |
---|---|---|---|
image | 是 | string | 圖片信息(總數據大小應小於10M),圖片上傳方式根據image_type來判斷。 兩張圖片通過json格式上傳,格式參考表格下方示例 |
image_type | 是 | string | 圖片類型 BASE64:圖片的base64值,base64編碼後的圖片數據,需urlencode,編碼後的圖片大小不超過2M;URL:圖片的 URL地址( 可能由於網絡等原因導致下載圖片時間過長);FACE_TOKEN: 人臉圖片的唯一標識,調用人臉檢測接口時,會爲每個人臉圖片賦予一個唯一的FACE_TOKEN,同一張圖片多次檢測得到的FACE_TOKEN是同一個。 |
face_type | 否 | string | 人臉的類型 LIVE表示生活照:通常爲手機、相機拍攝的人像圖片、或從網絡獲取的人像圖片等,IDCARD表示身份證芯片照:二代身份證內置芯片中的人像照片, WATERMARK表示帶水印證件照:一般爲帶水印的小圖,如公安網小圖 CERT表示證件照片:如拍攝的身份證、工卡、護照、學生證等證件圖片 默認LIVE |
quality_control | 否 | string | 圖片質量控制 NONE: 不進行控制 LOW:較低的質量要求 NORMAL: 一般的質量要求 HIGH: 較高的質量要求 默認 NONE |
liveness_control | 否 | string | 活體檢測控制 NONE: 不進行控制 LOW:較低的活體要求(高通過率 低攻擊拒絕率) NORMAL: 一般的活體要求(平衡的攻擊拒絕率, 通過率) HIGH: 較高的活體要求(高攻擊拒絕率 低通過率) 默認NONE |
返回參數
參數名 | 必選 | 類型 | 說明 |
---|---|---|---|
score | 是 | float | 人臉相似度得分 |
face_list | 是 | array | 人臉信息列表 |
+face_token | 是 | string | 人臉的唯一標誌 |
3.請求示例(v3版本)
請求示例
(1)HTTP方法:POST
(2)請求URL: https://aip.baidubce.com/rest/2.0/face/v3/match
(3)URL參數:
參數 | 值 |
---|---|
access_token | 通過API Key和Secret Key獲取的access_token,參考“Access Token獲取” |
Header:
參數 | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
完整的請求url如下:
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/match?access_token=" + access_token
二.算法思路
1.首先根據自己的API Key和Secret Key獲取對應的access_token,將access_token添加到請求url參數中。
2.將要進行對比的兩張圖片分別經過Base64編碼成一串字符串,使用該字符串代替圖像地址。需要注意的是,圖片的base64編碼是不包含圖片頭的。如data:image/jpg;base64,
3.構建要傳入request請求中的json格式的數據。
4.發送post請求,返回響應結果。
具體過程:
1.首先根據自己的API Key和Secret Key獲取對應的access_token,將access_token添加到請求url參數中。
# encoding:utf-8
import requests
# 將API_KEY和SECRET_KEY分別替換成自己的
API_KEY = 'bIK................'
SECRET_KEY = 'oCb................'
# client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + API_KEY + '&client_secret=' + SECRET_KEY
response = requests.get(host)
if response:
print(response.json())
######## 輸出結果 #########
"""
{
'refresh_token': 'xxxxxxx',
'expires_in': 2592000,
'session_key': 'xxxxxxx',
'access_token': 'xxxxxxx',
'scope': 'xxxxxxx'
}
"""
###########################
可以看到輸出結果是一個字典,而 'access_token' 即爲需要的值所對應的鍵,故我們可通過response.json()['access_token']進行獲取。
2.將要進行對比的兩張圖片分別經過Base64編碼成一串字符串,使用該字符串代替圖像地址。需要注意的是,圖片的base64編碼是不包含圖片頭的。如data:image/jpg;base64,
filename1 = '1.jpg'
img1 = cv.imread(filename1)
f1 = open(filename1, 'rb')
img_1 = base64.b64encode(f1.read())
filename2 = '2.jpg'
img2 = cv.imread(filename2)
f2 = open(filename2, 'rb')
img_2 = base64.b64encode(f2.read())
print(str(img_1, 'utf-8'))
print(str(img_2, 'utf-8'))
通過上述代碼即可得到圖片對應的Base64編碼,可以將其封裝成一個函數:
def pic2base64(filename):
"""
讀取文件對應的圖片,將其經過Base64編碼成不帶圖片頭的字符串代替圖像地址。
- 請求的圖片需經過Base64編碼,圖片的base64編碼指將圖片數據編碼成一串字符串,使用該字符串代替圖像地址。
- 需要注意的是,圖片的base64編碼是不包含圖片頭的,如data:image/jpg;base64
:param filename:
:return:
"""
img = cv.imread(filename)
f = open(filename, 'rb')
res_img = base64.b64encode(f.read())
return str(res_img, 'utf-8')
3.構建要傳入request請求中的json格式的數據。
# pic_1和pic_2分別是Base64編碼後的字符串
pic_1 = pic2base64(filename1)
pic_2 = pic2base64(filename2)
access_token = 'xxxxxxxxxxx' # 根據自己獲取的access_token
# 構建請求url
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/match?access_token=" + access_token
# 構建headers,作爲post的headers參數
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
# 構建json類型的數據,作爲post請求的data參數
params = "[" \
"{\"image\": \"%s\", " \
"\"image_type\": \"BASE64\", " \
"\"face_type\": \"LIVE\", " \
"\"quality_control\": \"LOW\"}," \
"{\"image\": \"%s\", " \
"\"image_type\": \"BASE64\", " \
"\"face_type\": \"LIVE\", " \
"\"quality_control\": \"LOW\"}" \
"]" % (pic_1, pic_2)
4.發送post請求,返回響應結果。
# 發起POST請求
resp = requests.post(url=request_url, data=params, headers=headers)
# 打印返回的響應信息
if resp:
res_json = resp.json()
print(res_json)
########## 輸出結果 ###############
"""
{
'error_code': 0,
'error_msg': 'SUCCESS',
'log_id': 7999899975001,
'timestamp': 1592787625,
'cached': 0,
'result': {
'score': 36.03727722,
'face_list': [
{'face_token': '5d4ad1f83294b6f5c6efa972bb9680d0'},
{'face_token': '87193c64392d230cffc53f56b8d9f83c'}
]
}
}
"""
故我們可以通過判斷錯誤信息是否爲SUCCESS,是則打印出最終的score;否則打印出錯誤信息。
resp = requests.post(url=request_url, data=params, headers=headers)
if resp:
res_json = resp.json()
print(res_json)
error_msg = res_json['error_msg']
if error_msg != 'SUCCESS':
print("錯誤信息: ", error_msg)
else:
res_score = res_json['result']['score']
print("最終的得分是:", res_score)
三.完整代碼
import requests
import base64
import cv2 as cv
API_KEY = 'bIKRsY3ZQuYhby4jg0Z4QwDQ'
SECRET_KEY = 'oCbEN6p39hGvv5QDUcjuI8hFaRfM9iCx'
# client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
def get_access_token(API_KEY, SECRET_KEY):
"""
根據API_KEY和SECRET_KEY構造url請求,獲取access_token
:param API_KEY:
:param SECRET_KEY:
:return:
"""
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + API_KEY + '&client_secret=' + SECRET_KEY
response = requests.get(host)
if response:
return response.json()['access_token']
else:
return None
def pic2base64(filename):
"""
讀取文件對應的圖片,將其經過Base64編碼成不帶圖片頭的字符串代替圖像地址。
- 請求的圖片需經過Base64編碼,圖片的base64編碼指將圖片數據編碼成一串字符串,使用該字符串代替圖像地址。
- 需要注意的是,圖片的base64編碼是不包含圖片頭的,如data:image/jpg;base64
:param filename:
:return:
"""
img = cv.imread(filename)
f = open(filename, 'rb')
res_img = base64.b64encode(f.read())
return str(res_img, 'utf-8')
# 將要比較的文件進行Base64編碼成字符串
filename1 = 'James.jpg'
filename2 = 'wade.jpg'
pic_1 = pic2base64(filename1)
pic_2 = pic2base64(filename2)
# 獲取access_token
access_token = get_access_token(API_KEY, SECRET_KEY)
# 若access_token不爲空,則進行請求
if access_token is not None:
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/match?access_token=" + access_token
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
params = "[" \
"{\"image\": \"%s\", " \
"\"image_type\": \"BASE64\", " \
"\"face_type\": \"LIVE\", " \
"\"quality_control\": \"LOW\"}," \
"{\"image\": \"%s\", " \
"\"image_type\": \"BASE64\", " \
"\"face_type\": \"LIVE\", " \
"\"quality_control\": \"LOW\"}" \
"]" % (pic_1, pic_2)
resp = requests.post(url=request_url, data=params, headers=headers)
# 若返回響應,則讀取響應,判斷是否有錯誤,有則打印錯誤信息,否則輸出最終得分
if resp:
res_json = resp.json()
error_msg = res_json['error_msg']
if error_msg != 'SUCCESS':
print("錯誤信息: ", error_msg)
else:
res_score = res_json['result']['score']
print("最終的得分是:", res_score)
四.實現效果
圖片說明:以下兩張分別是wade.jpg和James.jpg,位於代碼同級目錄下。
結果:
最終的得分是: 36.03727722