跳转到内容

人脸检测算法执行指南

1. 人脸检测概述

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

本人脸检测算法在数据集上的性能如下。

人脸检测算法performance
FDDB98.64%

face detection fddb performance curve

图 1-1

CSUN RV1126B 开发板上的执行效率如下。

算法类型执行效率
face_detect24ms

2. 快速开始

2.1 开发环境准备

首次阅读本文档时,请参考《入门指南/开发环境准备与更新》,并按照相关步骤部署编译环境。在 PC 侧 Ubuntu 系统中执行 run 脚本,进入 Docker 开发环境。

Terminal window
cd ~/linuxshare/work/rv1126b/jp/embedded/images/develop_environment
./run.sh 2204

docker development environment startup

图 1-2

2.2 源代码下载

在 Docker 开发环境中,创建用于保存源代码仓库的管理目录。使用 git 工具将远程仓库克隆到管理目录中。即使从 GitHub 网页下载,也请下载完整仓库,不要只单独下载本示例对应的目录。

Terminal window
cd /opt/linuxshare/work/rv1126b/jp/AI/demo/ai-algorithm
git clone https://github.com/csunltd/rv1126b-ai-toolkit.git

2.3 模型部署

运行算法 Demo 时,首先需要下载人脸检测算法模型。请解压下载的文件,并将人脸检测算法模型复制到 Release/ 目录。

https://dl.dragonwake.com/download/rv1126b/AI/demo/01_face-detect.zip

face detect model release files

图 2-1

2.4 示例构建

进入示例目录并执行构建。由于依赖库位于开发板侧,交叉编译过程中需要保持 /mnt 挂载。指定 build.sh cpres 后,Release/ 目录中的资源会复制到开发板。

Terminal window
cd rv1126b-ai-toolkit/Demos/algorithm-face_detect
./build.sh cpres
Terminal window
sudo mount -t nfs -o vers=3,proto=tcp,mountproto=tcp,nolock,retrans=5,timeo=5 192.168.10.85:/ /mnt

face detect build terminal output

图 2-2

2.5 示例执行与结果

将编译完成的文件复制到开发板,通过串口调试或 SSH 调试登录开发板并执行示例。可在 Docker 编译环境中获取结果图像。

Terminal window
cp Release/* /mnt/userdata/Demo/algorithm-face_detect/
cd /userdata/Demo/algorithm-face_detect/
./test-face-detect test.jpg

face detect release copy output

图 2-3

face detect board run output

Terminal window
cp /mnt/userdata/Demo/algorithm-face_detect/result.jpg .

face detect result image

图 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。操作流程如下。

face detect sample flow

图 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;
}