大家都嫌公司以前使用的刷卡门禁太麻烦,正好借这个机会开发一个人脸识别的门禁系统,采用的SDK是虹软公司开发的,接口调用比较简单。

一、虹软SDK接口性能

在配置为i5-7400 、16G内存的PC上测试性能如下:

1.FT 单次3ms左右

2.FD 单次10ms左右

3.FR 单次170ms左右
二、业务层需要解决的问题

1.FT和FR单次性能相差较大,速度不匹配

2.FT支持多人脸,单次检测人脸较多,而FR只支持单人脸

3.视频帧单次处理可能会超过帧间隔时间

三、优化方案

人脸识别过程包括三个步骤,检测人脸、人脸特征提取、特征匹配,以人脸识别的门禁系统为例,主要步骤获取视频帧、检

测视频帧人脸、提取特征、特征匹配,门禁系统对于实时性要求比较高。

流程图大概如下:

下面说下开发过程中多线程方面的优化点。

1. 获取视频帧

摄像头视频的帧率正常在25~30帧左右,并且一般的视频帧的分辨率为1280x720,当然有的摄像头可以达到更大的分辨率,

但是经过测试多款摄像头,发现分辨率设置过大会导致获取视频帧的过程中卡顿。并且分辨率适中,会提升后面的FT的速度。获取视频帧的操作是在主线程进行的。

lock_guard<std::mutex> locker(g_CameraMutex);if (m_camera->getFrame(m_curFrame))
{
return;
}ftProcessor->faceDetect(m_curFrame, m_resizeImage);

  

2. 人脸识别处理优化

采用了获取视频帧和FT串行的方式,需要保证从获取视频帧一直到处理完成,必须在帧间隔时间内(帧率为25时,在40ms左右),否则可能会出现卡帧的情况。经测试,获取视频帧和FT串行的单次时间在帧间隔时间内,因此采用串行的方式。
FT支持多人脸检测,我将检测最大人脸数设置为5,所以在极限状态下,人数较多的话,待识别的人数可能一直维持在5人,这就需要提高FR的有效识别率。

FR使用了一个自定义threadsafe_queue简化多线程数据同步操作,在FT中将需要进行FR的人脸框以及对应的视频帧和人脸框的trackid push_back到threadsafe_queue中,FR线程从中取人脸框信息和视频帧,做提取特征和特征匹配处理。

![](https://oscimg.oschina.net/oscnet/07c6d7e96b3f93039e5a56edefee1c2b27f.jpg)

我从以下几个点优化人脸识别效率:

a.增加FR线程数量。
对于我来说,开线程池的方式可行性并不太高。首先机器的内核数限制的线程数,动态增加线程数听起来不错,但是门禁使用的一体机毕竟跟开发机器不一样,性能限制太多,并且线程切换和数据同步都会更加复杂。但是为了提高FR的识别速度,我最终开了两个FR线程,经测试,在i5-7400T 8G内存 配置的机器上,CPU大概处于40%左右。

b.提高FR识别效率
优化FR识别效率要求FR做到每次识别都是有效的,也就是说FR不做垃圾帧的处理。

1)每次在获取到人脸后,判断是否与前一帧检测到的人脸结果属于同一个人(通过trackid判定,这一部分留到后面的文章说明,敬请期待)。如果某个人脸框首次出现,或者如果某个trackid对应的人脸框仍未识别成功,都需要做FR操作。

![](https://oscimg.oschina.net/oscnet/4c63cf8ee2a9f18c2dc83249aae61ecb3a3.jpg)

case FTSucceed:
case FRFailed:
{
newFaceInfo.faceStatus = FRWaiting;
FRParam frParam = { 0 };
frParam.curImageInfo = m_curImageInfo;
frParam.faceInfo.faceOrient = newFaceInfo.faceOrient;
frParam.faceInfo.faceRect = {
newFaceInfo.faceRect.wleft,
newFaceInfo.faceRect.wtop,
newFaceInfo.faceRect.wright,
newFaceInfo.faceRect.wbottom };frParam.trackid = newFaceInfo.trackid;m_frParamsQueue.push(frParam);
}

  

当某个trackid对应的人脸已经在等待或者在做FR的时候,在后面检测到的该trackid对应人脸将不再做FR,一直到FR检测结果出来以后,再做处理。

case FRProcessing:
case FRWaiting:
{
//default color
}
break;

  

2)识别成功后,同样将该trackid所对应的人脸都设置为识别到的人,这样下次就不需要再次做FR,不会浪费FR的时间片。
3)每次在从threadsafe_queue获取的待处理的人脸框、trackid和视频帧时,都检测该trackid是否已消失,如果消失,就不做FR,因为拿到的结果毫无用处,直接丢弃。

std::lock_guard<std::mutex> locker(m_faceInfoListMutex);
//找到对应的trackid 对应的人脸,设置为FRProcessing
auto iter = find_if(m_prevFacesRes.begin(), m_prevFacesRes.end(), [=](const FaceInfo& lhs)
{
return lhs.trackid == frParam.trackid;
});if (iter != m_prevFacesRes.end())
{
iter->faceStatus = FRProcessing;
}
else
{
//找不到 就不用做FR了
continue;
}

  

`

好了,这次就说到这,大家有什么问题的话,可以留言,谢谢。
参考链接:
1.trackid 介绍:https://www.jianshu.com/p/4ae90634a79e

转载于:https://www.cnblogs.com/Zzz-/p/10837896.html

虹软AI 人脸识别SDK接入 — 性能优化篇(多线程)相关推荐

  1. 虹软人脸识别SDK接入Milvus实现海量人脸快速检索

    虹软人脸识别SDK接入Milvus实现海量人脸快速检索 背景 虹软SDK及Milvus简介 开发环境 虹软人脸识别SDK使用简介 Milvus环境搭建 快速检索实现 人脸识别流程简介 快速检索 虹软S ...

  2. 如何接入虹软免费人脸识别SDK

    背景: 虹软的人脸识别还是不错的,在官方注册一个账号,成为开发者,下载SDK的jar包,在开发者中心,找一个demo就可以开始做了,安装里边的逻辑,先看理解代码,然后就可以控制代码,完成自己想要的功能 ...

  3. java 基于虹软离线人脸识别SDK 2.0 最新版

    虹软人脸识别SDK之Java版,支持SDK 1.1+,以及当前最新版本2.0,滴滴,抓紧上车! JDK SDK Win release license status 前言 由于业务需求,最近跟人脸识别 ...

  4. 虹软android实现人脸比对,[Android]虹软arcface人脸识别SDK引擎使用总结

    虹软开放了人脸识别的SDK引擎(免费的哦),刚好有Android版的,就体验了一波.下面来说说Android版的SDK使用心得: ArcFace 虹软人脸认知引擎简介 目前开放的版本有人脸比对(1:1 ...

  5. 虹软免费人脸识别SDK注册指南

    2019独角兽企业重金招聘Python工程师标准>>> 成为开发者 三步完成账号的基本注册与认证: STEP1:点击注册虹软AI开放平台右上角注册选项,完成注册流程. STEP2:首 ...

  6. 基于Android虹软免费人脸识别 SDK开发

    目前我们的应用内使用了 ArcFace 的人脸检测功能,其他的我们并不了解,所以这里就和大家分享一下我们的集成过程和一些使用心得 集成 ArcFace FD 的集成过程非常简单 在 ArcFace F ...

  7. SpringBoot 基于向量搜索引擎及虹软人脸识别SDK的大规模人脸搜索

    SpringBoot 基于向量搜索引擎及虹软人脸识别SDK的大规模向量数据搜索 文章目录 SpringBoot 基于向量搜索引擎及虹软人脸识别SDK的大规模向量数据搜索 在线环境demo 在线环境说明 ...

  8. 关于虹软人脸识别SDK的接入

    背景: 虹软的人脸识别还是不错的,在官方注册一个账号,成为开发者,下载SDK的jar包,在开发者中心,找一个demo就可以开始做了,安装里边的逻辑,先看理解代码,然后就可以控制代码,完成自己想要的功能 ...

  9. java人脸识别sdk,关于虹软人脸识别SDK的接入

    背景: 虹软的人脸识别还是不错的,在官方注册一个账号,成为开发者,下载SDK的jar包,在开发者中心,找一个demo就可以开始做了,安装里边的逻辑,先看理解代码,然后就可以控制代码,完成自己想要的功能 ...

最新文章

  1. 【 FPGA 】UltraFast设计方法学:时序收敛之时序约束基本准则
  2. python计算结果传给spark_将Python函数作为对象传递给Spark
  3. 有关short与int的重载[jase基础]
  4. P6855-「EZEC-4.5」走方格【dp】
  5. java线程的创建与执行_Java多线程的创建和运行
  6. 见贤思齐,正式开启源码之旅
  7. 计算机英语拼读法,常用计算机英语词汇:CPU
  8. 在RK3066/RK3188电视棒上安装ubuntu(MK802III/MK808B/MK809/MK908/UG802/QC802
  9. 测试第一步,雀氏纸尿裤
  10. [我也GitHub]我很焦虑, 我很暴躁!
  11. 资产新增ccid的问题
  12. WebDAV之葫芦儿·派盘+小书匠
  13. 并行传输数据和串行传输数据_计算机系统中的并行处理和数据传输模式
  14. private和protected的区别_学习笔记
  15. 祝女生节快乐的c语言,女生节祝福语:3月7日女生节到了,祝福送给娇滴滴的你...
  16. ios使用SARUnArchiveANY 解压rar文件(oc和swift版本)
  17. 调查发现:手机竟然比马桶垫还脏
  18. 推荐系统-模型(一):召回模型【协同过滤类: ItemCF/UserCF】【Embedding类】【Dssm/双塔/word2vec】【图类召回算法 (Deepwalk、EGES)】
  19. ulua中lua代码使用反射调用c#详解
  20. 1071 小赌怡情 (15 分) (C语言)

热门文章

  1. element-ui下拉框使用value绑定id
  2. mysql索引动态维护_MySQL之——索引
  3. app闪退后重启_安卓APP崩溃(crash)后重新启动,捕获全局异常重启APP
  4. element-ui表格数据样式及格式化
  5. layUI table 按条件搜索 结果整个页面刷新
  6. Java Unable to load library ‘gsdll64‘: 报错,解决方案
  7. 【代码源 Div1#103】子串的最大差 Codeforces - 817D,力扣2104,1900分
  8. php 实现资料下载功能,学习猿地-php如何实现下载功能
  9. 五角星是不是旋转对称图形_新部编二年级下册数学第10单元总复习教案,克和千克、图形的运动...
  10. python图片识别训练汽车_python实现图片识别汽车功能