人脸跟踪开源项目HyperFT代码算法解析及改进
一、简介
人脸识别已经成为计算机视觉领域中最热门的应用之一,其中,人脸信息处理的第一个环节便是人脸检测和人脸跟踪。人脸检测是指在输入的图像中确定所有人脸的位置、大小和姿势的过程。人脸跟踪是指在图像序列中确定各帧间人脸的对应关系的过程,即确定每个人脸的运动轨迹及其大小变化的过程。
人脸跟踪最初的应用源于人类识别。人脸识别是指将输入的人脸图像与已知人脸库中的模型进行比较,以确定是否存在相匹配的人脸。随着近几年信息化进程日益加快,安全认证系列应用的涌现,这使得高度自动化的人脸识别系统的研究成为一个热点。以往大多数系统要求被识别者固定在摄像机前的某一位置, 十分不便,且在某些场合如监控领域也无法实现。如何基于视频,在复杂背景中直接检测、定位运动的人脸,并加以识别,这一问题迫切需要得到解决。
二、HyperFT
这是一个移动端快速视频多人脸跟踪的开源项目,项目是基于mtcnn人脸检测加上简单的模板匹配进行人脸跟踪,算法简单但效果显著,移动端速度可达150帧以上,该项目的优点是可实现多人脸跟踪。
github地址:https://github.com/zeusees/HyperFT
三、代码算法解析
HyperFT项目的多人脸跟踪算法分为三大部分:
第一部分是初始化。通过mtcnn的人脸检测找出第一帧的人脸位置,然后根据结果对人脸跟踪进行初始化;
第二部分是更新。首先利用模板匹配进行人脸目标位置的初步预判,再结合mtcnn中的onet对人脸位置进行更加精细的定位,最后通过mtcnn中的rnet的置信度来判断跟踪目标是否为人脸,防止当有手从面前慢慢挥过时,框会跟着手走,导致无法跟踪到真正的人脸;
第三部分是定时检测。通过在更新的部分中加入一个定时器来做定时人脸检测,从而判断中途是否有新的人脸加入,本项目在定时人脸检测中使用了一个trick——就是将已跟踪的人脸所在位置利用蒙版遮蔽起来,避免了人脸检测的重复进行,从而减少其计算量,提高了检测速度。
四、算法改进的思路
HyperFT项目是在当前已实现多人脸跟踪的开源项目中取得显著效果的项目之一,其优点是人脸跟踪速度快且可以进行对多个人脸的跟踪。由于使用的算法是基于mtcnn和模板匹配实现的,在进行多人脸跟踪时有一定的局限性,所以算法仍存在一定的可提升空间。
1、替换人脸检测模型:可将mtcnn的人脸检测模型替换成yufacedetectnet和RetinaFace等模型,人脸检测的时间即可不受人脸数量的影响。
2、替换目标跟踪算法:可将模板匹配算法替换成TLD和光流法等跟踪算法,相比于模板匹配,跟踪速度有一定的提升。
五、项目中加入五个关键点跟踪的实践
1、在HyperFT项目中的Face类中仅定义了人脸矩形的变量,如若需要加入五个关键点的跟踪则需要在Face类中需要定义一个Bbox类的faceBbox,这样Face即能保存人脸位置又能保存人脸关键点。
2、在原来的doingLandmark_onet函数的基础上重载函数,将传入的std::vector<cv::Point> &pts改为传入Bbox& faceBbox。
3、在tracking函数中修改doingLandmark_onet函数的调用
4、通过人脸跟踪中Face类中的faceBbox即可获得人脸的位置及其五个人脸关键点(main.cpp)
改进后的项目->GitHub地址:https://github.com/qaz734913414/Ncnn_FaceTrack
zeusee.com 智云视图
人脸跟踪开源项目HyperFT代码算法解析及改进的更多相关文章
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- 计算机视觉人脸相关开源项目总结:face_recognition
计算机视觉人脸相关开源项目总结 https://github.com/ageitgey/face_recognition 深度学习人脸关键点检测方法----综述
- Python优秀开源项目Rich源码解析
这篇文章对优秀的开源项目Rich的源码进行解析,OMG,盘他.为什么建议阅读源码,有两个原因,第一,单纯学语言很难在实践中灵活应用,通过阅读源码可以看到每个知识点的运用场景,印象会更深,以后写代码的时 ...
- 如何将开源项目部分代码作为private放在github上?
很多时候,你的一些项目本身都是开源的,但是基于该开源项目,你可能做了部分更有价值的工作,或者由于其他原因,你不希望将这部分代码放到public上,那么有以下简单方法: 1. 创建一个private b ...
- Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库
一.依赖注入DI 通过依赖注入降低View.服务.资源简化初始化.事件绑定等反复繁琐工作 AndroidAnnotations(Code Diet) android高速开发框架 项目地址:https: ...
- Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码
前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...
- 开源项目kcws代码分析--基于深度学习的分词技术
http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi ...
随机推荐
- django使用pycharm目录打开不正确导致的问题
1.在目录D:\software\pycharmpython\djangoProject下新建helloworld的项目:django-admin startproject helloworld 2. ...
- Hello,DTOS!(上)
主引导程序是软件还是固件?如果是软件,那么由谁开发?如何开发?主引导程序是软件.因为它不是固化于硬件当中的,并不是在出厂之前已经烧到硬件里面去了.因此它必然是软件.既然是软件,那是谁来开发它呢?就目前 ...
- 05-cmake语法-message()
输出错误 message(FATAL_ERROR " FATAL: In-source builds are not allowed. You should create a separat ...
- idea启动java项目,使用调试会占用更多内存
idea启动java项目,使用调试会占用更多内存
- 30-ESP8266 SDK开发基础入门篇--SPI
这节只是做记录, 整个的教程呢,重新整理下 教程有点乱,需要再细分一下 这节只是做一下我使用其SPI的记录 还是老样子,看人家LUA源码里面怎么使用的 注意哈,对于8266 SDK的学习我还是建议大家 ...
- NOIP2013-2014提高组题目浅析
1.前言 迎接NOIP的到来...在这段闲暇时间,决定刷刷水题.这里只是作非常简单的一些总结. 2.NOIP2014 <1> 生活大爆炸之石头剪刀布(模拟) 这是一道考你会不会编程的题目. ...
- 基环树DP
基环树DP Page1:问题 啥是基环树?就是在一棵树上增加一条边. Page2:基环树的几种情况 无向 有向:基环外向树,基环内向树. Page3:处理问题的基本方式 1.断环成树 2.分别处理树和 ...
- ##ant 打包apk
ant 打包apk 1. 参考: Android Ant 批量多渠道打包实例 单个渠道类似操作,只不过不用修改build.xml文件 2. 修改ant debug的包签名,使用和release版本相同 ...
- concurrent(三)互斥锁ReentrantLock & 源码分析
参考文档:Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock:http://www.cnblogs.com/skywang12345/p/3496101.html Reentr ...
- Redis 动态字符串 SDS 源码解析
本文作者: Pushy 本文链接: http://pushy.site/2019/12/21/redis-sds/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可 ...