论文《Joint Cascade Face Detection and Alignment》笔记

2024-05-11 22:08

本文主要是介绍论文《Joint Cascade Face Detection and Alignment》笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文:Joint Cascade Face Detection and Alignment.pdf

实现:https://github.com/FaceDetect/jointCascade_py

部分内容引用自:http://www.cnblogs.com/sciencefans/p/4394861.html#!comments

首先是简介:

论文首先介绍了一些当今人脸检测的技术发展状况,首先阐述了V-J算法的奠基性以及它所提出的两大原理:1)boosted的级连结构;2)提取简单的特征。这种检测器虽然在工业界和学术界得到了普遍认可,并且有着不错的检测效果,但是在一些复杂的情况下(光照、表情、遮挡),简单的特征会使检测能力会大大下降。一些人尝试离散的训练出各种角度的识别器来增强鲁棒性,但是用这种离散的方式来估计人脸角度本身就带来了很大的困难,训练出的模型往往速度过慢或准确率不高。最近又提出了一种不使用V-J框架的人脸检测算法:DPM,它可以做到人脸检测和关键点定位的一气呵成,但是其计算量太大导致时间消耗过高。

论文采用了一种新的算法来检测人脸,仍遵循V-J的经典框架,采用像素差作为特征,有着杰出的速度(28.6 ms for a VGA image )与实现效果(achieves the best accuracy on the challenging datasets)。

论文的突破点在于采用了人脸检测点作为人脸检测的一种指标,过去的工作中人们大多数将关键点检测与人脸检测分成两部分,然后论文通过实验指出,关键点检测可以作为人脸检测的一个重要评价标准,其实我们想一下也能知道,假如关键点检测到鼻子在嘴巴下面,那么这张脸想必不会是人脸。关键在于如何有效的利用这种特征。

最后,本文与另一篇论文密不可分,《Face Alignment at 3000 FPS via Regressing Local Binary Features 》,只有理解好这篇论文,才能理解其利用回归树做的关键点定位算法,能够理解其关键点定位算法,才能理解本篇论文提出的分类回归树算法。建议理解分类树与回归树和随机森林之后,再阅读上面给出的论文,之后再阅读下面的内容。

作者关于关键点定位对人脸检测作用的验证:

该段引用自http://www.cnblogs.com/sciencefans/p/4394861.html#!comments。

作者建立了一个叫post classifier的分类器,方法如下:

1.样本准备:首先作者调用opencv的Viola-Jones分类器,将recal阀值设到99%,这样能够尽可能地检测出所有的脸,但是同时也会有非常多的不是脸的东东被检测出来。于是,检测出来的框框们被分成了两类:是脸和不是脸。这些图片被resize到96*96。

2.特征提取:接下来是特征提取,怎么提取呢?作者采用了三种方法:

第一种:把window划分成6*6个小windows,分别提取SIFT特征,然后连接着36个sift特征向量成为图像的特征。

第二种:先求出一个固定的脸的平均shape(27个特征点的位置,比如眼睛左边,嘴唇右边等等),然后以这27个特征点为中心提取sift特征,然后连接后作为特征。

第三种:用他们组去年的另一个成果Face Alignment at 3000 FPS via Regressing Local Binary Features (CVPR14) ,也就是图中的3000FPS方法,回归出每张脸的shape,然后再以每张脸自己的27个shape points为中心做sift,然后连接得到特征。

3.分类:将上述的三种特征分别扔到线性SVM中做分类,训练出一个能分辨一张图是不是脸的SVM模型。

紧接着作者将以上三种方法做出的分类器和初始分类器进行比对,画了一个样本分布的图:

这个图从左到右依次是原始级联分类器得到的样本分类分布和第一种到第三种方法提取的特征得到的样本分类分布。可见做一下shape alignment可以得到一个更好的分类效果。但是问题来了:如果把所有的windows都做一下alignment,即使是3000 faces per second的速度一张图可能也要处理上1秒,这无法满足一般一秒30帧的实时需求。作者也说,用opencv分类器,参数设成99%的recall率将会带来很严重的效率灾难——一张图能找出来3000个框,处理一张图都要好几秒。

这么渣的效率可咋办呢?以上内容已经证明了alignment确实对detection的preciseness有帮助,这就够啦。

关键点用于人脸检测的初步结合尝试:

这里提出了两个算法,分别是:Cascade Detection 和 Cascade Alignment  ,这两个算法都是现成的,前面讲的pico用的其实就是一个Cascade Detection ,想了解的看前面pico讲解或V-J框架都可以,我们不再多说。Cascade Alignment相比来说是个较新的方法,主要是用回归的方法,将关键点不断回归到正确的位置。

实现的方法是在做检测的时候引入关键点参数,然后在一层检测过后更新关键点参数,具体做法就是在训练检测过程的弱分类器时加入关键点参数,算法流程如下:


参数含义参考论文,此处不再贴出,算法很容易理解,其实就是在每一层内,先做检测,检测完在做关键点校准,缺点也很明显,一来是效率不高,二来是两套模型训练和测试起来很麻烦,别急,下面是改进。

关键点用于人脸检测的完全形态:

这一部分是本篇论文的核心精髓,作者开创性的将前面提到的用于关键点校准的回归树结合上用于检测的弱分类器重建为一棵新的决策树,并命名为 classification/regression decision tree (分类回归决策树),为方便我们简称其为CRDT(我自己乱取的名字别当真),CRDT输出一个用于判决人脸得分的同时还会输出关键点的增量,可以说这两步是完全同步的,并且采用的是相同的特征。

关于CRDT的构建方式参考 霍夫森林(HoughForest):在一棵CRDT的所有结点上,一部分结点用于分类,原则就是选择使信息增益最大的点划分(这里多说一句什么是使信息增益最大的点,假如选择某个特征,使得划分后结果越混乱,那么它的信息熵也就越小,那么在将其按照标签重新划分为两部分后,此时信息熵最大,那么该点也就是信息增益最大,这块我也是弄了好一会才明白为什么选使结果最混乱的特征划分);另一部分结点用于回归关键点。

通过一个参数ρ来决定其职责,分类结点的权重为ρ,回归结点权重为(1-ρ),在一棵树里,分类结点更靠近根结点,回归结点更靠近于叶结点。

ρ(t) = 1 − 0.1t, t = 1, ..., T . 

也就是说,越靠前的层里,较多的结点用于分类,较少的结点用于回归;越靠后的层里,较少的结点用于分类,较多的结点用于回归。

贴出检测算法流程如下:

 

这里的CRtk就是一棵CRDT,θtk 是其阈值,算法过程也很明了,不再多说。

贴出训练过程算法如下:


看起来很长很复杂有木有!我们逐行来看:

8-10 初始化所有训练数据的权值,依据公式,y等于-1表示其为人脸,+1表示其非人脸,只可取这两个值,f为其当前分类的值。

w用来表示其熵,也就是说,分类越明显,所有w的值会趋向两端,越不明显,那么所有w的值会趋向中间。

11 确定当前的CRDT树回归哪个人脸关键点,由当前 k mod L决定。/*local learning in Section 4.1*/ 

12 开始训练CDRT树

13-15 依据下面的公式确定其叶子结点的输出值。


该公式可以这么理解,定义域为这个叶子结点的所有输出,值域为负无穷到正无穷,其值越大,说明通过该叶子结点的数据多为负例,其值越小,则多为正例。

16-18 依据刚才训练的CRDT树,测试所有数据,更新所有数据的分类得分。

19 根据现在所有分类的得分,预设的召回率,误检率,确定当前CRDT树的阈值。

20 把所有得分小于该阈值的训练数据移除。

21 如果负例数据不足就perform hard negative sample mining(这个是什么我也不知道,待补充) 补充负例数据。

上面这些就是一棵CRDT 的完整训练过程。

23 依据所有叶子结点的结果获得∆S 。 /* global learning in Section 4.1 */ 

24 更新当前所有训练数据的S。

关键点检测算法:

论文:Face Alignment at 3000 FPS via Regressing Local Binary Features.pdf

特征提取:

the shape indexed pixel difference features 

总结与启发:

这篇论文的干货非常多,总结起来有以下几点:

1、这篇论文并没有深入其关键点检测算法,但是其关键点检测算法目前来说应该是state-of-the-art的,该算法值得深入学习。

2、论文中设计了一种CRDT树,将分类和回归结合到一棵决策树上,十分有借鉴意义。

整篇论文给人最大的启发在于其CRDT树的设计,将关键点检测回归树与人脸检测分类树结合起来,在实验中取得优异的结果,而pico同样为分类树,不同之处是两者采用的特征不同,假如pico的特征能够用于关键点检测算法,或是我们能够提出一种新的特征能够同时用于关键点检测和人脸检测,那么就可以按照文中提供的方法,实现人脸检测与关键点检测的结合,实现准确率的一次突破。


这篇关于论文《Joint Cascade Face Detection and Alignment》笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980790

相关文章

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi