说明
根据《百度人脸识别Windows C++离线sdk用户接入文档V8.4.pdf》封装动态库,然后C#调用。
效果
设计背景
• 场景特点:
-- 网络:对于无网、局域网等情况,无法连接公网,API 方式无法运作。如政府单位、金融保险、教育机构等,其中内网情况最为常见,私有化部署是项目开展的前提 条件。
-- 安全:即使可以连接外网,因为人脸数据的敏感性,许多客户不希望将人脸数据传入百度服务器,如大学学生照片、部分企业员工数据等,API 形式也往往不被接受。
-- 速度:由于各地网络线路、机房部署、图片采集方式等诸多原因,API 形式往往耗时较高,容易存在部分请求耗时过长的情况,容易影响业务正常运转。
-- 稳定:API 形式容易受网络抖动、机房故障、线上连带 bug 等影响,存在一定的不稳定因素,可用性保障,往往成为在线调用最容易出现问题的地方。
• 客户特点:
-- 1:N-小型人脸库检索:多为通道通行、固定区域人群验证等需求,如写字楼闸机门禁、企业考勤打卡等,人脸库范围较小,且不易经常变动。-- 1:1-自有数据源对比:将当前采集的人脸,与其他数据源中的人脸进行对比,如身份证芯片照、教务系统图片、档案图片等,进行快速的 1:1 对比验证。
• 核心需求:
-- 基础的人脸采集:包含人脸检测、跟踪、捕获、质量校验等基础功能,获取符合识别条件的人脸。为之前的客户端 SDK 的标准功能,离线版本 SDK 保留以上所有能力。
-- 本地特征抽取:所有在 SDK 中运行的人脸图片,都可以完成本地特征抽取,以便进行对比或识别操作。
-- 1:1 对比:支持两张图片的相似度对比,可直接传入图片,也可调用本地某个人脸特征;
-- 1:N 搜索:支持一定库大小的人脸查找,在指定的人脸集合中查找最相似的人脸,并返回相似度分值;
SDK 包结构
项目
代码
dll 头文件
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
// Windows 头文件:
#include <windows.h>
#include "baidu_face_api.h"
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//创建实例
extern "C" _declspec(dllexport) void* __cdecl create();
//实例初始化
extern "C" _declspec(dllexport) int __cdecl init(void* engine, char* model_path, char* code);
//人脸检测
extern "C" _declspec(dllexport) int __cdecl face_detect(void* engine, Mat* image, char* json_result);
// 通过图片人脸特征值提取
extern "C" _declspec(dllexport) int __cdecl face_feature(void* engine, Mat* image, char* json_result);
// 人脸比对(通过传图片)
extern "C" _declspec(dllexport) float __cdecl face_match_by_img(void* engine, Mat* image, Mat* image2);