有一天无意中看到,通过百度人工智能平台中的人脸检测模块,可以实现简单的人脸检测,百度人工智能平台免费注册,人脸检测模块免费使用。相关API文档在:百度AI开放平台-全球领先的人工智能服务平台-百度AI开放平台,依照API文档就可以写出一个简单的检测工具。于是就想写一个测试用例来看看效果。
废话不多说,我们先看效果图:?
是不是很有趣。这只是一个单php文件,直接放到php运行环境即可使用。可以使用phpstudy集成环境即可。上传的图片都存在了同级img目录。下面讲一下在写的过程中遇到的坑,源码会贴在最后。
1.注册百度账号,开通api
第一步要先注册百度账号,开通人脸检测接口,获取属于你自己的ak(API Key)和sk(Secret Key).
?
2.开发过程注意事项
我们先梳理一下流程。
- 看文档,看文档,看文档,重要的事情说三遍。百度官方文档:人脸开发文档
- 由文档我们知道。人脸检测的流程是先通过ak和sk获取属于自己的token,然后再根据token和请求参数去获取人脸信息。请求参数确定要你要获取的哪些人脸信息。
- 先走测试。了解下过程。百度在线人脸测试地址:百度智能云-ApiExplorer
tips:这里我用的图片是base64格式的。关于这个有一个坑。后面会说明。
3.填坑之旅
上传的图片转成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);
}
?4.拿来主义看这里
上面的只是我在开发过程中遇到的坑和一些心得,唏嘘不已。看客们应该不关心。所以我还是直接上源码吧。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no">
<meta http-equiv="Cache-Control" content="no-siteapp"/>
</head>
<body>
<?php
if(isset($_GET['action'])){
echo "123";
$action = $_GET['action'];
call_user_func($action);
}
function gettoken(){
$AK="你自己的ak";
$SK="你自己的sk";
$url="https://aip.baidubce.com/oauth/2.0/token";
$bodys="grant_type=client_credentials&client_id=".$AK."&client_secret=".$SK;
$token=geturl($url,$bodys)->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"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 判断当前目录下的 upload 目录是否存在该文件
// 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
if (file_exists("img/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。<br><br><br> ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], "img/" . $_FILES["file"]["name"]);
echo "文件存储在: " . "img/" . $_FILES["file"]["name"]."<br><br><br>";
}
$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 "<pre>";
// var_dump($result->result->face_list[0]);
// echo "</pre>";
if($result->error_msg=="SUCCESS"){
echo "<img src={$base} style='width:400px' />";
echo "<p>图片中包含人脸数:".$result->result->face_num;
echo "<p>图片中包含人物年龄:".$result->result->face_list[0]->age;
echo "<p>图片中包含人物颜值评分:".$result->result->face_list[0]->beauty;
echo "<p>图片中包含人物性别:".$result->result->face_list[0]->gender->type."(male:男性 female:女性)";
echo "<p>图片中包含人物种族:".$result->result->face_list[0]->race->type;
echo "<p>图片中包含人物表情:".$result->result->face_list[0]->expression->type."(none:不笑;smile:微笑;laugh:大笑)";
}else{
echo "<p>{$result->error_msg}</p>";
}
}
}
else
{
echo "非法的文件格式";
}
}
?>
<div class="main">
<div class="form">
<form action="face.php?action=upload" enctype="multipart/form-data" method="post">
<input type="file" name="file" />
<input type="submit" value="上传" />
</form>
</div>
</div>
</body>
</html>
?这里要感谢一下这位博客:调用百度人脸检测API实现简单的颜值检测_寸先生的AI道路-CSDN博客_百度人脸检测颜值
不过他用的是python。我没试过。仅供参考。
转载请注明出处,谢谢!
?
|