人脸跟踪开源项目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 ...
随机推荐
- Leetcode周赛165
目录 找出井字棋的获胜者 思路 代码 不浪费原料的汉堡制作方案 思路 代码 统计全为 1 的正方形子矩阵 思路 代码 分割回文串 III 思路 代码 找出井字棋的获胜者 思路 模拟. 代码 class ...
- axios get及post方法代码示例&&方法封装
axios get及post方法代码示例 get方法: show: function(){ //get方式 //赋值给变量self var self = this; var url = "h ...
- MongoDB基础知识与常用命令
SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行/文档 col ...
- 学习-jdk8 特性
jdk8新特性 Lambda 表达式 Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中.方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构 ...
- IIS 登录失败 该登陆名来自不受信任的域,不能与windows身份认证一起使用
原文:https://blog.csdn.net/hhw199112/article/details/80234462 错误: 登录失败 该登陆名来自不受信任的域,不能与windows身份认证一起使用 ...
- Django Flatpage设置
参考链接:https://docs.djangoproject.com/en/1.11/ref/contrib/flatpages/ 知识点: 通过django.site数据库记录表,对应域名和请求站 ...
- GPG实践
遇见的问题 安装之后没有显示如教程中的 直接提示真实姓名于电子邮件的地址 公钥与密钥 设置吊销证书
- 1-5docker私有镜像仓库
1.简单操作 1.在 https://cloud.docker.com 免费注册一个 Docker 账号 2.登录 docker login #命令登录 Docker Hub. 3.注销 docker ...
- Postman接口测试【3】_自动添加随笔
一.抓取博客园编写博客地址 1.通过Charles抓取,获取到编写博客接口地址和接口的参数 二.Postman请求接口 打开Postman,输入上面抓到的接口地址,接口类型为POST,请求参数为x-w ...
- PHP发送邮箱的方法smtp方法
PHP发送邮箱的方法 采用的smtp方式首先进入163邮箱 设置 POP3/SMTP服务打勾 然后会提示你设置授权密码就是SMTP服务器的用户密码smtp.php文件代码<pre>< ...