有一天无意中看到,通过百度人工智能平台中的人脸检测模块,可以实现简单的人脸检测,百度人工智能平台免费注册,人脸检测模块免费使用。相关API文档在:百度AI开放平台-全球领先的人工智能服务平台-百度AI开放平台,依照API文档就可以写出一个简单的检测工具。于是就想写一个测试用例来看看效果。
废话不多说,我们先看效果图:
是不是很有趣。这只是一个单php文件,直接放到php运行环境即可使用。可以使用phpstudy集成环境即可。上传的图片都存在了同级img目录。下面讲一下在写的过程中遇到的坑,源码会贴在最后。
第一步要先注册百度账号,开通人脸检测接口,获取属于你自己的ak(API Key)和sk(Secret Key).
我们先梳理一下流程。
tips:这里我用的图片是base64格式的。关于这个有一个坑。后面会说明。
上传的图片转成base64,在传参时总是报错param[image_template] is null,这里我用的图片格式是base64,用官方给的数据FACE_TOKEN时,却是正常的。最后找了很久。终于终于解决了。这里感谢一下这位博客:php百度人脸识别param[image_template] is null使用BASE64图片类型json_decode返回NULL的处理解决方案_漏刻有时数据可视化大屏(PHP&ECHARTS智能化开源软件系统)-CSDN博客
关键代码其实就是这个:
for ($i = 0; $i <= 31; ++$i) { //去空格
$base = str_replace(chr($i), "", $base);
}
上面的只是我在开发过程中遇到的坑和一些心得,唏嘘不已。看客们应该不关心。所以我还是直接上源码吧。
access_token;
return $token;
}
function base64EncodeImage ($image_file) {
$base64_image = '';
$image_info = getimagesize($image_file);
$image_data = fread(fopen($image_file, 'r'), filesize($image_file));
$base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
return $base64_image;
}
function geturl($url='',$param=''){
if (empty($url) || empty($param)) {
return false;
}
$postUrl = $url;
$curlPost = $param;
$headerArray =array("Content-type:application/json;","Accept:application/json");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
// post提交方式
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output);
return $output;
}
$imgurl="";
function upload(){
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp); // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "
";
echo "文件类型: " . $_FILES["file"]["type"] . "
";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB
";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "
";
// 判断当前目录下的 upload 目录是否存在该文件
// 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
if (file_exists("img/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。
";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], "img/" . $_FILES["file"]["name"]);
echo "文件存储在: " . "img/" . $_FILES["file"]["name"]."
";
}
$img="img/" . $_FILES["file"]["name"];
$base=base64EncodeImage($img);
$imgurl = preg_replace('#data:image/[^;]+;base64,#', '', $base); //图片地址
$url = 'https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=' . gettoken();
$bodys = "{\"image\":\"{$imgurl}\",\"image_type\":\"BASE64\",\"face_field\":\"gender,age,beauty,gender,race,expression\",\"face_type\":\"LIVE\"}";
for ($i = 0; $i <= 31; ++$i) {
$bodys = str_replace(chr($i), "", $bodys);
}
for ($i = 0; $i <= 31; ++$i) { //去空格
$base = str_replace(chr($i), "", $base);
}
$result=geturl($url,$bodys);
// echo "";
// var_dump($result->result->face_list[0]);
// echo "
";
if($result->error_msg=="SUCCESS"){
echo "";
echo "图片中包含人脸数:".$result->result->face_num;
echo "
图片中包含人物年龄:".$result->result->face_list[0]->age;
echo "
图片中包含人物颜值评分:".$result->result->face_list[0]->beauty;
echo "
图片中包含人物性别:".$result->result->face_list[0]->gender->type."(male:男性 female:女性)";
echo "
图片中包含人物种族:".$result->result->face_list[0]->race->type;
echo "
图片中包含人物表情:".$result->result->face_list[0]->expression->type."(none:不笑;smile:微笑;laugh:大笑)";
}else{
echo "
{$result->error_msg}
";
}
}
}
else
{
echo "非法的文件格式";
}
}
?>
这里要感谢一下这位博客:调用百度人脸检测API实现简单的颜值检测_寸先生的AI道路-CSDN博客_百度人脸检测颜值
不过他用的是python。我没试过。仅供参考。
转载请注明出处,谢谢!