SeetaFace6包含人脸识别的基本能力:人脸检测、关键点定位、人脸识别,同时增加了活体检测、质量评估、年龄性别估计,并且顺应实际应用需求,开放口罩检测以及口罩佩戴场景下的人脸识别模型。
1. 概述
在视频中,从检测到人脸帧开始 ,在连续的后续帧中,对目标人脸的运动轨迹和轮廓变化进行持续分析与跟踪。在跟踪过程中,需要用唯一的编号来区分每个被跟踪的人脸,这个编号称为PID。
在连续的视频帧中,当一个人进入视频画面直到离开,其PID不变,通过PID来标识同一个人,只需做一次人脸识别,从而有效提高人脸识别的效率,节省设备算力。
2. Seetaface6人脸跟踪
这里先给出人脸跟踪结果的结构体:
struct SeetaTrackingFaceInfo
{
SeetaRect pos;
float score;
int frame_no;
int PID;
int step;
};
struct SeetaTrackingFaceInfoArray
{
struct SeetaTrackingFaceInfo *data;
int size;
};
对比与SetaFaceInfo增加了PID字段。frame_no和step为内部调试保留字段,一般不使用。pos字段是SeetaRect类型,可以替代直接人脸检测器的检测结果的pos使用。
PID就是人员编号,对于视频中出现的人脸,如果跟踪分配了同一个PID,那么就可以认为相同PID的人脸属于同一个人。
同样,使用之前先要构造人脸跟踪器:
#include <seeta/FaceTracker.h>
seeta::FaceTracker *new_ft() {
seeta::ModelSetting setting;
setting.append("face_detector.csta");
return new seeta::FaceTracker(setting, 1920, 1080);
}
这里代码构造了用于跟踪1920x1080分辨率视频的人脸跟踪器,这里人脸跟踪器要传入的模型就是人脸检测的模型。
下面就是打印出跟踪到的人脸的PID以及坐标位置的函数:
#include <seeta/FaceTracker.h>
void track(seeta::FaceTracker *ft, const SeetaImageData &image) {
SeetaTrackingFaceInfoArray cfaces = ft->Track(image);
std::vector<SeetaTrackingFaceInfo> faces(cfaces.data, cfaces.data + cfaces.size);
for (auto &face : faces) {
SeetaRect rect = face.pos;
std::cout << "[" << rect.x << ", " << rect.y << ", "
<< rect.width << ", " << rect.height << "]: "
<< face.score << ", PID=" << face.PID << std::endl;
}
}
当检测逻辑断开,或者切换视频的时候,就需要排除之前跟踪的逻辑,这个时候调用Reset方式清楚之前所有跟踪的结果,重新PID计数:
void reset(seeta::FaceTracker *ft) {
ft->Reset();
}
人脸跟踪器和人脸检测器一样,可以设置检测器的基本参数:
ft->SetMinFaceSize(80); // 设置最小人脸80
ft->SetThreshold(0.9f); // 设置检测器的分数阈值
当然还有人脸跟踪器专有的参数设置。
设置视频稳定性:
void seeta::FaceTracker::SetVideoStable(bool stable = true);
当这个参数设为真的话,就会进行检测结果的帧间平滑,使得检测结果从视觉上更好一些。
设置检测间隔:
void seeta::FaceTracker::SetInterval(int interval);
间隔默认值为10。这里跟踪间隔是为了发现新增PID的间隔。检测器会通过整张图像检测人脸去发现是否有新增的PID,所以这个值太小会导致跟踪速度变慢(不断做全局检测);这个值太大会导致画面中新增加的人脸不会立马被跟踪到。
SetInterval的默认值是根据FPS为25设定的。在应用中往往会产生跳帧,如果跳帧为1的话,相当于FPS变成了12.5。这个时候就可以将跟踪间隔设置为5。
人脸跟踪不等同与人群计数算法。从目标上来说是为了保证同一个PID为同一个人为第一要务,这样可以减小识别分析的压力。另外,人脸跟踪是基于出现的人脸,如果没有漏出人脸也做计数的话,结果差距会很大。当然,统计PID个数来统计摄像头前出现人脸的人次还是可以的。
3. 演示Demo
3.1 开发环境
- Windows 10 Pro x64
- Visual Studio 2015
- Seetaface6
3.2 功能介绍
演示程序主界面如下图所示,包括人脸跟踪、取消等功能。
人脸跟踪:读取测试视频,进行实时人脸跟踪,结果显示在左侧(包括人脸框、PID)。
3.3 下载地址
开发环境:
- Windows 10 pro x64
- Visual Studio 2015
- Seetaface6