使用百度AI接口v3進行人臉對比

一. 百度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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章