SeetaFace开源引擎GitHub地址:https://github.com/seetaface/SeetaFaceEngine
SeetaFace2开源引擎GitHub地址:https://github.com/seetafaceengine/SeetaFace2
本文是使用VS2017+QT5.11.2+SeetaFace/SeetaFace2的简单实现,涉及该开源引擎的概念较少。SeetaFace1.0例子项目地址:https://github.com/coididy/simple-example-with-SeetaFace1.0

一、1.0版本和2.0版本简介:

    SeetaFace人脸识别引擎包括了搭建一套全自动人脸识别系统所需的三个核心模块,即:人脸检测模块、面部关键点定位模块,以及人脸特征提取与比对模块。
  • 1.0版本中与之对应的分别是:FaceDetection、FaceAlignment、FaceIdentification;
  • 2.0版本中与之对应的分别是:FaceDetector、FaceLandmarker、FaceRecognizer,另外2.0版本还提供了两个辅助模块 FaceTracker 和 QualityAssessor用于人脸跟踪和质量评估。除此之外,2.0版本还引入了一个FaceDataBase对象,用于管理注册的人脸库,方便进行1v1或者1vN的人脸比对。
    两个版本的SeetaFace在速度和精度上都有数量级上的提升,以下是官方给的一张对比图:

二、SeetaFace1.0的编译

    1.0版本的SeetaFace编译教程在百度很多,大部分都是可以直接参考的,此处不再赘述。需要VS2017版的dll、lib的可以到项目地址中下载。https://github.com/coididy/simple-example-with-SeetaFace1.0

三、SeetaFace2.0的编译

    该部分参考https://blog.csdn.net/sinat_33896833/article/details/100183581,使用CMake进行编译。
    需要VS2017版的dll、lib的可以到项目地址中下载。https://github.com/coididy/simple-example-with-SeetaFace2.0
1、下载安装CMake
2、下载SeetaFace2.0源代码:https://github.com/seetafaceengine/SeetaFace2
3、创建一个空文件夹,用于存储编译结果:如下创建了一个空的build文件夹
注意:相关目录不建议有中文
4、打开CMake gui,配置源代码目录和编译输出目录如下:
5、点击CMake左下角的Configure按钮选择需要编译的项目版本,此处我选择VS2017对应的版本:
6、如果出现找不到OpenCV的路径,则手动配置如下路径:
    OpenCV路径配置好之后,再次点击Configure直到无错误为止。
7、点击Generate按钮生成解决方案
8、此时build目录已经生成了SeetaFace2.0项目对应的VS2017 sln解决方案,双击即可打开。或者直接点击CMake 上Generate按钮右侧的Open Project按钮打开项目。
注意:相关目录不建议有中文
9、项目打开之后,选择需要的debug或者release版本
10、右键解决方案中的ALL_BUILD,点击生成,即可得到相应的dll和lib
11、dll、lib目录如下:

四、VS2017+OpenCV+SeetaFace1.0项目属性配置

    关于SeetaFace1.0的动态链接库等的配置可以参考SeetaFace2.0的配置,两者基本没区别。

五、VS2017+OpenCV+SeetaFace2.0项目属性配置

    以debug版本为例,VS2017的项目属性配置如下:
1、将需要的头文件从源代码中提取出来,方便项目中使用。我的目录如下:
2、将用到的lib文件提取出来,我的目录如下:
3、项目属性->VC++目录->包含目录:(配置OpenCV和SeetaFace头文件目录)
4、项目属性->VC++目录->库目录:
5、链接器->输入->附加依赖项:
6、将用到的dll文件放置到debug版本生成的exe同级目录下:
7、对于release版本,配置方法与debug一致,只需要把相应的dll、lib特换一下就行。(*-d.dll、*-d.lib是debug版的;*.dll、*.lib是release版的)

六、SeetaFace1.0实例

    VS2017、QT、OpenCV、SeetaFace1.0版本的实例可以参考博客:https://blog.csdn.net/Young__Fan/article/details/81385612
    本人也实现了一个简单的例子,可以进行图片中人脸的检测、人脸特征点(5点)的定位显示、两张人脸的相似度显示。

七、SeetaFace2.0实例

    功能与SeetaFace1.0一致,项目地址如下:
    下面简单介绍下本人项目代码。
1、首先拷贝一份SeetaFace2.0使用的model
2、简单界面:
3、人脸检测与人脸特征点定位模型导入与初始化
seeta::ModelSetting::Device device = seeta::ModelSetting::CPU;
//初始化模型,需要注意的是,模型文件同一时刻只能打开一次,
//并且加载模型时需要一定的时间,
//所以如果想多线程使用,需要对模型的导入进行加锁处理
this->myMutex.lock();
seeta::ModelSetting FD_model("./model/fd_2_00.dat", device, 0);
//关于81点定位之后,得到的人脸相似度结果不理想的原因猜想:
//图片的尺寸太小,导致81点都挤在了一起,然后进行人脸比对时误差变大
//seeta::ModelSetting FL_model("./model/pd_2_00_pts81.dat", device, 0);
seeta::ModelSetting FL_model("./model/pd_2_00_pts5.dat", device, 0);
this->myMutex.unlock();
seeta::FaceDetector FD(FD_model);
seeta::FaceLandmarker FL(FL_model);
//设置人脸框的最小尺寸,不能小于20
FD.set(seeta::v2::FaceDetector::PROPERTY_MIN_FACE_SIZE, 20);

  

 
 
4、人脸比对模型的导入与初始化
seeta::FaceDatabase* FDB;
FDB = new seeta::FaceDatabase(seeta::ModelSetting("./model/fr_2_10.dat", seeta::ModelSetting::CPU, 0));
//清除之前导入的人脸
this->FDB->Clear();

 

 
 
    注意:此处我使用的人脸比对方法是2.0版本中单独引入的一种方法。FaceDataBase对象,用于管理注册的人脸库,方便进行1v1或者1vN的人脸比对。但是在使用过程中,需要注意适时的清除DB中的face。具体什么时候清除,我没怎么研究。
5、使用FaceRecognizer进行人脸比对的方法:
6、人脸检测、人脸特征点提取、人脸比对的核心代码如下:
//加载待检测的图片;
//mat是传入的cv::Mat类型的图片
seeta::cv::ImageData image = mat.clone();
//进行人脸检测,获取所有的人脸信息;
//FD是FaceDetector对象的实例
//SeetaFaceInfoArray是SeetaFaceInfo数组
//该数组中存储的是检测出的人脸框
SeetaFaceInfoArray facesArr = FD.detect(image);
//对该脸进行5点或81点定位
//FL是FaceLandmarker对象实例
//vector<SeetaPointF>是二维特征点的数组
std::vector<SeetaPointF> currentFace81Points = FL.mark(image, facesArr.data[i].pos);
//Compare的四个参数分别为:
//SeetaImageData类型的图片,SeetaPointF*类型的特征点数组
FDB->Compare(face1Data, face1Points.data(), face2Data, face2Points.data());

  

 
7、更加详细的接口介绍,可以参考:
 
 
 
 

VS2017+QT5.11.2+SeetaFace1.0/SeetaFace2.0的简单实现的更多相关文章

  1. Windows7 + OSG3.6 + VS2017 + Qt5.11

    一.准备工作 下载需要的材料: 1. OSG稳定版源代码, 3.6.3版本 2. 第三方库,选择VS2017对应的版本  https://download.osgvisual.org/3rdParty ...

  2. qt5.11.2+vs2017环境下配置pcl1.8.1以及第三方依赖库vtk的编译

    1.准备工作 我所用的开发环境是win10下的qt5.11.2配置了vs2017的编译器,根据自己所用的VS的版本去官网下载对应版本的pcl库,如下 PCL-1.8.1-AllInOne-msvc20 ...

  3. 关于本电脑qt5.11+vs2017+opencv3.4的配置问题

    本人想用qt5.11+vs2017+opencv3.4开发程序,配置了很久才成功,现在把配置后的环境变量记录一下,以供自己以后参考,同时也供大家参考. qt5.11+vs2017+opencv3.4的 ...

  4. Oracle Database 11g Release 2(11.2.0.3.0) RAC On Redhat Linux 5.8 Using Vmware Workstation 9.0

    一,简介 二,配置虚拟机 1,创建虚拟机 (1)添加三块儿网卡:   主节点 二节点 eth0:    公网  192.168.1.20/24   NAT eth0:    公网  192.168.1 ...

  5. Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)

    Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8) 本次演示为升级oracle rac数据库,用GI的psu升级,从11.2.0.4.0升级到11.2.0.4.8 ...

  6. uninstall 11.2.0.3.0 grid & database in linux 5.7

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  7. maven 的 oracle的Missing artifact com.oracle:******:jar:11.2.0.2.0

    解决方法: 下载ojdbc6对应版本号的包.把下载的包放到: 然后dos命令: -Dpackaging=jar -Dfile=ojdbc6.jar 主:必须确保已经配置了你maven,如何配置mave ...

  8. 单机Oracle+asm(11.2.0.3.0) Patch Set Update(11.2.0.3.7 )

    之前写过一篇关于PSU升级的案例,参考如下: http://blog.csdn.net/jyjxs/article/details/8983880 但是,感觉有些地方理解的不是很透彻明白,照猫画虎的比 ...

  9. hive 0.10 0.11新增特性综述

    我们的hive版本升迁经历了0.7.1 -> 0.8.1 -> 0.9.0,并且线上shark所依赖的hive版本也停留在0.9.0上,在这些版本上有我们自己的bug fix patch和 ...

随机推荐

  1. android 数据存储----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...

  2. C# 从零开始写 SharpDx 应用 画三角

    原文:C# 从零开始写 SharpDx 应用 画三角 版权声明:博客已迁移到 https://blog.lindexi.com 欢迎访问.如果当前博客图片看不到,请到 https://blog.lin ...

  3. C++中文本的读入

    读入文本文件 标准库包含逐行读取文本文件的功能.然后,你可以一次一行地解析文本文件的每一行. 比如说,你有文件,其中使用数字和逗号表示一个 3x4 的矩阵: , , , 10.5 , , , , , ...

  4. CRT (C run-time library)

    一 产生 运行时库是程序在运行时所需要的库文件,通常以LIB或DLL形式提供. C运行时库就是C run-time library,诞生于20世纪70年代,是C而非C++语言世界的概念,C程序运行时需 ...

  5. H3C 电路交换连接模型

  6. Android Animation动画详解(一): 补间动画

    前言 你有没有被一些APP中惊艳的动画效果震撼过,有没有去思考,甚至研究过这些动画是如何实现的呢? 啥?你没有思考,更没有研究过? 好吧,那跟着我一起来学习下如何去实现APP中那些让我们惊羡的动画特效 ...

  7. hihocoder 1272 买零食

    #1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...

  8. Codeforces Round #167 (Div. 1 + Div. 2)

    C. Dima and Staircase 线段树维护区间最大值. D. Dima and Two Sequences 由于模数不一定为质数,所以通过拆分质因数来做阶乘取模. E. Dima and ...

  9. 用diiv实现多个方块居中嵌套--padding

    文章地址 https://www.cnblogs.com/sandraryan/ 案例:用diiv嵌套多个正方形,配合盒模型相关知识,使每个div在他的父元素上居中.(每个div中心点对齐) 涉及到m ...

  10. java 集合类 & 容器

    为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合类同是容器,有何不同? 数组虽然也可以存储 ...