一、前言
前幾個小應用似乎不給力,反應不冷不熱,似乎大家不感興趣,今天給大家推出一個亮眼一點的:微信公眾平台上的人臉辨識。
前段時間看到網路上有個報道 四川大學電腦科學系主任、副教授魏驍勇開發了基於圖像的課堂考勤系統, 上課點名用人臉辨識來'刷臉',看下圖
在點名時,只需多角度對教室內的學生分區域拍照,然後將照片上傳到伺服器,自動拼接成一張整圖,系統再對照片裡的學生頭像自動編號和識別,最後出現學生的個人信息,旁邊則有“It'sme(是我)”和“notme(不是我)”兩個選項。這樣馬上就能知道誰在上課、誰在逃課了
更神的是,這東西在統計學上的意義:它甚至可以分析出學生的人際關係甚至性格興趣,比如它根據學生在課堂上喜歡坐在哪些位置,喜歡坐在誰的旁邊,得出原始數據,經過一段時間之後,再來分析,就可以誰和誰在談戀愛,誰和誰分手後又和誰在一起了。誰老是喜歡自己一個人獨自坐在角落(自閉症),某個男生和某個男生半年下來每次都坐在一起(基友???),瞬間感覺這玩意給人的想像空間無限大。 。 。 。 。 。
下面開始言歸正傳了:
首先看一下什麼是人臉識別,看一下百度百科的定義:人臉辨識特指利用分析比較人臉視覺特徵資訊進行身分鑑別的電腦科技。人臉辨識是一項熱門的電腦科技研究領域,可以將人臉明暗偵測,自動調整動態曝光補償,人臉追蹤偵測,自動調整影像放大;它屬於生物特徵辨識技術,是對生物體(一般特指人)本身的生物特徵來區分生物體個體。
人臉辨識的技術過程(來自百度百科)
一般分三步驟:
(1)首先建立人臉的面像檔案。即用攝影機採集單位人員的人臉的面像文件或取他們的照片形成面像文件,並將這些面像文件生成面紋(Faceprint)編碼貯存起來。
(2)取得目前的人體面像。即用攝影機捕捉的目前出入人員的面像,或取照片輸入,並將目前的面像檔案產生面紋編碼。
(3)用目前的面紋編碼與檔案庫存的比對。即將目前的面像的面紋編碼與檔案庫存中的面紋編碼進行檢索比對。上述的「面紋編碼」方式是根據人臉臉部的本質特徵和開頭來工作的。這種面紋編碼可以抵抗光線、皮膚色調、臉部毛髮、髮型、眼鏡、表情和姿態的變化,具有強大的可靠性,從而使它可以從百萬人中精確地辯認出某個人。人臉的辨識過程,利用普通的影像處理設備就能自動、連續、即時地完成。
首先要取得用戶發過來的圖片,微信大眾平台支援接收圖片,
用戶發送的一個圖片如下:
#其圖片訊息的格式如下:
<xml> <ToUserName><![CDATA[gh_13d1a3a7x46a]]></ToUserName> <FromUserName><![CDATA[oKaHDjt60aAyPvQmUX3ddyix_zG8]]></FromUserName> <CreateTime>1357543196</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[http://www.php.cn/]]></PicUrl> <MsgId>5830603629728080261</MsgId></xml>
ToUserName 訊息接收方微訊號,一般為公眾平台帳號微訊號
FromUserName 訊息發送方微訊號
CreateTime 訊息建立時間
MsgType 訊息類型;圖片訊息為image
PicUrl 圖片連結位址
MsgId 訊息ID號碼
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%
和图片比较一下,还是比较一致的
SDK如下:
"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 }
调用方式如下:
<?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中文网!