|
**************************** 求同好者 ***************************
这个回答最重要的目的已经写在第一行了。。。
都是自己写的,性能还不完美,提前放出来开源(当年Linus不就是这么干的?)~
项目有人关注就更新补充更多的文档 =。=
项目名称: E-Face
EFace by jasonleaster
适用对象: 图像处理或机器学习相关童鞋
项目内容: 简易的人脸检测系统.
之前我在 如何从0学习opencv,完成类似人脸检测的毕设? - 知乎用户的回答
说过,调用API是很简单的,如何实现背后的最核心的技术,才是最有价值的(当然,如果你想让自己more valuable),很多人调用API也说自己搞face detection的。
有兴趣的话也可以去尝试一下Object Detection的另外一个应用,汽车车体检测。我利用OpenCV和公开可获得的数据集做了一点实践工作,有兴趣的可以看看我的记录 Training Cascade With OpenCV
项目性质: 源码学习,技术交流。非工业级别图像处理库(O(∩_∩)O现在达不到那标准。。。)
硬件平台要求:一台PC基本上就能跑。(intel core i5/ 8G RAM / Ubuntu).
对于14000幅左右分辨率为19*19的训练集:
对于feature总数为32746(即,数据规模为14000 * 32746)
特征提取耗时约3000+秒
模型训练约为(35s * 300,单个弱分类器训练耗时,35s,预期最大选取300个弱分类器)
上面我简要介绍了一下EFace的性能情况,可能无脑黑又会说Python写的又low又慢。下面是, Yi-Qing Wang 在论文[2]中有关于他们在训练中对于他们系统性能的描述
A few words on the actual cascade training carried out on a 8-core Linux machine with 48G memory.
... ...
The training process lasted for around 24 hours before producing a 31-layer cascade.
-- Yi-Qing Wang
在其个人网站上可以找到前辈的研究领域作品和论文。
这个Face Detection的实现还不perfect,Cascade也还在写,Cascade的主要目的就是降低训练耗时,Yi-Qing Wang 说31层的Cascade都耗时24小时。
目前Cascade的部分还在实现中ing,尽可能的对自己半年前的Python代码进行了优化。研究了一下关于Python性能的优化,从一开始基本上就能跑 (18小时左右 )到现在的性能算提升了很大,而且数据处理量也提升了更多(一开始我写出来的内存消耗很大,6G的内存只能跑3000幅19*19的图片的样子,到现在能跑12k幅)。
EFace的相关特性肯定这里讲不完,有兴趣的话可以Project Home Page of EFace看看。实现细节的各种斟酌考虑也很有意思,还是那句话,有兴趣看代码,一起交流。
下面是Viola的ROC曲线
EFace的ROC曲线,270+ feature classifier(做个简单对比):
但是我的后期检测部分表现的并不是很好,希望有兴趣的童鞋一起交流一改进。
EFace的人脸检测测试样例:
上面你们能看到这个帅哥被绿色的框框框住了,这个单幅图像的检测结果表现还不错。
但是多幅人脸图像的话,可能就表现的不是很好(或者说我的detector有问题(*@ο@*) 哇~)
会出现漏检和错检的情况(能做到这个样子,我已经非常开心了)。
Reference:
1. << Robust Real-Time Face Detection >> PAUL VIOLA, MICHAEL J. JONES
2. << An Analysis of the Viola-Jones Face Detection Algorithm >> -- Yi-Qing Wang
3. << Robust Real-time Object Detection >> Paul Viola, Michael Jones
4. 《High Performance Python》Micha Gorelick / lan Ozsvald
EFace 期待有兴趣的童鞋加入哈~
Update : 2016.09.09
人脸检测扩展的说,甚至于目标检测的实际项目中,对于目标的准确检测其实有很多困难的。CV界有个不好的风气,某些人、团队为了金钱利益而使用极其差劲的低劣手段发paper,很多垃圾论文数据造假,结果造假。说这些,目的也很简单,还是希望能够促成对Face Detection 甚至广义的Object detection方向感兴趣的同学,去看看EFace的源代码,有兴趣的话,我们可以聊聊。
Face Detection一些困难的点,从算法模型的根源产生的困难和目标问题两个方面,我讲讲自己遇到的一些困难。
1. 算法模型的根源产生的困难
1.1 要得到鲁棒性强的商用系统,基于统计的学习需要大量的样本数据做训练集
大多数经典的算法都是基于Data-driven的算法模型,都是基于统计学习的方式去训练模型,最后得到一个鲁棒性还不错的模型参数。这就需要大量的训练样本。
1.2. 大量的样本数据,一方面需要很强的计算平台,另一方面可能会需要很大容量的缓存空间
说白了,折腾机器学习想要产生点经济效益,特别是CV领域,得有强有力的硬件资源作支撑。一般玩家很难进入,当然稍微舍得花钱的公司下决心要搞机器视觉的,那点钱都是小钱了。但是一个优秀的程序员想单独在家里完成这个lab?很困难。这是现实基础问题。
2.目标问题本身的困难
我们这里的目标问题,就是把人脸给他检测出来嘛~
这个问题很简单吗?诚然,不简单。
2.1 现实生活中人脸位于图像中可能是有很多角度的
给人对这个答案有兴趣的伙伴可以直接把上面这幅图直接拿去测当前人脸应用商业化的一些非常优秀的公司,他们的模型也不能完全检测出这里面所有的人脸(5个人脸哦,有的公司检测出来2个人脸,有的公司的公测API检测出0个人脸)
说到这里,这些公司难道是骗子?不然,不点名了,我所知道的这两家公司都是我非常尊敬的公司,正是他们实事求是的态度,能够把人脸技术“落地化,产品化”,更加务实。再次表达我的敬意。如果有对OpenCV做一点了解的同学也会发现,OpenCV的人脸检测模块也是不能完美完成目标检测这个任务的。
我说了,问题的本身还是在于人脸检测确实不是个简单的活儿,系统的输入---- 训练样本,大多数也都是训练的正脸样本,很少有斜着脸的样本,这也从根本上造成了检测结果对rotated face不敏感。
对于这样的问题,我的一点简单的看法:仅针对,可能存在人脸倒着的情况,训练的过程可以保持不变,只是最后检测的时候,增加一步,把输入图像翻转180°之后再进行检测,取翻转前和翻转后两者检测结果的“并集”,即可。
2.2 终极问题,你觉得什么是人脸?
本质上,图像在计算机中呈现出来是由于有颜色模型的存在,RGB等等,黑白的也罢,像素取值区间在0~255之间,一副图像中,所谓的人脸区域,不过是一些特殊“亮暗模式”,而谁又能构建出一个准确的数学模型去对这个问题进行定位呢?现在流行的方法是,基于统计训练模型,利用大数据本身对模型参数进行求解。
谈不上对CV有很深入的研究,但是这其中引发了我思考很多有意思的问题,比方说“客官,你怎么定义人脸呢?难道半张人脸不是人脸?四分之一张人脸是人脸吗?...(Object detection以及目标模型的模糊性)” “阁下,不知道你能不能帮个忙,给我解释一下,什么叫做蓝天啊?(图像分割)”
有没有兴趣去看看EFace的代码呢? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|