目錄
一、需求
二、準備工作
1、申請服務
2、創建應用,獲取開發密鑰
3、官方開發文檔
4、測試人像圖片
三、PHP接入
1、鑒權,獲取access_token
2、人臉對比
四、完整代碼
一、需求
現在人臉識別、人臉對比技術越來越成熟,使用越來越廣泛,比較好的是百度AI開放平臺提供的人臉對比接口,對接簡單,那么怎樣通過PHP來接入人臉識別的接口,以實現人臉識別呢?本篇文章詳細介紹PHP接入百度AI人臉識別PAI的全步驟。
二、準備工作
因為使用的是百度AI開放平臺的人臉識別接口,就需要進入到百度開放平臺注冊/登錄平臺,創建人臉對比應用,獲取AIP Key和Secret Key。
1、申請服務
進入百度開放平臺,找到“開放能力->人臉與人體->人臉對比”服務,立即申請使用。
地址:人臉對比_人臉對比識別_人臉對比相似度-百度AI開放平臺
2、創建應用,獲取開發密鑰
登錄平臺后進入控制臺,點擊左上角菜單,搜索并選擇“人臉識別”,點擊右側菜單應用列表,創建應用,勾選“人臉對比V3”,立即創建,創建成功后會有PAI key和Secret Key。
詳細接入說明:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjgn3
3、官方開發文檔
每個用戶都有一定的免費測試額度,個人認證的賬號與企業認證的賬號免費額度也不同。人臉識別接口有V2、V3、V4三個版本,由于我是個人認證的賬號,所以使用的是V3版本。
V3版本開發文檔:https://ai.baidu.com/ai-doc/FACE/Lk37c1tpf
V4版本開發文檔:https://ai.baidu.com/ai-doc/FACE/Oktmssfse
4、測試人像圖片
準備幾張用于測試的人像圖片
三、PHP接入
1、鑒權,獲取access_token
接口描述:獲取access_token
?名稱 | 說明 |
---|---|
接口名稱 | 鑒權,獲取access_token |
接口地址 | https://aip.baidubce.com/oauth/2.0/token |
請求方式 | GET/POST(推薦) |
官方文檔 | https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu |
?請求參數說明
參數 | 類型 | 必填 | 含義 | 說明 |
---|---|---|---|---|
grant_type | string | 是 | 固定為client_credentials | client_credentials? |
client_id | string | 是 | 應用的API Key,獲取方式:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjgn3 | Va5yQRHlA4Fq5eR3LT0vuXV4 |
client_secret | string | 是 | 應用的Secret Key,獲取方式:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjgn3 | 0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2 |
返回參數說明
名稱 | 類型 | 含義 |
---|---|---|
access_token | string | 要獲取的Access Token |
refresh_token | string | 該參數忽略 |
expires_in | string | Access Token的有效期(秒為單位,有效期30天) |
scope | string | 該參數忽略 |
session_key | string | 該參數忽略 |
session_secret | string | 該參數忽略 |
?代碼示例
// 鑒權,獲取token
public function getToken()
{$apiUrl = 'https://aip.baidubce.com/oauth/2.0/token';$params = ["grant_type" => 'client_credentials','client_id' => $this->api_key,"client_secret" => $this->secret_key,];$params = http_build_query($params);$result = $this->returnArray($this->freeApiCurl($apiUrl,$params));$access_token = $result['access_token'];return $access_token;
}
2、人臉對比
接口描述:人臉對比V3,對比兩張圖片中的人臉的相似度,并返回相似度分值。
?名稱 | 說明 |
---|---|
接口名稱 | 人臉對比 |
接口地址 | https://aip.baidubce.com/rest/2.0/face/v3/match |
請求方式 | POST |
官方文檔 | https://ai.baidu.com/ai-doc/FACE/Lk37c1tpf |
?請求參數說明
參數 | 類型 | 必填 | 含義 |
---|---|---|---|
image | string | 是 | 圖片信息(總數據大小應小于10M,圖片尺寸在1920x1080以下),圖片上傳方式根據image_type來判斷。?兩張圖片通過json格式上傳,格式參考本表格下方的示例 |
image_type | string | 是 | 圖片類型 BASE64:(推薦)圖片的base64值,base64編碼后的圖片數據,編碼后的圖片大小不超過2M; FACE_TOKEN: 人臉圖片的唯一標識,調用人臉檢測接口時,會為每個人臉圖片賦予一個唯一的FACE_TOKEN,同一張圖片多次檢測得到的FACE_TOKEN是同一個。 |
face_type | string | 是 | 人臉的類型 LIVE:表示生活照:通常為手機、相機拍攝的人像圖片、或從網絡獲取的人像圖片等, IDCARD:表示身份證芯片照:二代身份證內置芯片中的人像照片, WATERMARK:表示帶水印證件照:一般為帶水印的小圖,如公安網小圖 CERT:表示證件照片:如拍攝的身份證、工卡、護照、學生證等證件圖片 INFRARED?表示紅外照片:使用紅外相機拍攝的照片 HYBRID:表示混合類型,如果傳遞此值時會先對圖片進行檢測判斷所屬類型(生活照 or 證件照)(僅針對請求參數 image_type 為 BASE64 或 URL 時有效) 默認LIVE |
quality_control | string | 是 | 圖片質量控制 NONE: 不進行控制 LOW:較低的質量要求 NORMAL: 一般的質量要求 HIGH: 較高的質量要求 默認 NONE 若圖片質量不滿足要求,則返回結果中會提示質量檢測失敗 |
liveness_control | string | 是 | 活體檢測控制 NONE: 不進行控制 LOW:較低的活體要求(高通過率 低攻擊拒絕率) NORMAL: 一般的活體要求(平衡的攻擊拒絕率, 通過率) HIGH: 較高的活體要求(高攻擊拒絕率 低通過率) 默認 NONE 若活體檢測結果不滿足要求,則返回結果中會提示活體檢測失敗 |
face_sort_type | string | 是 | 人臉檢測排序類型 0:代表檢測出的人臉按照人臉面積從大到小排列 1:代表檢測出的人臉按照距離圖片中心從近到遠排列 默認為0 |
spoofing_control | string | 是 | 合成圖控制參數 NONE: 不進行控制 LOW:較低的合成圖閾值數值,由于合成圖判定邏輯為大于閾值視為合成圖攻擊,該項代表低通過率、高攻擊拒絕率 NORMAL: 一般的合成圖閾值數值,由于合成圖判定邏輯為大于閾值視為合成圖攻擊,該項代表平衡的攻擊拒絕率, 通過率 HIGH: 較高的合成圖閾值數值,由于合成圖判定邏輯為大于閾值視為合成圖攻擊,該項代表高通過率、低攻擊拒絕率 默認為NONE |
返回參數說明
名稱 | 類型 | 含義 |
---|---|---|
score | float | 要獲取的Access Token |
face_list | array | 人臉信息列表,列表里的face_token順序與傳入的圖片順序保存一致 |
face_token | string | 人臉的唯一標志 |
質量控制參數說明:不同的控制度下所對應的質量控制閾值,如果檢測出來的質量信息某一項不符合控制閾值的要求,則會返回錯誤信息。
控制參數說明文檔:https://ai.baidu.com/ai-doc/FACE/Lk37c1tpf?
?代碼示例
public function run()
{$img1 = 'static/index/images/11.png';$img2 = 'static/index/images/22.png';// 讀取圖片文件內容$imageContent1 = file_get_contents($img1);$imageContent2 = file_get_contents($img2);// 將圖片內容轉換為Base64編碼$base64Image1 = base64_encode($imageContent1);$base64Image2 = base64_encode($imageContent2);$apiUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/match?access_token='.$this->getToken();$params = [['image' => $base64Image1,'image_type' => 'BASE64','face_type' => 'LIVE', // 人臉的類型'quality_control' => 'HIGH', // 圖片質量控制'liveness_control' => 'NONE' // 活體檢測控制],['image' => $base64Image2,'image_type' => 'BASE64','face_type' => 'LIVE', // 人臉的類型'quality_control' => 'HIGH', // 圖片質量控制'liveness_control' => 'NONE' // 活體檢測控制]];// 參數 數組格式轉json格式$params = json_encode($params);$result = $this->returnArray($this->freeApiCurl($apiUrl,$params,1));}
?需要注意的幾點
1、access_token的有效期為30天,切記需要每30天進行定期更換,或者每次請求都拉取新token;
2、請求參數是json,不是數組,在傳入之前先轉成json格式;
3、傳入的圖片(image字段)大小不超過10M,尺寸在1920*1080以下,必須是base64編碼,且不包含圖片頭,如data:image/jpg;base64,使用前請檢查一邊;
4、圖片格式先僅支持png、jpg、jpeg、bmp格式;
5、人臉類型、圖片質量控制、活體檢測控制設置不同的閾值也會返回不同的結果或錯誤,錯誤可參看錯誤碼,所以需要根據實際需求設置閾值。
四、完整代碼
使用ThinkPHP5框架,替換自己的api_key和secret_key即可。
<?php
namespace app\index\controller;
use think\Controller;class Face extends Controller
{private $api_key = 'xxxxxx';private $secret_key = 'xxxxxxx';// 鑒權,獲取tokenpublic function getToken(){$apiUrl = 'https://aip.baidubce.com/oauth/2.0/token';$params = ["grant_type" => 'client_credentials','client_id' => $this->api_key,"client_secret" => $this->secret_key,];$params = http_build_query($params);$result = $this->returnArray($this->freeApiCurl($apiUrl,$params));$access_token = $result['access_token'];return $access_token;}public function run(){$img1 = 'static/index/images/11.png';$img2 = 'static/index/images/22.png';// 讀取圖片文件內容$imageContent1 = file_get_contents($img1);$imageContent2 = file_get_contents($img2);// 將圖片內容轉換為Base64編碼$base64Image1 = base64_encode($imageContent1);$base64Image2 = base64_encode($imageContent2);$apiUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/match?access_token='.$this->getToken();$params = [['image' => $base64Image1,'image_type' => 'BASE64','face_type' => 'LIVE', // 人臉的類型'quality_control' => 'HIGH', // 圖片質量控制'liveness_control' => 'NONE' // 活體檢測控制],['image' => $base64Image2,'image_type' => 'BASE64','face_type' => 'LIVE', // 人臉的類型'quality_control' => 'HIGH', // 圖片質量控制'liveness_control' => 'NONE' // 活體檢測控制]];// 參數 數組格式轉json格式$params = json_encode($params);$result = $this->returnArray($this->freeApiCurl($apiUrl,$params,1));}/*** 將JSON內容轉為數組,并返回*/public function returnArray($content){return json_decode($content,true);}/*** @describe CURL操作,支持POST和GET兩種請求方式* @param $url:API接口請求地址,$param:請求參數,$ispost:請求方式 post=1/get=2* @return array 接口返回結果集*/public function freeApiCurl($url,$params=false,$ispost=0){$ch = curl_init();curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 );curl_setopt( $ch, CURLOPT_TIMEOUT , 60);curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );if( $ispost ){curl_setopt( $ch , CURLOPT_POST , true );curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );curl_setopt( $ch , CURLOPT_URL , $url );}else{if($params){curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );}else{curl_setopt( $ch , CURLOPT_URL , $url);}}$response = curl_exec( $ch );if ($response === FALSE) {return false;}curl_close( $ch );return $response;}}
返回結果