SeetaFace6人脸跟踪C++代码实现Demo

        SeetaFace6包含人脸识别的基本能力:人脸检测、关键点定位、人脸识别,同时增加了活体检测、质量评估、年龄性别估计,并且顺应实际应用需求,开放口罩检测以及口罩佩戴场景下的人脸识别模型。

        官网地址:https://github.com/SeetaFace6Open/index

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

        下载地址:SeetaFace6人脸跟踪C++代码实现Demo

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值