SeetaFace6人脸检测C++代码实现Demo

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

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

1. 人脸检测

        人脸检测,就是输入待检测的图片,输出检测到的每个人脸位置,用矩形表示。

        人脸检测器seeta::FaceDetector 的主要接口

namespace seeta {class FaceDetector {FaceDetector(const SeetaModelSetting &setting);SeetaFaceInfoArray detect(const SeetaImageData &image) const;void set(Property property, double value);double get(Property property) const;}
}

        构造一个检测器的函数参考如下:

#include <seeta/FaceDetector.h>
seeta::FaceDetector *new_fd() {seeta::ModelSetting setting;setting.append("face_detector.csta");return new seeta::FaceDetector(setting);
}

        有了检测器,我们就可以对图片检测人脸,检测图片中所有人脸并打印坐标的函数参考如下:

#include <seeta/FaceDetector.h>
void detect(seeta::FaceDetector *fd, const SeetaImageData &image) {SeetaFaceInfoArray  infos = fd->detect(image);for (int i = 0; i<infos.size; i++){SeetaRect& face = infos.data[i].pos;std::cout << "[" << face.x << ", " << face.y << ", "<< face.width << ", " << face.height << "]: "<< infos.data[i].score << std::endl;}
}

        人脸检测器可以设置一些参数,通过set方法(set方法只对当次人脸检测器有效)。可以设置的属性有:

seeta::FaceDetector::PROPERTY_MIN_FACE_SIZE     最小人脸,默认值为20
seeta::FaceDetector::PROPERTY_THRESHOLD         检测器阈值,默认值为0.90
seeta::FaceDetector::PROPERTY_MAX_IMAGE_WIDTH   可检测的图像最大宽度,默认值为2000
seeta::FaceDetector::PROPERTY_MAX_IMAGE_HEIGHT  可检测的图像最大高度,默认值为2000
seeta::FaceDetector::PROPERTY_NUMBER_THREADS    人脸检测器计算线程数,默认为4

        最小人脸是人脸检测器常用的一个概念,默认值为20,单位像素。它表示了在一个输入图片上可以检测到的最小人脸尺度,注意这个尺度并非严格的像素值,例如设置最小人脸80,检测到了宽度为75的人脸是正常的,这个值是给出检测能力的下限。

        最小人脸和检测器性能息息相关。主要方面是速度,使用建议上,我们建议在应用范围内,这个值设定的越大越好。SeetaFace采用的是BindingBox Regresion的方式训练的检测器。如果最小人脸参数设置为80的话,从检测能力上,可以将原图缩小的原来的1/4,这样从计算复杂度上,能够比最小人脸设置为20时,提速到16倍。

        检测器阈值默认值是0.9,合理范围为[0, 1]。这个值一般不进行调整,除了用来处理一些极端情况。这个值设置的越小,漏检的概率越小,同时误检的概率会提高;

        可检测的图像最大宽度和可检测的图像最大高度是相关的设置,默认值都是2000。最大高度和宽度,是算法实际检测的高度。检测器是支持动态输入的,但是输入图像越大,计算所使用的内存越大、计算时间越长。如果不加以限制,一个超高分辨率的图片会轻易的把内存撑爆。这里的限制就是,当输入图片的宽或者高超过限度之后,会自动将图片缩小到限制的分辨率之内。

2. 关键点定位

        关键点定位,就是输入待检测的图片,和待检测的人脸位置,输出N个关键点的坐标(图片内)。

        这里需要强调说明一下,这里的关键点是指人脸上的关键位置的坐标,在一些表述中也将关键点称之为特征点,但是这个和人脸识别中提取的特征概念没有任何相关性。并不存在结论,关键点定位越多,人脸识别精度越高。

        一般的关键点定位和其他的基于人脸的分析是基于5点定位的。而且算法流程确定下来之后,只能使用5点定位。5点定位是后续算法的先验,并不能直接替换。从经验上来说,5点定位已经足够处理人脸识别或其他相关分析的精度需求,单纯增加关键点个数,只是增加方法的复杂度,并不对最终结果产生直接影响。

        SeetaFace6提供了2个关键点检测模型:

        face_landmarker_pts5.csta:5个关键点检测模型,这里检测到的5点坐标循序依次为,左眼中心、右眼中心、鼻尖、左嘴角和右嘴角。 注意这里的左右是基于图片内容的左右,并不是图片中人的左右,即左眼中心就是图片中左边的眼睛的中心。

        face_landmarker_pts68.csta:68个关键点检测模型,其坐标位置可以通过逐个打印出来进行区分。

        构造关键点定位器:

#include <seeta/FaceLandmarker.h>
seeta::FaceLandmarker *new_fl() {seeta::ModelSetting setting;setting.append("face_landmarker_pts5.csta");return new seeta::FaceLandmarker(setting);
}

        根据人脸检测关键点,并将坐标打印出来的代码如下:

#include <seeta/FaceLandmarker.h>
void mark(seeta::FaceLandmarker *fl, const SeetaImageData &image, const SeetaRect &face) {std::vector<SeetaPointF> points = fl->mark(image, face);for (auto &point : points) {std::cout << "[" << point.x << ", " << point.y << "]" << std::endl;}
}

3. 演示Demo

3.1 开发环境

  •  Seetaface6
  •  Visual Studio 2015
  •  Windows 10 Pro x64

3.2 功能介绍

        演示程序主界面如下图所示,包括获取参数、图片人脸检测+关键点定位、摄像头人脸检测+关键点定位等功能,其中关键点定位支持5点和68点两种模型。

        获取参数:初始化人脸检测模型,获取人脸模型的最小人脸、检测器阈值、可检测的图像最大宽度、最大高度、人脸检测器计算线程数等参数。

        图片人脸检测+关键点定位:读取一张人脸图片,进行人脸检测和关键点定位;结果显示在左侧(包括人脸框、关键点坐标)。

        摄像头人脸检测+关键点定位:启动摄像头,进行实时人脸检测和关键点定位演示,结果显示在左侧(包括人脸框、关键点坐标)。

3.3 下载地址

      开发环境:

  • Windows 10 pro x64
  • Visual Studio 2015
  • Seetaface6

        下载地址:  SeetaFace6人脸检测C++代码实现Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

burp靶场sql注入通关—下

第十一关&#xff08;布尔盲注&#xff09;&#xff1a; 1.根据提示修改包含 TrackingId cookie的请求&#xff0c;先抓包并修改这个值&#xff0c;在后面加上永真式发现出现Welcome back TrackingIdxxxx and 11 再修改这个值为永假式看看&#xff0c;发现没有Welcome back&am…

OpenNJet下载安装及入门实战教程

一、什么是OpenNJet OpenNJet是一款开放原子开源基金会孵化及运营的开源项目。OpenNJet采用C语言实现。是一款高性能、轻量级的WEB应用及代理软件。    OpenNJet 应用引擎是高性能、轻量级的WEB应用与代理软件。作为云原生服务网格的数据平面&#xff0c;NJet具备动态配置加载…

python数据分析所需要的语法基础

Python语言基础——语法基础 前言语法基础变量标识符数据类型输入与输出代码缩进与注释 总结 前言 对于学过C语言的人来说&#xff0c;python其实很简单。学过一种语言&#xff0c;学习另一种语言&#xff0c;很显然的能感觉到&#xff0c;语言大体上都是相通的。当然&#xf…

企业微信hook接口协议,ipad协议http,客户群发送任务,获取要发送的客户群列表

客户群发送任务&#xff0c;获取要发送的客户群列表 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid": "1688853790533324","id":1101292747044333637, //群发任务id"keyword…

3.栈和队列(汇总版)

目录 1.栈&#xff08;一端插和删&#xff09; 2.队列&#xff08;一端插另一段删&#xff09; 2.1队列的概念及结构 2.2 队列的实现 队列的接口 1.初始化队列 2.销毁队列 3.插入元素 4.出队列&#xff08;头删&#xff09; 5.访问对头 6.访问队尾 7.判断队列是否为…

CMakeLists.txt语法规则:foreach循环的关键字

一. 简介 前一篇文章学习了 CMakeLists.txt语法中 foreach循环的基本用法。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;foreach 循环基本用法-CSDN博客 本文继续 CMakeLists.txt语法中 foreach循环语句&#xff0c;主要学习 foreach循环中的关键字。 二. CM…

Android 官网Ota介绍

构建 OTA 软件包 | Android 开源项目 | Android Open Source Project

(网络初识)

网络发展史 独立模式 在最开始计算机被发明出来&#xff0c;但网络还未普及的情况下&#xff0c;每个计算机之间都是相互独立的&#xff1a; 假设现在有一份数据需要处理&#xff0c;然后这份数据的处理又分给三个人分别处理。假设小松处理进行第一部分的处理&#xff0c;当小…

Skywalking的重要功能详解

学习本篇文章之前首先要了解一下Sky walking的基础知识 分布式链路追踪工具Sky walking详解 一&#xff0c;Sky walking监控数据库 在admin服务中&#xff0c;连接数据库查询user表中所有数据 引入依赖 <dependency><groupId>mysql</groupId><artifactI…

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们都知道&#xff0c;嵌入式应用一般都是为了某一个特定应用而存在的。也就是说&#xff0c;和pc不同&#xff0c;这个嵌入式板子一般都是为了解…

多组间比较散点图+误差棒(自备)

目录 数据 计算四分位值 作图 数据 rm(list ls()) library(ggplot2) library(dplyr) library(ggpubr) library(reshape2) library(tidyverse)data <- iris##鸢尾花数据集 dat <- data[,c(5,1)]#单个数据进行分析 计算四分位值 #根据分组计算四分位及中位数 dat1 …

使用Docker安装Redis

大家好&#xff0c;今天给大家分享一下如何使用docker安装Redis&#xff0c;关于docker的安装和常用命令&#xff0c;大家可以参考下面两篇文章&#xff0c;本文中不做过多描述。 Docker在Windows与CentOS上的安装 Docker常用命令 关于Redis的介绍与常用操作可以参考&#x…

中国科技大航海时代,“掘金”一带一路

文&#xff5c;白 鸽 编&#xff5c;王一粟 “这不就是90年代的内地吗&#xff1f;” 在深度考察完沙特市场后&#xff0c;华盛集团联合创始人兼CEO张霆对镜相工作室感慨道。 在张霆看来&#xff0c;沙特落后的基建&#xff08;意味着大量创新空间&#xff09;、刚刚开放…

AHB---数据总线

1. 数据总线 为了实现AHB系统&#xff0c;需要独立的读写数据总线。虽然推荐的最小数据总线宽度被指定为32位&#xff0c;但这可以根据数据总线宽度进行更改。 数据总线包含以下部分&#xff1a; HWDATAHRDATAEndianness&#xff08;字节序&#xff09; 1.1 HWDATA 在写传输…

【革命启示录】Spring框架:Java开发的“核聚变”能量源!

Hello&#xff0c;我是阿佑&#xff0c;今天给大家整的活是 《Java开发的“核聚变”能量源》 文章目录 Spring框架原理详解一、引言简介目的特点例子 二、背景介绍问题解决方案例子 三、核心概念3.1 控制反转&#xff08;Inversion of Control, IoC&#xff09;定义实现例子与代…

Sarcasm detection论文解析 |基于情感背景和个人表达习惯的有效讽刺检测方法

论文地址 论文地址&#xff1a;https://link.springer.com/article/10.1007/s12559-021-09832-x#/ 论文首页 笔记框架 基于情感背景和个人表达习惯的有效讽刺检测方法 &#x1f4c5;出版年份:2022 &#x1f4d6;出版期刊:Cognitive Computation &#x1f4c8;影响因子:5.4 &…

【python】基础语法

目录 一.注释和常见规则 二.变量及类型 1.数据类型 2.Numbers数字数据类型 3. 字符串类型 &#xff08;1&#xff09;字符串访问 &#xff08;2&#xff09;字符串拼接 4.List&#xff08;列表&#xff09;类型 &#xff08;1&#xff09; 定义 &#xff08;2&#…

【Linux】yum

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 觉得本片文章写的还不错的可以&#x1f44d;点赞&#x1f44d;、&#x1f31f;收藏&#x1f31f;、&#x1f4dd;…

Golang | Leetcode Golang题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; func simplifyPath(path string) string {stack : []string{}for _, name : range strings.Split(path, "/") {if name ".." {if len(stack) > 0 {stack stack[:len(stack)-1]}} else if name ! "" &am…

在uniapp里面使用 mp-html 并且开启 latex 功能

在uniapp里面使用 mp-html 并且开启 latex 功能 默认情况下 mp-html 是不会开启 latex 功能的, 如果需要开启 latex 功能是需要到代码操作拉取代码自行打包的。 这里说一下 mp-html 里面的 latex 功能是由 https://github.com/rojer95/katex-mini 提供的技术实现&#xff0c;…