【教程】从人脸检测与比对,实测七牛云人脸核验 API
为了尽可能排除不相关的细节,代码是以命令行方式来运行的,每个 API 对应一个 PHP 代码文件。
预备工作
1. 建立工作目录并安装依赖
cd qiniu-api
composer require symfony/http-client
2. 获取七牛云账号的密钥
人脸比对
// 解决自动加载问题,之后引用的类会被自动加载
require_once __DIR__ . '/vendor/autoload.php';
// 指定使用特定命名空间下的类
use Qiniu\Auth;
use Symfony\Component\HttpClient\HttpClient;
// 定义两个常量,分别对应上文提到的七牛云里复制出的Access Key和Secret Key,这里需要替换成你实际的key
// 实际项目中,这些值可能是从配置文件或环境变量中读取
define('ACCESS_KEY', 'your_own_access_key');
define('SECRET_KEY', 'your_own_secret_key');
$apiUrl = 'https://face-compare.qiniuapi.com/facecompare';
// 提交到API时用到的HTTP方法,本文中涉及的3个API都是该方法
$method = 'POST';
// 发送到API的请求body的mime类型,本文中涉及的3个API都是使用该类型
$contentType = 'application/json';
* @param int $argc 命令行参数的数量
* @param array $argv 存储命令行参数的数组
* @return array 命令行里得到的数据
*/
function getInputs(int $argc, array $argv): array
{
// 确保参数数量正确(参数分别是:php脚本名、第1张图片路径、第2张图片路径,所以总共是3个参数)
if ($argc !== 3) {
throw new \Exception('请提供2张图片的路径。');
}
// 确保传入的2张图片路径对应真实存在的文件
if (!file_exists($argv[1]) || !file_exists($argv[2])) {
throw new \Exception('请确保2张图片文件存在。');
}
// 以数组形式返回2张图片的路径
return [
'image_1' => $argv[1],
'image_2' => $argv[2],
];
}
* @param string $apiUrl API地址
* @param string $method 调用API的HTTP方法
* @param string $contentType API请求body的mime类型
* @param array $inputs 前一个函数返回的数组
* @return array 发送HTTP请求用到的headers和body
*/
function composeRequestOptions(string $apiUrl, string $method, string $contentType, array $inputs): array {
// 对2张图片内容进行base64编码,放入一个文档要求的结构,并生成json格式的数据作为请求的body
$body = json_encode([
'data_uri_a' => encodeMediaToBase64($inputs['image_1']),
'data_uri_b' => encodeMediaToBase64($inputs['image_2']),
]);
// 调用官方SDK来生成凭证的HTTP头
$auth = new Auth(ACCESS_KEY, SECRET_KEY);
// $authHeader的值为诸如['Authorization' => 'Qiniu QNJi_bYJlmO5LeY08FfoNj9w_r7...']的数组
$authHeader = $auth->authorizationV2($apiUrl, $method, $body, $contentType);
// 请求头里除了包含mime类型,也要包含凭证,所以这里把两个头合并在一个数组里
$headers = array_merge(
['Content-Type' => $contentType],
$authHeader
);
// 返回包含header和body的数组
return [
'headers' => $headers,
'body' => $body,
];
}
* @param string $mediaPath 文件在本地的路径
* @return string base64字符串
*/
function encodeMediaToBase64(string $mediaPath): string {
$mediaData = file_get_contents($mediaPath);
return base64_encode($mediaData);
}
* @param string $apiUrl API地址
* @param string $method 调用API的HTTP方法
* @param array $requestOptions 包含请求header和body
* @return array API返回的应答body,转成了数组格式
*/
function callApi(string $apiUrl, string $method, array $requestOptions): array {
// 创建发送客户端
$client = HttpClient::create();
// 发送请求
$response = $client->request($method, $apiUrl, $requestOptions);
// 这里获得的应答是json格式
$content = $response->getContent();
// 把json转为数组并返回
return json_decode($content, true);
}
$requestOptions = composeRequestOptions($apiUrl, $method, $contentType, $inputs);
$responseBody = callApi($apiUrl, $method, $requestOptions);
// 打印输出API返回的结果
print_r($responseBody);
Matt Damon-young
Matt Damon-old
Leonardo Dicaprio
Morgan Freeman
php face-compare.php images/matt-damon-young.jpg images/matt-damon-old.jpg
Array
(
[session_id] => 20210915084600UrzDdFAvk5
[Errorcode] => 0
[Errormsg] => OK
[similarity] => 100
)
php face-compare.php images/matt-damon-young.jpg images/leonardo-dicaprio.jpg
Array
(
[session_id] => 20210915084715c8YXlSJrK6
[Errorcode] => 0
[Errormsg] => OK
[similarity] => 68
)
php face-compare.php images/matt-damon-young.jpg images/morgan-freeman.jpg
Array
(
[session_id] => 20210915084829S6leTB1V2R
[Errorcode] => 0
[Errormsg] => OK
[similarity] => 0
)
权威人脸比对
{
if ($argc !== 4) {
throw new \Exception('请提供姓名、身份证号和1张照片的路径。');
}
// 检查18位身份证号的格式
if (!preg_match('/^\d{17}[\dX]$/', $argv[2])) {
throw new \Exception('请提供18位身份证号。');
}
if (!file_exists($argv[3])) {
throw new \Exception('请确保1张照片文件存在。');
}
// 以数组形式返回姓名、身份照号和图片路径
return [
'name' => $argv[1],
'id' => $argv[2],
'image' => $argv[3],
];
}
$body = json_encode([
'realname' => $inputs['name'],
'idcard' => $inputs['id'],
'data_uri' => encodeMediaToBase64($inputs['image']),
]);
// 其余部分和人脸比对里的函数完全一致
}
php face-hdphoto-auth.php 张三 000000000000000000 images/photo-for-id-auth.jpg
Array
(
[session_id] => 20210914013725tA3iTEoS09
[Errorcode] => 0
[Errormsg] => OK
[similarity] => 96.92
)
Array
(
[session_id] => 20210914013752cJy9ZYtMge
[Errorcode] => 0
[Errormsg] => OK
[similarity] => 81.88
)
Array
(
[session_id] => 20210914015325r6i8WjT2KB
[Errorcode] => 0
[Errormsg] => OK
[similarity] => 0
)
人脸检测
{
if ($argc !== 2) {
throw new \Exception('请提供1张图片的路径。');
}
if (!file_exists($argv[1])) {
throw new \Exception('请确保1张图片文件存在。');
}
return [
'image' => $argv[1],
];
}
$body = json_encode([
'image_b64' => encodeMediaToBase64($inputs['image']),
]);
// 其余部分和人脸比对里的函数完全一致
}
(
[num_face] => 3
[rotate_angle] => 0
[face] => Array
(
[0] => Array
(
[score] => 99.48
[x] => 147
[y] => 74
[width] => 162
[height] => 162
[pitch] => -1.87
[yaw] => -1.55
[roll] => 2.25
[eye] => 0
[mouth] => 0
[blur] => 100
[gender] => M
[age] => 35
[illumination] => 72.84
[face_shape] => Array(...)
[completeness] => 100
[area] => 26103
[facesize] => 100
[quality] => 92.58
[face_aligned_b64] => ...
)
[1] => Array(...)
[2] => Array(...)
)
[errorcode] => 0
[errormsg] => OK
[session_id] => 20210917012718zjLc9tSBNu
)
小结