人脸检测算法执行指南
1. 人脸检测概述
人脸检测是人脸识别、人脸属性分类、人脸编辑、人脸跟踪等任务不可或缺的前置处理。其性能会直接影响人脸识别等后续任务的有效性。过去几十年中,非受限环境下的人脸检测取得了显著进展,但在真实环境中实现高精度、高效率的人脸检测仍然是重要课题。这主要受到姿态变化、表情、尺度、光照条件、图像畸变以及人脸遮挡等因素影响。与普通目标检测不同,人脸检测中目标长宽比变化相对较小,但尺度变化非常大,可能从几个像素到数千个像素不等。
本人脸检测算法在数据集上的性能如下。
| 人脸检测算法 | performance |
|---|---|
| FDDB | 98.64% |

图 1-1
CSUN RV1126B 开发板上的执行效率如下。
| 算法类型 | 执行效率 |
|---|---|
| face_detect | 24ms |
2. 快速开始
2.1 开发环境准备
首次阅读本文档时,请参考《入门指南/开发环境准备与更新》,并按照相关步骤部署编译环境。在 PC 侧 Ubuntu 系统中执行 run 脚本,进入 Docker 开发环境。
cd ~/linuxshare/work/rv1126b/jp/embedded/images/develop_environment./run.sh 2204
图 1-2
2.2 源代码下载
在 Docker 开发环境中,创建用于保存源代码仓库的管理目录。使用 git 工具将远程仓库克隆到管理目录中。即使从 GitHub 网页下载,也请下载完整仓库,不要只单独下载本示例对应的目录。
cd /opt/linuxshare/work/rv1126b/jp/AI/demo/ai-algorithmgit clone https://github.com/csunltd/rv1126b-ai-toolkit.git2.3 模型部署
运行算法 Demo 时,首先需要下载人脸检测算法模型。请解压下载的文件,并将人脸检测算法模型复制到 Release/ 目录。
https://dl.dragonwake.com/download/rv1126b/AI/demo/01_face-detect.zip

图 2-1
2.4 示例构建
进入示例目录并执行构建。由于依赖库位于开发板侧,交叉编译过程中需要保持 /mnt 挂载。指定 build.sh cpres 后,Release/ 目录中的资源会复制到开发板。
cd rv1126b-ai-toolkit/Demos/algorithm-face_detect./build.sh cpressudo mount -t nfs -o vers=3,proto=tcp,mountproto=tcp,nolock,retrans=5,timeo=5 192.168.10.85:/ /mnt
图 2-2
2.5 示例执行与结果
将编译完成的文件复制到开发板,通过串口调试或 SSH 调试登录开发板并执行示例。可在 Docker 编译环境中获取结果图像。
cp Release/* /mnt/userdata/Demo/algorithm-face_detect/cd /userdata/Demo/algorithm-face_detect/./test-face-detect test.jpg
图 2-3

cp /mnt/userdata/Demo/algorithm-face_detect/result.jpg .
图 2-4
3. 人脸检测 API 说明
3.1 引用方法
如果需要在本地项目中直接调用 EASY EAI API 库,请添加以下头文件目录、库文件目录和链接参数。
| 项目 | 说明 |
|---|---|
| 头文件目录 | easyeai-api/algorithm/face_detect |
| 库文件目录 | easyeai-api/algorithm/face_detect |
| 库链接参数 | -lface_detect |
3.2 人脸检测初始化函数
函数原型如下。
int face_detect_init(rknn_context *ctx, const char *path);详细信息如下。
| 项目 | 说明 |
|---|---|
| 函数名 | face_detect_init() |
| 头文件 | face_detect.h |
| 输入参数 | ctx: rknn_context handle |
| 输入参数 | path: algorithm model path |
| 返回值 | 成功时返回值:0 / 失败时返回值:-1 |
| 说明 | 无 |
3.3 人脸检测执行函数
函数原型如下。
int face_detect_run(rknn_context ctx, cv::Mat &input_image, std::vector<det> &result);| 项目 | 说明 |
|---|---|
| 函数名 | face_detect_run() |
| 头文件 | face_detect.h |
| 输入参数 | ctx: rknn_context handle |
| 输入参数 | input_image: cv::Mat input image |
| 输出参数 | result: face detection result |
| 返回值 | 成功时返回值:0 / 失败时返回值:-1 |
| 说明 | 无 |
3.4 人脸检测释放函数
函数原型如下。
int face_detect_release(rknn_context ctx);| 项目 | 说明 |
|---|---|
| 函数名 | face_detect_release() |
| 头文件 | face_detect.h |
| 输入参数 | ctx: rknn_context handle |
| 返回值 | 成功时返回值:0 / 失败时返回值:-1 |
| 说明 | 无 |
4. 人脸检测算法示例
示例目录为 Demos/algorithm-face_detect/test-face-detect.cpp。操作流程如下。

图 3-1
参考示例如下。
#include <opencv2/opencv.hpp>#include <stdio.h>#include <sys/time.h>#include "face_detect.h"
using namespace cv;
int main(int argc, char **argv){ if( argc != 2) { printf("./test-face-detect xxx\n"); return -1; }
struct timeval start; struct timeval end; float time_use=0;
rknn_context ctx; std::vector<det> result;
Mat image; image = cv::imread(argv[1], 1);
face_detect_init(&ctx, "face_detect.model");
gettimeofday(&start,NULL); face_detect_run(ctx, image, result);
gettimeofday(&end,NULL); time_use=(end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);//マイクロ秒 printf("time_use is %f\n",time_use/1000);
printf("face num:%d\n", (int)result.size());
for (int i = 0; i < (int)result.size(); i++) { int x = (int)(result[i].box.x); int y = (int)(result[i].box.y); int w = (int)(result[i].box.width); int h = (int)(result[i].box.height); rectangle(image, Rect(x, y, w, h), Scalar(0, 255, 0), 2, 8, 0);
for (int j = 0; j < (int)result[i].landmarks.size(); ++j) { cv::circle(image, cv::Point((int)result[i].landmarks[j].x, (int)result[i].landmarks[j].y), 2, cv::Scalar(225, 0, 225), 2, 8); } }
imwrite("result.jpg", image);
face_detect_release(ctx);
return 0;}