人脸跟踪开源项目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 ...
随机推荐
- Python 模拟伯努利试验和二项分布
1.模拟 27 次投掷硬币的伯努利试验 代码: from scipy import stats import numpy as np p = 0.5 # 生成冻结分布函数 bernoulliDist ...
- dubbo-zookeeper demo解析图
- WebForm 打开默认页
原文:https://www.cnblogs.com/lionden/p/3728716.html <configuration> <system.webServer> < ...
- 【神奇性质】【P5523】D [yLOI2019] 珍珠
D [yLOI2019] 珍珠 Description 给定一个 deque,要求支持 push_back 和 push_front 操作,并且查询前缀与非和以及后缀与非和. deque中只会有 \( ...
- Cookie、token、session的区别是什么?
背景: 最近在总结一些容易理解混淆的概念,之前面试的时候提到过,我觉得也说不清楚,这两天项目做接口测试发现用的cookie而不是之前的token,于是总结一下,便于以后用到的时候再阅读以及分享给需要的 ...
- JVM系列之一:JVM架构
1.简介 Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库. JVM是Java Virtual Machine(Java虚拟机)的缩 ...
- 一些精简的JavaScript代码集合
日历 创建过去七天的数组,如果将代码中的减号换成加号,你将得到未来7天的数组集合 // 创建过去七天的数组 [...Array(7).keys()].map(days => new Date(D ...
- .net core使用AutoMapper
AutoMapper文档:http://docs.automapper.org/en/stable/The-MyGet-build.html 新的版本抛弃了静态API方法,我们将使用依赖注入来完成. ...
- Maven 教程(19)— Maven的六类属性
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79776666 内置属性 主要有两个常用内置属性:${basedir}项目的根目录 ...
- 关于JavaSE程序的小总结(不分先后顺序 后续继续补充)
统计字符串中某个字符串出现的次数 package com.jiang.demo01; public class Demo01 { public static void main(String[] ar ...