百度人脸识别SDK的简单封装,composer安装使用

简介

最近做员工人脸打卡系统,自己封装了一下百度人脸识别SDK,方便以后重复利用。

暂时只封装了一部分接口,具体有哪些方法,看继承自官方sdk的Aoding9\BaiduAip\AipFace这个类,每个方法都有中文注释

为了避免覆写sdk,封装的方法名以Api结尾,用法与百度的官方文档相同,点进sdk也有中文注释,其余未封装的方法,直接按官方文档即可调用。

基于原有api,简化了传参和异常处理,例如matchFacesByUrl是对match的封装,参数从4个减少到2个。

人脸比对示例:

百度人脸识别SDK的简单封装

百度人脸识别SDK的简单封装

安装

composer require aoding9/laravel-baidu-aip

安装失败可能是用了国内镜像,切换为官方源

composer config repo.packagist composer https://packagist.org

因为官方源下载慢,国内镜像又有各种问题可能导致安装失败,可以把以下代码添加到composer.json,直接从github安装

{
  "repositories": [
    {
      "type": "vcs",
      "url": "https://github.com/aoding9/laravel-baidu-aip"
    }
  ]
}

配置

在.env中添加如下配置项

BAIDU_AIP_APP_ID=
BAIDU_AIP_API_KEY=
BAIDU_AIP_SECRET_KEY=
BAIDU_AIP_GROUP_ID=

配置项一般无需修改,如需自定义,使用php artisan vendor:publish --provider="Aoding9\BaiduAip\BaiduAipServiceProvider"发布baiduAip.php到config目录

return [
    'app_id'=>env('BAIDU_AIP_APP_ID',null),
    'api_key'=>env('BAIDU_AIP_API_KEY',null),
    'secret_key'=>env('BAIDU_AIP_SECRET_KEY',null),
    'group_id'=>env('BAIDU_AIP_GROUP_ID',null),
];

关于BAIDU_AIP_GROUP_ID:默认用户组id,如果调用相关接口时不传用户组id,会以此作为默认值

使用

首先从容器中获取服务,然后获取aipFace实例,然后使用实例中的方法

1、两张人脸图片比对相似度matchFacesByUrl|matchApi

use Aoding9\BaiduAip\BaiduAipService;

function test() {
    //$aipFace = app('baiduAip')->aipFace(); // 别名
    $aipFace = app(BaiduAipService::class)->aipFace(); 
    $score = $aipFace
        ->matchFacesByUrl(
            $url1 = 'https://pix2.tvzhe.com/thumb/star/0/221/260x346.jpg',
            $url2 = 'https://n.sinaimg.cn/sinacn10114/40/w2000h2840/20190226/7aa0-htptaqe7306666.jpg'
        );
    dd($url1, $url2, '吴京1和吴京2相似度' . $score);
}

2、在用户组中搜索人脸对应的用户,例如人脸打卡,拍照后判断是哪个用户打的卡searchApi


use Illuminate\Database\Eloquent\Model;
use Aoding9\BaiduAip\BaiduAipService;
class Staff extends Model {
    /**
     * @Desc 根据人脸,匹配人员model,需要提前增加用户组,并且把用户的人脸注册进去,绑定userid
     * @param string $face 上传的图片url
     */
    public static function getStaffByFaceImage($face): Staff {
        $aipFace = app(BaiduAipService::class)->aipFace();
        try {
            $staffId = $aipFace->searchApi($face); // 返回用户id或null,或抛异常
            $staff = Staff::findOrFail($staffId); // 未找到也抛异常
        } catch (\Exception $e) {
            throw new \Exception('未匹配到人员信息',$e->getCode());
        }

        return $staff;
    }
}

// 前端上传人脸图片,根据图片地址,检索用户模型
$face = request()->input('face');
$staff = Staff::getStaffByFaceImage($face);

3、用户组管理groupAddApi|groupDeleteApi|getGroupListApi|getGroupUsersApi|getUserApi

use Aoding9\BaiduAip\BaiduAipService;

 function test() {
        $aipFace = app(BaiduAipService::class)->aipFace();
        // 不传参则使用env的默认用户组id
        dd($aipFace->groupAddApi());  // 新增用户组
        dd($aipFace->groupDeleteApi()); // 删除用户组
        dd($aipFace->getGroupListApi()); // 获取用户组列表
        dd($aipFace->getGroupUsersApi()); // 获取用户组的用户id列表
        dd($aipFace->getUserApi(1)); // 获取根据用户id获取user_info
    }

4、结合模型观察者,管理用户资料addUserApi|updateUserApi|deleteUserApi

<?php
namespace App\Observers;
use App\Models\Staff;
use Aoding9\BaiduAip\BaiduAipService;
use Log;

class StaffObserver {
    public $aipFace;

    public function __construct() {
        if (!$this->aipFace) {
            $this->aipFace = app(BaiduAipService::class)->aipFace();
        }
    }

    // 创建用户时,往用户组注册用户,并将头像添加到用户人脸库,绑定用户id(如果之前没创建用户组,需要先创建用户组),把姓名也存入user_info
    public function created(Staff $model) {
        $result = $this->aipFace->addUserApi($model->avatar_url, $model->id, null, null, ['user_info' => $model->name]);
        Log::info('人脸注册成功:' . $model->name, $result);
    }
    // 头像变更时,更新用户的人脸库
    public function updating(Staff $model) {
        if ($model->avatar) {
            $result = $this->aipFace->updateUserApi($model->avatar_url, $model->id, null, null, ['user_info' => $model->name]);
            Log::info('人脸更新成功:' . $model->name, $result);
        }
    }

    // 删除用户时,删除用户组里的用户
    public function deleted(Staff $model) {
        $result = $this->aipFace->deleteUserApi($model->id);
        Log::info('人脸删除成功:' . $model->name, $result);
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
DogLoML
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!