face++人脸识别

2014-08-20 19:02:29

1
QQ图片20140812183958
20140812<em>124221
20140812</em>143408

上星期去参加TC 北京(Tech China Beijing)峰会,当然是免费学生票啦…..2800的门票我就呵呵了,不过学生票除了参加论坛之外权限慢慢,很满足啦~展会上体验了些类似iwatch,自平衡脚踏车,虚拟3D等设备,整体来说还不错,其实我就是奔着两样东西去的:午餐+Google glass。哈哈哈,不多说了,跑远了。Google glass一直就想玩玩,毕竟一万多买不起,这次算是实现了。只不过比较坑的是只搭载了出门问问一个app,只能问问路。我最想体验的是人脸识别功能,可惜了~

刚好最近在做微信,鉴于此,于是想到了加入人脸识别功能。

算是试玩吧,我就选择了face++,看上去还不错的样子。

首先当然是注册,创建应用,获取API Key和API Secret了,这里不多说。

Face++提供人脸识别接口,检测给定图片(Image)中的所有人脸(Face)的位置和相应的面部属性接口地址如下:

http://apicn.faceplusplus.com/v2/detection/detect?apikey=YOURAPI_KEY&

apisecret=YOURAPI_SECRET&url=http%3A%2F%2Ffaceplusplus.com%2Fstatic%2Fimg%2Fdemo%2F1.jpg

&attribute=glass,pose,gender,age,race,smiling

参数

是否必须

含义

api_key

必须

App的Face++ API Key

api_secret

必须

APP的Face++ API Secret

url 或 img[POST]

必须

待检测图片的URL 或者 通过POST方法上传的二进制数据,原始图片大小需要小于3M

mode

可选

检测模式可以是normal(默认) 或者 oneface 。在oneface模式中,检测器仅找出图片中最大的一张脸。

attribute

可选

可以是none或者由逗号分割的属性列表。默认为gender, age, race, smiling。目前支持的属性包括:gender, age, race, smiling, glass, pose

tag

可选

可以为图片中检测出的每一张Face指定一个不包含^@,&=*'”等非法字符且不超过255字节的字符串作为tag,tag信息可以通过 /info/get_face 查询

async

可选

如果置为true,该API将会以异步方式被调用;也就是立即返回一个session id,稍后可通过/info/get_session查询结果。默认值为false。

返回结果如下:

[php]
{
"face": [
{
"attribute": {
"age": {
"range": 5,
"value": 24
},
"gender": {
"confidence": 99.9999,
"value": "Female"
},
"glass": {
"confidence": 99.4157,
"value": "None"
},
"pose": {
"pitchangle": {
"value": 1e-06
},
"roll
angle": {
"value": 0.650337
},
"yawangle": {
"value": -0.42409
}
},
"race": {
"confidence": 98.058,
"value": "Asian"
},
"smiling": {
"value": 3.78394
}
},
"face
id": "9b4e21eba34985325293d5add1c7e255",
"position": {
"center": {
"x": 50.121951,
"y": 35.97561
},
"eyeleft": {
"x": 43.465122,
"y": 30.670488
},
"eye
right": {
"x": 56.80878,
"y": 30.821951
},
"height": 27.560976,
"mouthleft": {
"x": 45.649512,
"y": 45.041707
},
"mouth
right": {
"x": 55.134878,
"y": 44.858049
},
"nose": {
"x": 50.183415,
"y": 38.410732
},
"width": 27.560976
},
"tag": ""
}
],
"imgheight": 410,
"img
id": "438d1eea1ba05fb112c8f3430f0b219b",
"imgwidth": 410,
"session
id": "d48f8e1acb2d421c8ae2cb146298a7f4",
"url": "http://faceplusplus.com/static/img/demo/1.jpg"
}
[/php]

取结果参数中的gender,age,race,smiling等参数 ,如

[php]

"attribute": {
"age": {
"range": 5,
"value": 17
},
"gender": {
"confidence": 99.9781,
"value": "Female"
},
"glass": {
"confidence": 99.9815,
"value": "None"
},
"pose": {
"pitchangle": {
"value": 0.000019753399999999996
},
"roll
angle": {
"value": 1.75177
},
"yaw_angle": {
"value": 4
}
},
"race": {
"confidence": 99.471,
"value": "Asian"
},
"smiling": {
"value": 87.1365
}

[/php]

上述结果表示:

年龄age为17,误差在5岁 性别为female,表示女,置信度为99% 种族为亚洲Asian, 微笑度 87%

和图片比较一下,还是比较一致的

040959401895877

face++的SDK如下:

[php]

/** * Face++ PHP SDK * author: Tianye * since: 2013-12-11 **/
class Facepp{
######################################################
### If you choose Amazon(US) server,please use the ###
### http://apius.faceplusplus.com/v2 ### ### or ###
### https://apius.faceplusplus.com/v2 ###
######################################################
var $server = ‘http://apicn.faceplusplus.com/v2’;
#var $server = ‘https://apicn.faceplusplus.com/v2’;
#var $server = ‘http://apius.faceplusplus.com/v2’;
#var $server = ‘https://apius.faceplusplus.com/v2’;
#############################################
### set your api key and api secret here. ###
#############################################
var $api_key = ‘你的api_key ‘;
var $api_secret = ‘你的api_secret ‘;
public function __construct($api_key=NULL, $api_secret=NULL, $server=NULL)
{
if($api_key){ $this—>apikey = $apikey;
}
if($apisecret){
$this->api
secret = $api_secret;
}
if($server){
$this->server = $server;
}
}

/*
* @param $method : The Face++ API
* @param $params : Request Parameters
* @return : Array {‘http_code’:’Http Status Code’, ‘request_url’:’Http Request URL’,’body’:’ JSON Response’}
*
/
public function execute($method,$params){
if(empty($params)){
$params=array();
}
$params[‘apikey’] = $this->apikey;
$params[‘apisecret’] = $this->apisecret;

return $this->request("{$this->server}{$method}",$params);
}

private function request($requesturl , $requestbody){
$useragent = ‘Faceplusplus PHP SDK/1.0’;
$curlhandle = curlinit();
curlsetopt($curlhandle, CURLOPTURL, $requesturl);
curlsetopt($curlhandle, CURLOPTFILETIME, TRUE);
curl
setopt($curlhandle, CURLOPTFRESHCONNECT, FALSE);
curl
setopt($curlhandle, CURLOPTCLOSEPOLICY, CURLCLOSEPOLICYLEASTRECENTLYUSED);
curl
setopt($curlhandle, CURLOPTMAXREDIRS, 5);
curlsetopt($curlhandle, CURLOPTHEADER, FALSE);
curl
setopt($curlhandle, CURLOPTRETURNTRANSFER, TRUE);
curlsetopt($curlhandle, CURLOPTTIMEOUT, 5184000);
curl
setopt($curlhandle, CURLOPTCONNECTTIMEOUT, 120);
curlsetopt($curlhandle, CURLOPTNOSIGNAL, TRUE);
curl
setopt($curlhandle, CURLOPTREFERER, $requesturl);
curl
setopt($curlhandle, CURLOPTUSERAGENT, $useragent);
if (extensionloaded(‘zlib’)){
curl
setopt($curlhandle, CURLOPTENCODING, ”);
}
curlsetopt($curlhandle, CURLOPTPOST, TRUE);
if(array
keyexists(‘img’,$requestbody)){
$requestbody[‘img’] = ‘@’.$requestbody[‘img’];
}else{
$requestbody=httpbuildquery($requestbody);
}
curlsetopt($curlhandle, CURLOPTPOSTFIELDS, $requestbody);
$responsetext = curlexec($curlhandle);
$reponse
header = curlgetinfo($curlhandle);
curlclose($curlhandle);
return array(‘httpcode’=>$reponseheader[‘httpcode’],’requesturl’=>$requesturl,’body’=>$responsetext);
}
}

[/php]

调用方法:

[php]

'{image file path}’);
$params[‘attribute’] = ‘gender,age,race,smiling,glass,pose’;
$response = $facepp->execute(‘/detection/detect’,$params);
print_r($response);

detect image by url

$params=array(‘url’=>’http://www.faceplusplus.com.cn/wp-content/themes/faceplusplus/assets/img/demo/1.jpg’);
$response = $facepp->execute(‘/detection/detect’,$params);
print_r($response);

if($response[‘httpcode’]==200){
#json decode
$data = json
decode($response[‘body’],1);
#get face landmark
foreach ($data[‘face’] as $face) {
$response = $facepp->execute(‘/detection/landmark’,array(‘faceid’=>$face[‘faceid’]));
printr($response);
}
#create person
$response = $facepp->execute(‘/person/create’,array(‘person
name’=>’uniquepersonname’));
print_r($response);

delete person

$response = $facepp->execute(‘/person/delete’,array(‘personname’=>’uniquepersonname’));
print
r($response);

}

[/php]

在微信中再将结果整理成文本消息就可以了。下面是实际使用结果:
getimgdata

感兴趣的可以关注服务号bistu体验。

当然了,这只是最简单的face++和微信结合使用的案例,face++还有许多更为强大的功能等待着大家的实际应用。

悲剧的是本人识别了几张。。奈何长相太老成,识别最低年龄也要28…..俺才大二啊。。说多了都是泪~

Bistu Library API

北京信息科技大学图书馆API。(PHP语言实现) 思路: 1.post数据,分析网页url。 2.加壳。 说说大概过程,首先登陆图书馆主页,进入图书检索页面: http://211.68.37.131/book/queryIn.jsp 提交查询数据,用chrome或Firefox等开发工具抓取到post数据包,分析之,如本校图书检索,提交检索词之后跳到新页面(http://211.68.37.131/book/queryOut.jsp)。表面上看不出post地址,抓包也看不出提交地址: 但区区方正系统怎么能难倒聪明的大家呢,对搜索结果的页面: (http://211.68.37.131/book/queryOut.jsp)分析,不难发现,search result实则是iframe框架: iframe src=

jquery mobile缓存问题

如题,jQuery mobile做自适应页面时遇到小问题:A页面跳到B页面,B页面返回A页面后存在B页面的缓存。不论a标签使用的是<a data-rel="back">还是<a href="">都有缓存存在! 原来做过很多jqw页面了没问题,也不知道为啥这次就缓存出问题了,先不管了,解决再说。 网上游了2小时找到了解决方法:原来其实不管页面内链接还是页面间切换,jQuery Mobile都是发起Ajax请求加载新的页面。如果想链接到一个新界面,可以通过在加入链接属性rel="external"或data-ajax="false",告诉jQuery Mobile需要重新加载一个新的页面,而且URL也是全新的。