# 嵌入式人脸识别打卡机 **Repository Path**: Egrt/FaceRecognize ## Basic Information - **Project Name**: 嵌入式人脸识别打卡机 - **Description**: 基于百度ai的人脸识别嵌入式考勤机 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 12 - **Forks**: 0 - **Created**: 2020-09-12 - **Last Updated**: 2024-08-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 嵌入式人脸识别打卡机 #### OpenCV标记人脸 OpenCV有3中人脸识别方法,分别基于三个不同算法,分别为Eigenfaces,Fisherfaces和Local Binary Pattern Histogram。 这些方法都有类似的一个过程,即先对数据集进行训练,对图像或视频中的人脸进行分析,并且从两个方面确定。是否识别到对应的目标?识别到的目标的置信度是多少?在实际中通过阈值进行筛选,置信度高于阈值的人脸将被丢弃。 在本项目中,先创建一个OpenCV对象。打开摄像头把拍摄到的彩色图像转为灰色图像,因为分类器只能处理灰色图像。对灰色图像进行均衡化处理,可以提高分类器处理准确率。通过函数`classifier.detectMultiScale(image, faces, 1.1, 3, 0, cv::Size(50, 50));` 使用分类器进行人脸检测,并画出一个50*50像素点的红色矩形框。实现效果如下图所示。 ![人脸识别矩形框](https://images.gitee.com/uploads/images/2020/0912/212424_5a1715b1_4815563.jpeg "图片2_LI.jpg") #### 调用百度AI人脸搜索api ![人脸检测流程](https://images.gitee.com/uploads/images/2020/0912/210409_4b95cf01_4815563.png "屏幕截图.png") 如上图所示,在项目中每40ms调用摄像头拍摄一张照片传给分类器,如果分类器将这一帧的图片分类为存在人脸且连续五次都识别为人脸。那么则将最后一次拍摄到的图片用过https协议下的POST方法传输给https://aip.baidubce.com/rest/2.0/face/v3/search的api接口。 #### 人脸搜索流程 ![人脸搜索流程](https://images.gitee.com/uploads/images/2020/0912/210447_07ad6710_4815563.png "屏幕截图.png") URL的请求参数如下: ##### 硬件主要参数 ``` 参数 必选 类型 说明 image 是 string 图片信息,图片上传方式根据image_type来判断 image_type 是 string BASE64:图片的base64值,base64编码后的图片数据。URL:图片的 URL地址。FACE_TOKEN: 人脸图片的唯一标识。 group_id_list 是 string 从指定的group中进行查找 用逗号分隔,上限10个 quality_control 否 string 图片质量控制:NONE: 不进行控制;LOW:较低的质量要求; NORMAL: 一般的质量要求;HIGH: 较高的质量要求。 liveness_control 否 string 活体检测控制:NONE: 不进行控制;LOW:较低的活体要求; NORMAL: 一般的活体要求;HIGH: 较高的活体要求。 user_id 否 string 当需要对特定用户进行比对时,指定user_id进行比对。 max_user_num 否 unit32 查找后返回的用户数量。返回相似度最高的几个用户。 ``` 如下图所示。当按下打卡按钮之后,摄像头显示界面出现一个红色矩形框来标记用户人脸。当连续五次识别到人脸时候,Qt程序将图片进行BASE64转码;最终在界面上显示用户的信息。至此,本项目功能实现基本完成。 ![最终系统演示](https://images.gitee.com/uploads/images/2020/0912/212600_36acf1a8_4815563.jpeg "图片1_LI.jpg") #### 人脸识别 C++ SDK目录结构如下: ``` ├── base │ ├── base.h // 请求客户端基类 │ ├── base64.h // base64加密相关类 │ ├── http.h // http请求封装类 │ └── utils.h // 工具类 └── face.h // 人脸识别 交互类 ``` # 安装步骤如下: 1. 在官方网站下载C++ SDK压缩包。 2. 将下载的aip-cpp-sdk-version.zip解压, 其中文件为包含实现代码的头文件。 3. 安装依赖库libcurl(需要支持https) openssl jsoncpp(>1.6.2版本,0.x版本将不被支持)。 4. 编译工程时添加 C++11 支持 (gcc/clang 添加编译参数 -std=c++11), 添加第三方库链接参数 lcurl, lcrypto, ljsoncpp。 5. 在源码中include face.h ,引入压缩包中的头文件以使用aip命名空间下的类和方法。 新建client client是人脸识别的C++客户端,为使用人脸识别的开发人员提供了一系列的交互方法。当您引入了相应头文件后就可以新建一个client对象。 我根据如下参考代码新建一个client: ``` #include "face.h" // 设置APPID/AK/SK std::string app_id = "你的 App ID"; std::string api_key = "你的 Api key"; std::string secret_key = "你的 Secret Key"; aip::Face client(app_id, api_key, secret_key); ``` # 人脸搜索 1:N人脸搜索:也称为1:N识别,在指定人脸集合中,找到最相似的人脸; 1:N人脸认证:基于uid维度的1:N识别,由于uid已经锁定固定数量的人脸,所以检索范围更聚焦; 1:N人脸识别与1:N人脸认证的差别在于:人脸搜索是在指定人脸集合中进行直接地人脸检索操作,而人脸认证是基于uid,先调取这个uid对应的人脸,再在这个uid对应的人脸集合中进行检索(因为每个uid通常对应的只有一张人脸,所以通常也就变为了1:1对比);实际应用中,人脸认证需要用户或系统先输入id,这增加了验证安全度,但也增加了复杂度,在本项目中我选择的是1:N人脸搜索,在学生的人们集合当中,找到与我传入图片的最相似的人脸。 ``` Json::Value result; std::string image = "取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串"; std::string image_type = "BASE64"; std::string group_id_list = "stu"; // 调用人脸搜索 result = client.search(image, image_type, group_id_list, aip::null); ``` 安装SDK所需的编译环境: ``` sudo apt install libcurl4-gnutls-dev sudo apt install libjsoncpp-dev sudo apt install libssl-dev ```