好久没做微信公众平台了,也就没写相关的文章。偶然误打误撞看到有个人脸识别的功能,就拿出来分享下。

先看下效果图片:

从别人那找到方法,然后抽取核心识别部分分享出来。马上进入正题。

其实,人脸识别就是将图片的url给第三方,然后将第三方返回的json解析出来。所以要去申请第三方平台的账号,创建web应用,获取api-key以及api-secret。对于微信公众平台,就是将识别返回的数据回复给粉丝就好。

这里的第三方平台是Face++,申请地址:http://www.faceplusplus.com.cn/ 。注册好了之后,记得申请一个web应用。等待下一步骤。

上边已经说过,将图片的url给第三方,那么,这里只需要创建一个函数,参数是图片的url就可以。利用该函数,返回人脸识别的结果。好吧,这里已经抽象到一个类里,如下。

<?
class FaceLook
{
    public function FaceLook()
    {
    
    }
    
    public function BackFaceInfo($imgUrl)
    {
        $requestUrl = "http://apicn.faceplusplus.com/v2/detection/detect?url=".$imgUrl."&api_key=b1d10bf735e6e3924c98f86247030335&api_secret=KySciCCjRTOwbJClNGsM8K7AnMN2CsIL&&attribute=glass,pose,gender,age,race,smiling";
        $jsonStr = file_get_contents($requestUrl);
        $replyDic = json_decode($jsonStr);
        $resultStr = "";
        $faceArray = $replyDic->{'face'};
    
        $resultStr .= "图中共检测到".count($faceArray)."张脸!\n";
        for ($i= 0;$i< count($faceArray); $i++)
        {
            $resultStr .= "第".($i+1)."张脸\n";
            $tempFace = $faceArray[$i];
            // 获取所有属性
            $tempAttr = $tempFace->{'attribute'};
    
            // 年龄:包含年龄分析结果
            // value的值为一个非负整数表示估计的年龄, range表示估计年龄的正负区间
            $tempAge = $tempAttr->{'age'};
    
            // 性别:包含性别分析结果
            // value的值为Male/Female, confidence表示置信度
            $tempGenger = $tempAttr->{'gender'};
    
            // 种族:包含人种分析结果
            // value的值为Asian/White/Black, confidence表示置信度
            $tempRace = $tempAttr->{'race'};
    
            // 微笑:包含微笑程度分析结果
            //value的值为0-100的实数,越大表示微笑程度越高
            $tempSmiling = $tempAttr->{'smiling'};
    
            // 眼镜:包含眼镜佩戴分析结果
            // value的值为None/Dark/Normal, confidence表示置信度
            $tempGlass = $tempAttr->{'glass'};
    
            // 造型:包含脸部姿势分析结果
            // 包括pitch_angle, roll_angle, yaw_angle
            // 分别对应抬头,旋转(平面旋转),摇头
            // 单位为角度。
            $tempPose = $tempAttr->{'pose'};
    
            //返回年龄
            $minAge = $tempAge->{'value'} - $tempAge->{'range'};
            $minAge = $minAge < 0 ? 0 : $minAge;
            $maxAge = $tempAge->{'value'} + $tempAge->{'range'};
            $resultStr .= "年龄:".$minAge."-".$maxAge."岁\n";
    
            // 返回性别
            if($tempGenger->{'value'} === "Male")
                $resultStr .= "性别:男\n";
            else if($tempGenger->{'value'} === "Female")
                $resultStr .= "性别:女\n";
    
            // 返回种族
            if($tempRace->{'value'} === "Asian")
                $resultStr .= "种族:黄种人\n";
            else if($tempRace->{'value'} === "Male")
                $resultStr .= "种族:白种人\n";
            else if($tempRace->{'value'} === "Black")
                $resultStr .= "种族:黑种人\n";
    
            // 返回眼镜
            if($tempGlass->{'value'} === "None")
                $resultStr .= "眼镜:木有眼镜\n";
            else if($tempGlass->{'value'} === "Dark")
                $resultStr .= "眼镜:目测墨镜\n";
            else if($tempGlass->{'value'} === "Normal")
                $resultStr .= "眼镜:普通眼镜\n";
    
            //返回微笑
            $resultStr .= "微笑:".round($tempSmiling->{'value'})."%\n";
        }
    
        if(count($faceArray) === 2)
        {
            // 获取face_id
            $tempFace = $faceArray[0];
            $tempId1 = $tempFace->{'face_id'};
            $tempFace = $faceArray[1];
            $tempId2 = $tempFace->{'face_id'};
    
    
            // face++ 链接
            $requestUrl = "https://apicn.faceplusplus.com/v2/recognition/compare?api_secret=KySciCCjRTOwbJClNGsM8K7AnMN2CsIL&api_key=b1d10bf735e6e3924c98f86247030335&face_id2=".$tempId2 ."&face_id1=".$tempId1;
            $jsonStr = file_get_contents($requestUrl);
            $replyDic = json_decode($jsonStr);
    
            //取出相似程度
            $tempResult = $replyDic->{'similarity'};
            $resultStr .= "相似程度:".round($tempResult)."%\n";
    
            //具体分析相似处
            $tempSimilarity = $replyDic->{'component_similarity'};
            $tempEye = $tempSimilarity->{'eye'};
            $tempEyebrow = $tempSimilarity->{'eyebrow'};
            $tempMouth = $tempSimilarity->{'mouth'};
            $tempNose = $tempSimilarity->{'nose'};
    
            $resultStr .= "相似分析:\n";
            $resultStr .= "眼睛:".round($tempEye)."%\n";
            $resultStr .= "眉毛:".round($tempEyebrow)."%\n";
            $resultStr .= "嘴巴:".round($tempMouth)."%\n";
            $resultStr .= "鼻子:".round($tempNose)."%\n";
        }
    
        //如果没有检测到人脸
        if($resultStr === "")
            $resultStr = "照片中木有人脸=.=";
        return $resultStr;
    }
}
?>

 

到这里,基本已经完成。想象一个场景。某人给公众号发了一张照片,微信服务器接到后,会得到照片的url,然后通过上边的函数,得到照片的分析数据。然后将分析的数据返回给某人就可以了。至于怎么接受,怎么返回。

就看微信公众平台官网文档或这里之前的文章。

END