本文目录导读:

在PHP项目中对接人脸识别API,通常有云端API(如百度AI、阿里云、腾讯云、旷视Face++)和本地SDK(如虹软ArcFace)两种方式,云端API更简单、成本低且无需处理复杂算法,是目前最主流的方式。
以下是详细、可操作的对接流程,以百度AI人脸识别(国内最常用)为例,其他平台大同小异。
第一步:准备阶段
-
注册账号并创建应用
- 访问 百度AI开放平台。
- 登录后,在控制台创建“人脸识别”应用。
- 创建成功后,你会得到
API Key和Secret Key,这是后续获取access_token的凭证。
-
明确业务功能
- 人脸检测:判断图片中是否有人脸,并返回位置、年龄、性别等属性。
- 人脸比对:比较两张照片是否为同一个人(1:1 验证)。
- 人脸搜索:在海量人脸库中找到最相似的人(1:N 识别)。
- 活体检测:判断是否为真人,防止照片、视频攻击(非常重要)。
-
技术选型
- 使用
cURL函数(PHP内置)。 - 使用
GuzzleHttp等HTTP客户端库(推荐,更现代)。
- 使用
第二步:获取 Access Token(核心凭证)
所有百度AI的API调用都需要一个临时令牌(access_token),有效期为30天。
PHP代码示例:
<?php
function getAccessToken() {
$apiKey = "你的API Key";
$secretKey = "你的Secret Key";
$url = "https://aip.baidubce.com/oauth/2.0/token";
$postData = [
'grant_type' => 'client_credentials',
'client_id' => $apiKey,
'client_secret' => $secretKey
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 本地调试可关闭,生产环境建议开启
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
// 建议将 access_token 缓存到文件或 Redis 中,避免每次请求都重新获取
return $result['access_token'] ?? null;
}
$accessToken = getAccessToken();
echo "Access Token: " . $accessToken;
?>
最佳实践:将
access_token缓存到文件或数据库,过期(30天)后再重新获取,避免频繁请求。
第三步:测试功能:人脸检测
检测一张图片中的人脸位置和属性。
请求接口: https://aip.baidubce.com/rest/2.0/face/v3/detect
PHP代码:
<?php
function detectFace($imageUrl, $accessToken) {
$url = "https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=" . $accessToken;
// 注意:这里传入的是图片的URL(网络图片),如果使用本地图片需要先 base64 编码
$postData = [
'image' => $imageUrl,
'image_type' => 'URL', // 可选: BASE64, URL, FACE_TOKEN
'face_field' => 'age,gender,expression,beauty', // 需要的属性
'max_face_num' => 10
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); // 注意这里是JSON格式
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFERER, false);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// 使用示例
$token = getAccessToken();
$result = detectFace("https://example.com/path/to/photo.jpg", $token);
print_r($result);
?>
返回示例(部分):
{
"error_code": 0,
"error_msg": "SUCCESS",
"result": {
"face_num": 1,
"face_list": [
{
"face_token": "xxx",
"location": { "left": 117, "top": 131, "width": 172, "height": 172 },
"age": 25,
"gender": { "type": "male", "probability": 0.99 },
"beauty": 72.15
}
]
}
}
第四步:完成业务功能:人脸搜索(1:N 识别)
这是最常用的场景:将用户照片与库中的人脸进行比对,返回最相似的人。
流程分为两步:
-
注册人脸到库(添加用户)
- 接口:
https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add - 需要传递:图片、
group_id(用户组)、user_id(用户唯一标识)
- 接口:
-
搜索人脸(识别)
- 接口:
https://aip.baidubce.com/rest/2.0/face/v3/search - 传递:待识别图片、
group_id_list(在哪个用户组中搜索)
- 接口:
PHP代码示例(核心部分):
<?php
// 1. 注册人脸
function registerFace($accessToken, $base64Image, $groupId, $userId) {
$url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=" . $accessToken;
$postData = [
'image' => $base64Image,
'image_type' => 'BASE64',
'group_id' => $groupId, // "employee_group"
'user_id' => $userId, // "user_12345"
'user_info' => '张三,开发部' // 可选的额外信息
];
// ... (使用curl发送POST请求,方法同上)
}
// 2. 人脸搜索
function searchFace($accessToken, $base64Image, $groupId) {
$url = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=" . $accessToken;
$postData = [
'image' => $base64Image,
'image_type' => 'BASE64',
'group_id_list' => $groupId,
'quality_control' => 'LOW', // 图片质量控制
'liveness_control' => 'LOW' // 活体检测控制(非必须)
];
// ... (使用curl发送POST请求)
// 返回结果会包含 matchs 数组,score 表示置信度
// 通常建议分数大于 80 分才认为是匹配成功
}
?>
常见问题与最佳实践
-
图片格式问题
- 本地图片:需先转为 base64 编码(去掉头部的
data:image/jpeg;base64,)。 - PHP中:
$base64 = base64_encode(file_get_contents($local_path));
- 本地图片:需先转为 base64 编码(去掉头部的
-
活体检测(防作弊)
- 建议使用云端API的活体检测(如百度AI的
liveness_control参数)。 - 如果安全要求高,可考虑动作活体(眨眼、张嘴、摇头),但实现成本更高。
- 建议使用云端API的活体检测(如百度AI的
-
错误处理
- 百度API会有详细的错误码和错误信息(
error_code,error_msg)。 - 常见错误:Token失效(
error_code=110)、QPS超限(error_code=18)、图片质量不符合要求(error_code=222202)等。
- 百度API会有详细的错误码和错误信息(
-
性能优化
- 缓存
access_token到共享内存(Redis/Memcache)或本地文件。 - 图片上传前进行压缩(
gd或imagick库),减少网络传输和API处理时间。
- 缓存
-
安全性
- API Key 和 Secret Key 严禁暴露在前端(硬编码在HTML/JS中)。
- 建议所有人脸识别请求由你的服务器(PHP后端)发起,不要直接用前端向百度API发请求(否则Key会泄露)。
完整项目结构建议
your-project/
├── config/
│ └── face.php # 存放API Key、Secret Key、Group ID等配置
├── lib/
│ └── FaceApi.php # 封装人脸识别相关的CURL请求类
├── controller/
│ └── FaceController.php # 处理前端请求的入口
├── public/
│ └── upload.php # 处理图片上传
└── index.php # 入口
封装后的 FaceApi.php 核心方法:
<?php
class FaceApi {
private $accessToken;
public function __construct() {
$this->accessToken = $this->getCachedToken(); // 从缓存中获取
}
public function detect($image, $imageType = 'BASE64') {
// ... 调用 $this->request('/detect', $data)
}
public function search($image, $groupId) {
// ...
}
public function register($image, $groupId, $userId) {
// ...
}
private function request($endpoint, $data) {
$url = "https://aip.baidubce.com/rest/2.0/face/v3" . $endpoint . "?access_token=" . $this->accessToken;
// 通用CURL请求
}
private function getCachedToken() {
// 检查文件/Redis中的token是否过期,未过期直接返回,否则重新获取
}
}
- 选型:小项目优先选云端API(百度AI、阿里云),大项目考虑本地SDK。
- 核心代码:封装
cURL发送JSON请求 + 处理access_token生命周期。 - 安全:Key放在服务端,图片经服务器转发,不要暴露API Key给前端。
- 测试:先通过官方提供的 在线调试工具(各平台都有)确认参数无误,再写代码。
如果你需要对接的是其他厂家(阿里云、腾讯云、Face++等),流程完全一样,只是接口地址和认证方式略有不同(腾讯云常用API密钥签名,阿里云用AppCode或AK/SK),替换对应的SDK即可。