一、简介

人脸识别已经成为计算机视觉领域中最热门的应用之一,其中,人脸信息处理的第一个环节便是人脸检测和人脸跟踪。人脸检测是指在输入的图像中确定所有人脸的位置、大小和姿势的过程。人脸跟踪是指在图像序列中确定各帧间人脸的对应关系的过程,即确定每个人脸的运动轨迹及其大小变化的过程。

人脸跟踪最初的应用源于人类识别。人脸识别是指将输入的人脸图像与已知人脸库中的模型进行比较,以确定是否存在相匹配的人脸。随着近几年信息化进程日益加快,安全认证系列应用的涌现,这使得高度自动化的人脸识别系统的研究成为一个热点。以往大多数系统要求被识别者固定在摄像机前的某一位置, 十分不便,且在某些场合如监控领域也无法实现。如何基于视频,在复杂背景中直接检测、定位运动的人脸,并加以识别,这一问题迫切需要得到解决。

二、HyperFT

这是一个移动端快速视频多人脸跟踪的开源项目,项目是基于mtcnn人脸检测加上简单的模板匹配进行人脸跟踪,算法简单但效果显著,移动端速度可达150帧以上,该项目的优点是可实现多人脸跟踪。

github地址:https://github.com/zeusees/HyperFT

三、代码算法解析

HyperFT项目的多人脸跟踪算法分为三大部分:

第一部分是初始化。通过mtcnn的人脸检测找出第一帧的人脸位置,然后根据结果对人脸跟踪进行初始化;

第二部分是更新。首先利用模板匹配进行人脸目标位置的初步预判,再结合mtcnn中的onet对人脸位置进行更加精细的定位,最后通过mtcnn中的rnet的置信度来判断跟踪目标是否为人脸,防止当有手从面前慢慢挥过时,框会跟着手走,导致无法跟踪到真正的人脸;

第三部分是定时检测。通过在更新的部分中加入一个定时器来做定时人脸检测,从而判断中途是否有新的人脸加入,本项目在定时人脸检测中使用了一个trick——就是将已跟踪的人脸所在位置利用蒙版遮蔽起来,避免了人脸检测的重复进行,从而减少其计算量,提高了检测速度。

四、算法改进的思路

HyperFT项目是在当前已实现多人脸跟踪的开源项目中取得显著效果的项目之一,其优点是人脸跟踪速度快且可以进行对多个人脸的跟踪。由于使用的算法是基于mtcnn和模板匹配实现的,在进行多人脸跟踪时有一定的局限性,所以算法仍存在一定的可提升空间。

1、替换人脸检测模型:可将mtcnn的人脸检测模型替换成yufacedetectnetRetinaFace等模型,人脸检测的时间即可不受人脸数量的影响。

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代码算法解析及改进的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  4. 计算机视觉人脸相关开源项目总结:face_recognition

    计算机视觉人脸相关开源项目总结 https://github.com/ageitgey/face_recognition 深度学习人脸关键点检测方法----综述

  5. Python优秀开源项目Rich源码解析

    这篇文章对优秀的开源项目Rich的源码进行解析,OMG,盘他.为什么建议阅读源码,有两个原因,第一,单纯学语言很难在实践中灵活应用,通过阅读源码可以看到每个知识点的运用场景,印象会更深,以后写代码的时 ...

  6. 如何将开源项目部分代码作为private放在github上?

    很多时候,你的一些项目本身都是开源的,但是基于该开源项目,你可能做了部分更有价值的工作,或者由于其他原因,你不希望将这部分代码放到public上,那么有以下简单方法: 1. 创建一个private b ...

  7. Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库

    一.依赖注入DI 通过依赖注入降低View.服务.资源简化初始化.事件绑定等反复繁琐工作 AndroidAnnotations(Code Diet) android高速开发框架 项目地址:https: ...

  8. Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码

    前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...

  9. 开源项目kcws代码分析--基于深度学习的分词技术

    http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi ...

随机推荐

  1. Spring AOP技术本质认识

    Spring AOP技术本质认识 一.AOP简介   AOP(Aspect Oriented Programming,面向切面编程),把某一类问题集中在一个地方进行处理,比如处理程序中的点击事件.打印 ...

  2. ManiFest.MF

    Manifest-Version: 1.0 //指定manifest文件的版本信息 Bundle-ManifestVersion: 2 //指定该包遵从 OSGi 规范 V3 或者 OSGi 规范 V ...

  3. JS常用关键字总结

    in: 案例1.遍历对象: for(key in obj) { console.info( key+":"+obj[key]; ) }; 案例2.判断对象中是否有属性: " ...

  4. 解决github等外国网站突然无法链接的问题

    问题描述:可以ping通但是通过游览器不能访问. 直接用这个方法:

  5. 回溯法 | 旅行商问题(TSP问题)

    学习链接: 回溯法解旅行商问题(TSP).贪心算法:旅行商问题(TSP) 今天早上做了无数个梦,然后被紧紧地吸附在床上.挣扎一番后爬起来,已经是9点了.然后我开始研究旅行商问题. 在一个无向图中找到一 ...

  6. 第02组Beta冲刺(4/4)

    队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:了解整个游戏的流程 GitHub签入记录 接下来的计划:继续完成游戏 还剩下哪些任务:完成游戏 燃尽图 遇到的困难:没有美术比较好的 ...

  7. SCAN----Redis检索键值对

    转载地址:http://redis.readthedocs.org/en/latest/key/scan.html SCAN SCAN cursor [MATCH pattern] [COUNT co ...

  8. caffe解析

    Caffe支持CUDA,Caffe和TensorFlow没有给出分布式的版本, 可以使用多gpu,Caffe通过直接在执行指令后面加上-gpu 0,1

  9. Burp Suite 入门教程(BURP SUITE TUTORIAL )

    参考链接1:https://www.pentestgeek.com/what-is-burpsuite 参考链接2:https://www.pentestgeek.com/web-applicatio ...

  10. 【操作系统之七】Linux常用命令之tail

    一.概念linux tail命令用途是按照要求将指定的文件的最后部分输出到标准设备,一般是终端,就是把某个档案文件的最后几行显示到终端上,如果该档案有更新,tail会自动刷新,确保你看到最新的档案内容 ...