微信公众平台开发模式 微信 公众平台 图片识别 人脸识别 
作者:方倍工作室[QQ:1354386063]
原文:http://www.cnblogs.com/txw1958/archive/2013/02/05/weixin-if20-face-recognition.html

一、前言

前几个小应用似乎不给力,反应不冷不热,似乎大家不感兴趣,今天给大家推出一个亮眼一点的:微信公众平台上的人脸识别。

前段时间看到网上有个报道  四川大学计算机科学系主任、副教授 魏骁勇 开发了 基于图像的课堂考勤系统, 上课点名用人脸识别来‘刷脸’,看下图

在点名时,只需多角度对教室内的学生分区域拍照,然后将照片上传到服务器,自动拼接成一张整图,系统再对照片里的学生头像自动编号和识别,最后出现学生的个人信息,旁边则有“It’sme(是我)”和“notme(不是我)”两个选项。这样马上就能知道谁在上课、谁在逃课了

更神的是,这东西在统计学上的意义:它甚至可以分析出学生的人际关系甚至性格兴趣,比如它根据学生在课堂上喜欢坐在哪些位置,喜欢坐在谁的旁边,得出原始数据,经过一段时间之后,再来分析,就可以谁和谁在谈恋爱,谁和谁分手后又和谁在一起了。谁老是喜欢自己一个人独自坐在角落(自闭症),某个男生和某个男生半年下来每次都坐在一起(基友???),瞬间感觉这玩意给人的想象空间无限大。。。。。。

下面开始言归正传了:

首先看一下什么是人脸识别,看一下百度百科的定义:人脸识别特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术。人脸识别是一项热门的计算机技术研究领域,可以将人脸明暗侦测,自动调整动态曝光补偿,人脸追踪侦测,自动调整影像放大;它属于生物特征识别技术,是对生物体(一般特指人)本身的生物特征来区分生物体个体。原文:http://www.cnblogs.com/txw1958/archive/2013/02/04/weixin-if20-face-recognition.html

人脸识别的技术过程(来自百度百科)

一般分三步:
(1)首先建立人脸的面像档案。即用摄像机采集单位人员的人脸的面像文件或取他们的照片形成面像文件,并将这些面像文件生成面纹(Faceprint)编码贮存起来。
(2)获取当前的人体面像。即用摄像机捕捉的当前出入人员的面像,或取照片输入,并将当前的面像文件生成面纹编码。
(3)用当前的面纹编码与档案库存的比对。即将当前的面像的面纹编码与档案库存中的面纹编码进行检索比对。上述的“面纹编码”方式是根据人脸脸部的本质特征和开头来工作的。这种面纹编码可以抵抗光线、皮肤色调、面部毛发、发型、眼镜、表情和姿态的变化,具有强大的可靠性,从而使它可以从百万人中精确地辩认出某个人。人脸的识别过程,利用普通的图像处理设备就能自动、连续、实时地完成。

二、在微信公众平台上做人脸识别

1. 图片获取

首先要获得用户发过来的图片,微信公众平台支持接收图片,

用户发送的一个图片如下:

其图片消息的格式如下:

<xml>
<ToUserName><![CDATA[gh_13d1a3a7x46a]]></ToUserName>
<FromUserName><![CDATA[oKaHDjt60aAyPvQmUX3ddyix_zG8]]></FromUserName>
<CreateTime>1357543196</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[http://mmsns.qpic.cn/mmsns/L4qjYtOibummV7J7pbpWKZTiaRoeicicD151CGsQ5AW761Kmn5Hk83r5lQ/0]]></PicUrl>
<MsgId>5830603629728080261</MsgId>
</xml>

XML格式讲解 原文:http://www.cnblogs.com/txw1958/archive/2013/02/04/weixin-if20-face-recognition.html 
ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;图片消息为image
PicUrl 图片链接地址
MsgId 消息ID号

2. 接口

Face++提供人脸识别接口,

检测给定图片(Image)中的所有人脸(Face)的位置和相应的面部属性接口地址如下:
http://apicn.faceplusplus.com/v2/detection/detect

参数

是否必须

含义

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。


返回如下

{
"face": [
{
"attribute": {
"age": {
"range": 5,
"value": 17
},
"gender": {
"confidence": 99.9781,
"value": "Female"
},
"glass": {
"confidence": 99.9815,
"value": "None"
},
"pose": {
"pitch_angle": {
"value": 0.000019753399999999996
},
"roll_angle": {
"value": 1.75177
},
"yaw_angle": {
"value": 4
}
},
"race": {
"confidence": 99.471,
"value": "Asian"
},
"smiling": {
"value": 87.1365
}
},
"face_id": "c772b4b66c00d46b15344eff74b56e48"
}
],
"img_height": 293,
"img_id": "3005132383841edd08c9b500fb1fe2c4",
"img_width": 440,
"session_id": "4e64c73fec19442cbefde3cf9bd6b53d",
"url": ""
}

参数:

gender

object

包含性别分析结果,value的值为Male/Female, confidence表示置信度

age

object

包含年龄分析结果,value的值为一个非负整数表示估计的年龄, range表示估计年龄的正负区间

race

object

包含人种分析结果,value的值为Asian/White/Black, confidence表示置信度

smiling

object

包含微笑程度分析结果,value的值为0-100的实数,越大表示微笑程度越高

实现方法

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

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

上述结果中,

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

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

3. 程序实现

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 = '{your API KEY}';
var $api_secret = '{your API SECRET}';
public function __construct($api_key=NULL, $api_secret=NULL, $server=NULL){
if($api_key){
$this->api_key = $api_key;
}
if($api_secret){
$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['api_key'] = $this->api_key;
$params['api_secret'] = $this->api_secret;
return $this->request("{$this->server}{$method}",$params);
}
private function request($request_url , $request_body){
$useragent = 'Faceplusplus PHP SDK/1.0';
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $request_url);
curl_setopt($curl_handle, CURLOPT_FILETIME, TRUE);
curl_setopt($curl_handle, CURLOPT_FRESH_CONNECT, FALSE);
curl_setopt($curl_handle, CURLOPT_CLOSEPOLICY, CURLCLOSEPOLICY_LEAST_RECENTLY_USED);
curl_setopt($curl_handle, CURLOPT_MAXREDIRS, 5);
curl_setopt($curl_handle, CURLOPT_HEADER, FALSE);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl_handle, CURLOPT_TIMEOUT, 5184000);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($curl_handle, CURLOPT_NOSIGNAL, TRUE);
curl_setopt($curl_handle, CURLOPT_REFERER, $request_url);
curl_setopt($curl_handle, CURLOPT_USERAGENT, $useragent);
if (extension_loaded('zlib')){
curl_setopt($curl_handle, CURLOPT_ENCODING, '');
}
curl_setopt($curl_handle, CURLOPT_POST, TRUE);
if(array_key_exists('img',$request_body)){
$request_body['img'] = '@'.$request_body['img'];
}else{
$request_body=http_build_query($request_body);
}
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $request_body);
$response_text = curl_exec($curl_handle);
$reponse_header = curl_getinfo($curl_handle);
curl_close($curl_handle);
return array('http_code'=>$reponse_header['http_code'],'request_url'=>$request_url,'body'=>$response_text);
}
}

调用方式如下:

<?PHP
require_once 'facepp_sdk.php';
########################
###     example      ###
########################
$facepp = new Facepp();
#detect local image
$params=array('img'=>'{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['http_code']==200){
#json decode
$data = json_decode($response['body'],1);
#get face landmark
foreach ($data['face'] as $face) {
$response = $facepp->execute('/detection/landmark',array('face_id'=>$face['face_id']));
print_r($response);
}
#create person
$response = $facepp->execute('/person/create',array('person_name'=>'unique_person_name'));
print_r($response);
#delete person
$response = $facepp->execute('/person/delete',array('person_name'=>'unique_person_name'));
print_r($response);
}

在微信中再将结果整理成文本消息就可以了。

4. 效果展示

下面是实际使用结果:

漂亮/帅气指数鉴定技术

近亲及亲子鉴定技术

男人味/女人味鉴定技术

原文:http://www.cnblogs.com/txw1958/archive/2013/02/04/weixin-if20-face-recognition.html

5.账号体验

方倍工作室微信公众平台账号关注方法:
1. 微信通讯录-添加朋友-查找公众号-搜索“方倍工作室”
2. 微信通讯录-添加朋友-搜号码-输入“pondbaystudio”
3. 使用微信扫描下面的二维码

原文:http://www.cnblogs.com/txw1958/archive/2013/02/04/weixin-if20-face-recognition.html

人脸识别

这个怎么说,就是用户通过微信发送照片,照片是存到微信服务器的,微信给我发一个图片url,我再把这个url转给face++,face++将分析结果给我发回来,我再把这些数据简单处理下,反馈给微信用户(当然,中间还隔了层微信服务器)。

整个过程中,我所做的就是简单的json数据处理,什么高端的图像处理什么的都跟我不沾边,哈哈~

首先当然是到http://cn.faceplusplus.com/注册,获取API_SECRET、API_KEY。

而后推荐看文档,http://cn.faceplusplus.com/dev/getting-started/api2info/,当然直接跟着我来一遍也行。

先来个人脸检测吧,检测出性别、年龄、种族。

看了示例文档后,发现detect调用后返回的json的结构表示出来大概是这样:

type Faceslice struct{
Face []struct{
Attribute struct{
Age struct{
Range float64
Value float64
}
Gender struct{
Confidence float64
Value string
}
Race struct{
Confidence float64
Vaule string
}
}
Face_id string
Position struct{
Center struct{
X float64
Y float64
}
Eye_left struct{
X float64
Y float64
}
Eye_right struct{
X float64
Y float64
}
Height float64
Mouth_left struct{
X float64
Y float64
}
Mouth_right struct{
X float64
Y float64
}
Nose struct{
X float64
Y float64
}
Width float64
}
Tag string
}
Img_height int
Img_id string
Img_width int
Session_id string
url string
}

解析json数据:

func DecodeDetect(data []byte) Faceslice{
var f Faceslice
json.Unmarshal(data,&f)
return f
}

接着还是来写个get函数吧:

func get(url string)(b []byte,err error){
res,e:=http.Get(url)
if e!=nil{
err=e
return
}
data,e:=ioutil.ReadAll(res.Body)
if e!=nil{
err=e
return
}
res.Body.Close()
return data,nil
}

调用face++接口并返回相应的数据:

const apiurl="https://apicn.faceplusplus.com"
func DetectionDetect(picurl string)detection.Faceslice{
url:=apiurl+"/v2/detection/detect?url="+picurl+"&api_secret="+apisecret+"&api_key="+apikey
tmp,_:=get(url)
return detection.DecodeDetect(tmp)
}

刚刚上面的示例只是简单考虑了文本信息,现在要传递的是图片信息,所以做个简单的修改:

type Request struct{
ToUserName string
FromUserName string
CreateTime time.Duration
MsgType string
Content string
PicUrl string
MsgId int
}

Action函数里也该有所修改,判定下msg.MsgType,如果是text,则跟刚才一样处理,如果是image,则有新的处理方法。

我一个就做了两个简单的处理,一个是年龄、性别、种族,还有就是如果照片里是两个人,则给出五官及整体的相似度值。

相似度的代码直接放下面吧:

package recognition
import(
"encoding/json"
)
type Compare struct{
Component_similarity struct{
Eye float64
Mouth float64
Nose float64
Eyebrow float64
}
Session_id string
Similarity float64
}
func DecodeCompare(data []byte)Compare{
var c Compare
json.Unmarshal(data,&c)
return c
}

func RecognitionCompare(face1id,face2id string)recognition.Compare{
url:=apiurl+"/v2/recognition/compare?api_secret="+apisecret+"&api_key="+ apikey+"&face_id2="+face2id+"&face_id1="+face1id
tmp,_:= get(url)
return recognition.DecodeCompare(tmp)
}

判定图片里有几个人,一个人输出性别、年龄,两个人输出相似度,三个及以上,暂未判定:

if msg.MsgType=="image"{
var faceslice detection.Faceslice
faceslice=facepp.DetectionDetect(msg.PicUrl)
switch len(faceslice.Face){
case 0:
resp.Content="请上传有脸的人物照片!"
case 1:
attribute:=faceslice.Face[0].Attribute
age:=attribute.Age
gender:=attribute.Gender
var faceGender string
if gender.Value=="Male"{
faceGender="男"
}else{
faceGender="女"
}
faceAgeValue:=fmt.Sprintf("%d",int(age.Value))
faceAgeRange:=fmt.Sprintf("%d",int(age.Range))
resp.Content="性别:"+faceGender+"\n"+"年龄:"+faceAgeValue+"(±"+faceAgeRange+")"
case 2:
face1id:=faceslice.Face[0].Face_id
face2id:=faceslice.Face[1].Face_id
var compare recognition.Compare
compare=facepp.RecognitionCompare(face1id,face2id)
resp.Content="眼睛相似度:"+fmt.Sprintf("%f",compare.Component_similarity.Eye)+"\n"+"嘴巴相似度:"+fmt.Sprintf("%f",compare.Component_similarity.Mouth)+"\n"+"鼻子相似度:"+fmt.Sprintf("%f",compare.Component_similarity.Nos    e)+"\n"+"眉毛相似度:"+fmt.Sprintf("%f",compare.Component_similarity.Eyebrow)+"\n"+"整体相似度:"+fmt.Sprintf("%f",compare.Similarity)
default:
resp.Content="照片里人物太多了,暂不分析!"
}
}

微信公众平台消息接口开发(20)图片识别之人脸识别相关推荐

  1. 微信公众平台消息接口开发(2)-封装weixin.class.php

    微信公众平台消息接口开发(2)-封装weixin.class.php 一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处 ...

  2. 微信公众平台消息接口开发(1)

    原文链接 现在微信很热,微信公众平台的应用也很热,其实微信公众平台消息接口开发并不难,只要有接口调用就OK了. 要开发微信公众平台上的应用,得准备什么呢? 至少要有一个公众账号.服务器.域名这三样东西 ...

  3. 微信公众平台消息接口开发(4)天气预报

    一.请求数据 首先需要能有取得天气数据的接口,这样的接口网上有很多.比如google, yahoo,天气网都提供天气接口 方倍工作室的API已经能提供全国各地的天气预报,使用方倍的API无需再建立城市 ...

  4. php网站怎么对接微信群,PHP对接微信公众平台消息接口开发流程教程

    PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使 ...

  5. php对接微信提醒,PHP对接微信公众平台消息接口开发流程教程

    PHP对接微信公众平台消息接口开发流程教程 发布于 2015-02-15 08:54:13 | 157 次阅读 | 评论: 1 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hyperte ...

  6. php微信公众号怎么开发_PHP对接微信公众平台消息接口开发流程详解及实例

    这篇文章主要介绍了PHP对接微信公众平台消息接口开发流程,如何使用PHP版接口操作公众平台消息,需要的朋友可以参考下 一.写好接口程序 在你的服务器上上传好一个接口程序文件内容如下: 代码如下:< ...

  7. 微信公众平台消息接口开发(34)微信墙之表白墙/婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙...

    微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 微信墙 婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙 历史上的今天 作者:方倍工作室   原文: http://www.c ...

  8. 微信公众平台消息接口开发(34)微信墙之表白墙/婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙

    微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 微信墙 婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙 历史上的今天 作者:方倍工作室   原文: http://www.c ...

  9. 微信公众平台消息接口开发(22)图片识别之漂亮指数/帅气指数

    微信公众平台开发模式 微信 图片识别 人脸识别 漂亮指数 帅气指数 微信公众平台消息接口 微信开发模式 作者:http://www.cnblogs.com/txw1958/ 原文:http://www ...

  10. 微信公众平台消息接口开发(13)多语种互译

    微信公众平台消息接口 微信公众平台API 微信开发模式 多语种翻译 多语言互译 Microsoft Translator 方倍工作室 Paraphrase API 10 out of 11 rated ...

最新文章

  1. 云计算技术 — 容灾备份技术
  2. ubuntu websocket python2
  3. sqoop——将mysql数据库的数据表导入到hdfs上
  4. 【观点】传统企业如何在数字化时代实现进化?
  5. 企业靠一套数据平台实现“低成本运营战略”,降低成本600万
  6. firewall-cmd
  7. laravel route函数 404_laravel生成及获取不同类型的URL地址总结
  8. 影响网络电视直播清晰度的四个因素
  9. oracle log 分析程序,oracle之logminer日志分析
  10. c++学习笔记(八)- map
  11. VS2017 Community C++模块 离线打包安装
  12. 项目经理和产品经理的区别
  13. 计算机晶体管怎么工作原理,晶体管的工作原理和实际作用
  14. TFIDF理解和应用
  15. python计算无穷级数求和_[探求无穷级数求和的几种常用方法]无穷级数求和常用公式...
  16. 安科瑞ACTB-6互感器二次侧开路保护装置
  17. 基于Myrocks和spider构建分布式数据库
  18. 虚拟机Linux忘记root密码的解决办法
  19. 苹果Apple Pay优缺点全解析
  20. Go语言环境配置 Sublime Text+golang+gocode+margo详细过程及解决问题的方法

热门文章

  1. 我的 OCM 之路|书写无悔青春,追梦永不止步
  2. 互联网基石:TCP/IP 四层模型,由浅入深直击原理!
  3. C#给图片加水印文字或图片
  4. php框架thinkphp教程,thinkPHP5.0框架安装教程详解
  5. 我是谁?——第一次CSDN发文
  6. 5G系统——连接管理CM
  7. 新猿木子李:0基础学python培训教程 Python操作Redis
  8. ppt导出1000dpi的图
  9. 计算机主机箱的类型,电脑机箱尺寸分类
  10. 《测绘综合能力》真题易错本