首先,先下载php版本的SDK,SDK本质上是封装了http请求。
其次,这里仅仅是示例Face++接口的使用,在明星脸库中匹配相似脸,并显示相应图片。
1.核心步骤
FACE++官网提供的核心概念
由于是本例介绍的是相似脸搜索,因此最后两个步骤改为:
- 构建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);
这里简单在明星脸库中加入几个明星的脸。代码如下:
<?php
require_once 'facepp_sdk.php';
$facepp = new Facepp();
$facepp->api_key = '';
$facepp->api_secret = '';
$stars = array
(
array(
'name'=>'范冰冰',
'url'=>'http://www.faceplusplus.com.cn/assets/demo-img2/%E8%8C%83%E5%86%B0%E5%86%B0/11.jpg'
),
array(
'name'=>'张嘉倪',
'url'=>'http://www.faceplusplus.com.cn/assets/demo-img2/%E5%BC%A0%E5%98%89%E5%80%AA/9.jpg'
),
array(
'name'=>'佟丽娅',
'url'=>'http://www.faceplusplus.com.cn/assets/demo-img2/%E4%BD%9F%E4%B8%BD%E5%A8%85/11.jpg'
),
array(
'name'=>'买红妹',
'url'=>'http://www.faceplusplus.com.cn/assets/demo-img2/%E4%B9%B0%E7%BA%A2%E5%A6%B9/10.jpg'
),
array(
'name'=>'张馨予',
'url'=>'http://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;$i<count($stars);$i++){
$url = $stars[$i]['url'];
$person_name = $stars[$i]['name'];
$params_face['url'] = $url;
$params_face['attribute'] = 'gender,age,race,smiling,glass,pose';
$response_face = $facepp->execute('/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文件
<?php
require_once 'facepp_sdk.php';
//已构建Faceset:faceset_stu ;Group:group_stu;
class Train{
/**
* 对将要进行匹配的图片进行Trian
*
* @param $params_train 人脸图片url或绝对路径
* @return face_id 若未检测到人脸或检测到多张人脸则返回false
**/
public function TrainStu($params_train){
$facepp = new Facepp();
$facepp->api_key = '';
$facepp->api_secret = '';
$faceset_name = 'faceset_stu';
if(stripos($params_train,'http://')===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文件
<?php
require_once 'facepp_sdk.php';
require_once("/trainstudent.php");
global $similarity; //相似度
global $personname; //相似脸名称
/**
* 得到search之后匹配图片的url地址数组
*
* @param params 进行search图片的url或图片路径
* @return
**/
function geturls($params){
$facepp = new Facepp();
$facepp->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; $i<count($candidate); $i++){
array_push($GLOBALS['similarity'],$candidate[$i]['similarity']);
$params_getface['face_id']= $candidate[$i]['face_id'];
//根据face_id获得该face的url,用于显示图片
$response_getface = $facepp->execute('/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中搜索相似脸
<?php
require_once 'facepp_sdk.php';
require_once 'search.php';
$facepp = new Facepp();
$facepp->api_key = '';
$facepp->api_secret = '';
//进行search图片的url或图片路径
$param = 'http://www.faceplusplus.com.cn/wp-content/themes/faceplusplus/assets/img/demo/thumbnail/1.jpg?v=2';
$urls = geturls($param);
$similarity = getsimilarity();
$personname = getpname();
if($urls == false){
return false;
}
for($i=0;$i<count($urls);$i++){
$url = $urls[$i];
echo "<img src = $url>";
echo $similarity[$i]." ".$personname[$i];
}
?>
2.5 运行结果
(由于事先我已在face_star中加入了其他脸,结果可能不一致)。