首先,先下載php版本的SDK,SDK本質上是封裝瞭http請求。
其次,這裡僅僅是示例Face++接口的使用,在明星臉庫中匹配相似臉,並顯示相應圖片。
1.核心步驟
由於是本例介紹的是相似臉搜索,因此最後兩個步驟改為:
構建Faceset:調用/faceset/create創建新的Faceset,使用/faceset/add_face將明星臉加入到Faceset中; 模型訓練:調用/train/search訓練相應Faceset的搜索模型; 人臉搜索:調用/recognition/search搜索相似臉。
2.基本步驟
2.1建立明星臉庫 進行相似臉搜索,需要在特定的臉庫中搜索,因此要先建立相應的明星臉庫。這裡建立明星臉庫faceset_star。為瞭方便獲取到臉的名稱,建立相應的group_star.
######構建Group $group_name = 'group_star'; $facepp->execute('/group/delete',$params_group); //如果已經存在該Group,則先刪除 $response_group = $facepp->execute('/group/create',$params_group); #####創建faceset $params_faceset['faceset_name'] = 'faceset_star';//可由系統隨機產生 //$facepp->execute('/faceset/delete',$params_faceset); $response_faceset = $facepp->execute('/faceset/create',$params_faceset);
這裡簡單在明星臉庫中加入幾個明星的臉。代碼如下:
api_key = ''; $facepp->api_secret = ''; $stars = array ( array( 'name'=>'范冰冰', 'url'=>'https://www.faceplusplus.com.cn/assets/demo-img2/%E8%8C%83%E5%86%B0%E5%86%B0/11.jpg' ), array( 'name'=>'張嘉倪', 'url'=>'https://www.faceplusplus.com.cn/assets/demo-img2/%E5%BC%A0%E5%98%89%E5%80%AA/9.jpg' ), array( 'name'=>'佟麗婭', 'url'=>'https://www.faceplusplus.com.cn/assets/demo-img2/%E4%BD%9F%E4%B8%BD%E5%A8%85/11.jpg' ), array( 'name'=>'買紅妹', 'url'=>'https://www.faceplusplus.com.cn/assets/demo-img2/%E4%B9%B0%E7%BA%A2%E5%A6%B9/10.jpg' ), array( 'name'=>'張馨予', 'url'=>'https://www.faceplusplus.com.cn/assets/demo-img2/%E5%BC%A0%E9%A6%A8%E4%BA%88/10.jpg' ) ); ######構建Group $group_name = 'group_star'; $params_group['group_name'] = $group_name; //可由系統隨機產生 //$facepp->execute('/group/delete',$params_group); //如果已經存在該Gruoup,則先刪除 $response_group = $facepp->execute('/group/create',$params_group); #####創建faceset $params_faceset['faceset_name'] = 'faceset_star';//可由系統隨機產生 //$facepp->execute('/faceset/delete',$params_faceset); $response_faceset = $facepp->execute('/faceset/create',$params_faceset); #######初步檢測 for($i;$iexecute('/detection/detect',$params_face); if($response_face['http_code'] == 200){ //獲取face_id //對JSON 格式的字符串進行解碼 $face_body = json_decode($response_face['body'], true); $face = $face_body['face']; $face_1 = $face['0']; $face_id = $face_1['face_id']; #######創建Person $params_person['person_name'] = $person_name; //$response_person = $facepp->execute('/person/delete',$params_person); $response_person = $facepp->execute('/person/create',$params_person); //加入face $params_person['face_id'] = $face_id; $response_addface = $facepp->execute('/person/add_face',$params_person); #######模型訓練 //針對search功能對一個faceset進行訓練 $params_tsearch['faceset_name'] = $faceset_name; $response_tsearch= $facepp->execute('/train/search',$params_tsearch); //針對identify功能對一個Group進行訓練 $params_tidentify['group_name'] = $group_name; $response_tidentify = $facepp->execute('/train/identify',$params_tidentify); } } ?>
需要在相應位置填寫自己的api_key, api_secret, 並且需要SDK文件即 facepp_sdk.php
此時打開face++的後臺管理(我的應用=》管理=》APP後臺管理)就會看到建立的group_star和faceset_star。
group_star
faceset_star
2.2 進行訓練 給定一張臉,要搜索相似臉,需要先進行初步檢測,獲得face_id,然後進行/train/search,並且更具face_id在faceset_star中搜索相似臉。 為瞭進行/train/search。這裡建立trainstudent.php文件
api_key = ''; $facepp->api_secret = ''; $faceset_name = 'faceset_stu'; if(stripos($params_train,'https://')===false && stripos($params_train,'https://')===false){ //img $params_face['img'] = $params_train; }else{ //url $params_face['url'] = $params_train; } $params_face['attribute'] = 'gender,age,race,smiling,glass,pose'; //get face_id $response_face = $facepp->execute('/detection/detect',$params_face); $face_body = json_decode($response_face['body'], true); if(empty($face_body['face'])){ //在圖片中未檢測到人臉 return false; } if(count($face_body['face'])>1){ //在圖片中檢測到多張人臉 return false; } $face = $face_body['face']; $face_1 = $face['0']; $face_id = $face_1['face_id']; //Train $params_faceset['faceset_name'] = $faceset_name; $session = $facepp->execute('/train/search',$params_faceset); return $face_id; } }
2.3 搜索相似臉 給定的一張,進行trian,並且返回face_id,即可根據該id在臉庫中搜索相似臉。這裡建立search.php文件
api_key = '';//填寫 $facepp->api_secret = '';//填寫 $trains = new Train; //進行train之後才能search $face_id = $trains->trainstu($params); //若未檢測到人臉或檢測到多張人臉 if($face_id==false){ return false; } $faceset_name = 'faceset_star'; //在faceset_star中搜索相似臉 $params_search['key_face_id'] = $face_id; $params_search['faceset_name'] = $faceset_name; $params_search['count'] = 5; $response_search = $facepp->execute('/recognition/search',$params_search); $search = json_decode($response_search['body'],true); $urls = array(); $GLOBALS['similarity'] = array(); $GLOBALS['personname'] = array(); $candidate = $search['candidate']; //設計json格式數據的解析 for($i=0; $iexecute('/info/get_face',$params_getface); $getface = json_decode($response_getface['body'],true); $face_info = $getface['face_info']; $face = $face_info[0]; $person = $face['person'][0]; array_push($GLOBALS['personname'],$person['person_name']); array_push($urls,$face['url']); } return $urls; } // 返回相似度數組 function getsimilarity(){ return $GLOBALS['similarity']; } // 返回明星臉對應的人名 function getpname(){ return $GLOBALS['personname']; } ?>
2.4 輸出相似臉 給定face_id在face_star中搜索相似臉
api_key = ''; $facepp->api_secret = ''; $param = 'https://www.faceplusplus.com.cn/wp-content/themes/faceplusplus/assets/img/demo/thumbnail/1.jpg?v=2';//進行search圖片的url或圖片路徑 $urls = geturls($param); $similarity = getsimilarity(); $personname = getpname(); if($urls == false){ return false; } for($i=0;$i
2.5 運行結果
(由於事先我已在face_star中加入瞭其他臉,結果可能不一致)。