首先,我承认这个题目有点标题党。之所以写这篇,因为发现微信微博上有很多公司介绍他们的技术,但都是说如何如何牛,但缺少技术细节,对读者帮助有限。因此写一点相对干货多的东西,希望能帮助大家。如有谬误,也请大家多加指正。

下面的内容适合正在用Boosting方法做目标检测的读者,也适合对提升算法速度感兴趣的读者。下面的这些内容,都已经应用到我们的人脸检测算法中,对于提升算法速度发挥了巨大作用。OpenCV中的检测速度是21.2毫秒;同样条件下,我们的算法速度是3.6毫秒,速度接近6倍,且检测准确率高很多。

阅读下面的内容之前,首先要区分两个概念“人脸检测/face detection”和“人脸识别/face recognition”。“人脸检测”是从图像中确定人脸的位置和大小,如下图所示;“人脸识别”是识别图像中的人脸是张三还是李四,是身份识别。

人脸检测是一个非常经典的问题,很多人认为这是一个“已经解决”了的问题。人脸检测最经典的方法是Haar+AdaBoost。采用开源的Haar+AdaBoost实现(如OpenCV中的训练和检测程序),我们可以很容易的训练一个还算不错的人脸检测器。但是,一旦将人脸检测技术投入实际应用,一系列问题便会冒出来。如(1)误检(把非人脸的物体当作人脸)较多,非人脸图像当作人脸送入后续算法,会引起一系列不良后果。(2)漏检问题,例如戴墨镜、大胡子、逆光条件、黑种人、倾斜姿态较大的脸无法检测到。(3)速度问题,虽很多人脸检测算法的速度已经很快,但在一个人脸分析(如人脸识别)系统中,人脸检测步骤的计算量往往超过50%。大部分检测算法采用窗口扫描的方式,窗口数目巨大,所以计算量居高不下。很多系统运行在低功耗平台,对计算量尤其敏感。假如手机一拍照片就发烫就很不好。

下图中人脸因为有墨镜和大胡子遮挡,加上角度倾斜,较难检测。图中红框本不是人脸,如被当作人脸,则是误检测。

下面介绍一下我们设计Boosting人脸检测方法的一些心得体会:

一、特征设计

特征设计是重中之重,如果特征从原理上就是计算量大,后面无论如何优化,都很难降计算量。

先说Haar特征,毫无疑问Haar特征用在人脸检测里具有里程碑式的意义。但现在看Haar特征,会发现它有一些明显的缺点。Haar特征是一种很弱的特征,这意味着需要很多特征组合在一起才能构成强分类器,对提升速度不利;如果正样本分布比较分散比较难区分时(例如正面侧面人脸全放进去),用这种弱特征分类会比较吃力。此外,在Haar特征的实现中,为了解决亮度归一化问题,需计算像素值的平方和(square sum),平方和需要64位整数来存储;还需要开方(sqrt)运算。64位整数运算和开方运算,对很多嵌入式系统来讲,都是高计算量操作。

HOG特征是一个描述能力特别强的特征,也可以用在人脸检测上。HOG特征需要计算梯度的方向和长度。计算方向需要ctan三角函数(可用查表法加速)以及开方操作。统计直方图时,为了效果好,需要soft voting加权投票。因此HOG是强描述特征,但特征提取的计算量较大。


   (图片来自 http://dlib.net)

LBP是一个好特征,描述能力强,特征提取仅需要逻辑运算和加法运算,值得推荐!LBP依然有吐槽点。如果你实现Multi-Block LBP,需要积分图来加速。积分图是很多算法的加速武器,但构建积分图时,很难用SIMD(单指令多数据)指令优化。

前面三种特征的对比分析,是为了说明好的特征要表达能力强且计算简单。很多二值特征(Binary feature)符合这一特点。我也偏好二值特征。二值特征还可以天然地解决图像的亮度变化问题,不需要事先对图像进行亮度均衡化。(例如使用Haar+AdaBoost检测人脸前,先对图像做直方图均衡化再检测,效果会好很多,不信你去试。)

二、样本

很多论文中会洋洋洒洒地介绍算法的先进性,但很少有论文分析样本对结果的影响。可能分析样本显得很工程化很low吧。而描述样本在高维特征空间的分布,应该是很多模式识别问题的核心问题。

好,不谈理论谈经验。样本选择是一般人不提的重要事情。如果你用手机自拍照片训练人脸检测器,应用在视频监控中,一般效果不会太好;如果你对所有人脸样本进行人脸对齐,要求双目绝对水平,那么训练出的分类器速度会比较快,但不能处理人脸姿态变化。即人脸样本越单一,训练出的分类器的速度会越快,但正确检测率低;如果样本复杂,速度变慢但检测率升高。如何平衡样本的复杂性和检测速度,需要针对具体应用斟酌。

此外负样本也很关键。如果你从几千张风景图里抠图作为负样本进行训练,那么基本上会overfitting,即训练时误检率很低,但实际应用时误检率比较高。要准确刻画非人脸图像,负样本的规模一定要大,负样本的内容一定要多样化!我们平时训练用的负样本图像大约有20GB,包含各种内容的图像。

三、分类器训练

这个可说的不多,Boosting方法就那些,可以尝试各种Boosting方法和各种参数,找到合适的。

后面会说说代码层面的优化。

四、代码优化:消灭重复计算

通过分析工具,找出最影响速度的代码段,有针对性地优化。一般来说是判断窗口是否是人脸的代码最耗时,因为调用次数最多。代码里首先要消灭的是重复计算,如代码

int b1 = pixels[y*step + x] - pixels[y*step + x + 1];

int b2 = pixels[y*step + x + 2] - pixels[y*step + x + 3];

可以写为

int offset = y *step + x;

int b1 =pixels[offset] - pixels[offset+1];

int b2 = pixels[offset+2] - pixels[offset+3];

五、代码优化:展开循环

如果循环次数是固定的,可以去掉for循环,直接展开。代码行数虽然多了,但是少了for循环的条件判断,可以加速,例如可加速10%-20%。另外可以在设计分类器的时候,就把这些因素考虑进去,由训练程序生成的强分类器包含固定数目的弱分类器,或者某种规律数目的弱分类器,这样有利于检测代码优化。

六、代码优化:利用SIMD指令

无论Intel CPU还是ARM CPU,都有SIMD(单指令多数据)指令。利用这些指令,可以一次算多个数据。例如两个BYTE向量相加,支持128位的SIMD指令可以一次算16个BYTE的加法,理论上可以加速16倍。我们常用的加速利器积分图,它的构建过程很难用SIMD加速。如果你有更好的策略,可以果断抛弃积分图。

七、代码优化:多核并行运算

OpenMP或者Intel TBB可以让我们充分利用CPU的多个内核进行并行运算,提升速度。但用了OpenMP或TBB,未必可以加速,或未必可以加速到期望的倍数。多核并行,任务的拆分的粒度应该尽可能粗,不同的任务尽可能不用同一块内存,也就是任务之间的相关度低一些有利于加速。

举给例子:如果两个矩阵相加,按像素进行并行操作,加速效果会很糟糕;如果按行并行,效果会好很多,但不要按列并行!

八、代码优化:定点化

有些低功耗嵌入式系统不支持硬件浮点运算,特征提取和分类器设计应尽可能避免浮点运算。不可避免的浮点数可以转为定点数,当然这会损失精度。我们曾经将float类型转为8位整数,而准确率无明显影响。

九、代码优化:GPU优化

GPU跟CPU不同,有自己独特的特点。GPU特别适合做无复杂逻辑但计算量大的事情。例如图像resize、图像滤波等。Boosting算法可以运行在GPU上,并获得加速,但GPU加速Boosting优势并没有你想象的明显。Boosting算法中逻辑分支较多,也就是有不定长的for循环,有if-else判断;并行的时候每个运算单元运算量并不相同,有些运行时间长,有些运行时间短。运行时间短的要等运行时间长的。我们做了很多努力,GPU版本(低端GTX750i显卡)速度大约可以做到CPU版本(i7多核并行)的6倍左右。跟OpenCV中用GPU加速Haar+Adaboost的倍数一致,而没有达到期望的几十倍加速。

十、吐槽:非连续内存读写

读写非连续内存,速度可能变慢。如下图Haar积分图计算像素和的公式是D-B-C+A,需要读4个元素值,但这4个值在内存里并不连续,特别是A和D距离较远,这样降低了CPU缓存的命中率,也就降低了速度。对缓存小的低价位CPU影响尤为明显。虽然公式D-B-C+A的计算量跟E-F-G-H相同,但一般来说后者速度会快。此外,Boosting方法选出的多个弱特征,在图像上往往也不相邻,同样是低效的非连续内存的读写,这是Boosting类方法的一个缺点。

十一、未来展望

到目前为止,Boosting方法在人脸检测中依然具有明显的速度优势。但基于深度学习的目标检测方法进展迅速,不容小视。深度学习的方法可以很容易地获得非常高的准确率,如在FDDB人脸检测评库上,传统方法能达到85%准确率就非常高了,但深度学习方法可以轻松超过90%,甚至超过95%。如果想兼顾速度和准确率,传统方法和深度学习的方法结合也许是一个思路,现在已经有一些这样的尝试了。此外,CNN专用硬件应可以弥补深度学习方法的劣势。

十二、插播广告

我们的人脸检测库libfacedetection,以二进制的方式免费发布。该库调用非常简单,只有一个函数,纯C语言编译而成,不依赖任何第三方库。通过连续的优化,我们的人脸检测算法可以做到3.6毫秒处理一张VGA图像(最小48x48人脸)。您可将这个库应用到您的系统中,无论是科研目的还是商业目的,均无任何限制。详情请访问https://github.com/ShiqiYu/libfacedetection。下图是我们的算法在FDDB上的评测曲线。

怎么把人脸检测的速度做到极致相关推荐

  1. 日本东北大学改进单阶段人脸检测—兼具速度与精度优势

    点击我爱计算机视觉标星,更快获取CVML新技术 近日来自日本东北大学与Laboro.AI公司的研究人员公开一篇改进的单阶段人脸检测算法论文,其不仅保持了速度的优势而且在主流的人脸数据集上达到与双阶段人 ...

  2. 人脸检测(十九)--人脸检测综述(2018.2)

    本文转自:https://zhuanlan.zhihu.com/p/32702868,若侵即删.这篇文章,偏工程实用,不是学术界意义上的检测综述,所以,有些阐述,过于绝对化.挑着看吧. 人脸检测系列博 ...

  3. 人脸检测 中那些 有启发意义的idea

    检测三问 什么是Anchor,为什么要有anchor? SSD究竟在训练啥? 什么是mAP?  如何计算? 计算过程可视化.目标检测模型的评估指标mAP详解(附代码)A Survey on Perfo ...

  4. 人脸检测背景介绍和发展现状

    本文转自:https://zhuanlan.zhihu.com/p/32702868,若侵即删.这篇文章,偏工程实用,不是学术界意义上的检测综述,所以,有些阐述,过于绝对化.挑着看吧. 人脸检测系列博 ...

  5. 一种改进的快速人脸检测算法

    人脸检测是计算机视觉及相关领域的关键技术,在智能人机交互.视频会议.安全监控等方面都有着广阔的应用前景.目前人脸检测方法主要有基于知识的方法和基于统计学习的方法[1].其中,基于知识的检测算法首先抽取 ...

  6. 如何用OpenCV在Python中实现人脸检测

    选自towardsdatascience 作者:Maël Fabien 机器之心编译 参与:高璇.张倩.淑婷 本教程将介绍如何使用 OpenCV 和 Dlib 在 Python 中创建和运行人脸检测算 ...

  7. 基于深度学习的目标检测技术演进:从目标检测到人脸检测

    本篇博客主要转载两篇写得好的分别介绍基于深度学习的目标检测和人脸检测的文章,最近在调研基于深度学习的人脸检测相关的文章,在网上查相关资料时,有幸看到.文末附带基于深度学习的目标检测和人脸检测相关经典文 ...

  8. 人脸检测与美颜技术介绍(OpenCV)

    人脸检测与美颜技术介绍 目录 人脸检测与美颜技术介绍 人工智能(AI) 人工智能.机器学习与深度学习的关系 机器学习与深度学习的区别 深度学习简介 深度学习模型 深度学习的历史 深度学习的工具 神经网 ...

  9. 【OpenCV入门实战】利用电脑前置摄像头进行人脸检测

    这几天在看OpenCV相关的书,结合书上的源码自己拼合出了这个功能,于是写下来作为入门OpenCV的一个记录.   要完成这个功能,需要两步操作,一是打开摄像头采集图像,二是将采集到的图像送入图像检测 ...

最新文章

  1. array用法 numpy_NumPy总结(基础用法)
  2. go开源项目influxdb-relay源码分析(一)
  3. VS2010编译选项查看MSDN
  4. 让Win10文件管理器的详细信息窗格显示更多信息
  5. python算法与数据结构-单链表
  6. java6虚拟机_Java 虚拟机之六:javap工具
  7. 【OpenCV 例程200篇】58. 非线性滤波—中值滤波
  8. Python练习:站队顺序输出
  9. [转] Python标准库的threading.Thread类
  10. 【PyCharm】10个省时间的 PyCharm 技巧
  11. http协议与php关系,HTTP协议的由来
  12. linux 与 windows操作系统的区别
  13. les有学计算机的吗,拷问LES大涡模拟
  14. 完美解决Tensorflow不支持AVX2指令集问题
  15. 华为手机计算器程序员模式_华为手机的普通拍照模式,你真的会用吗?
  16. matlab eemd输出,MATLAB信号处理EEMD工具箱
  17. 毕业设计总结与展望、致谢-“完工总结会”-08
  18. 如何防御网站被攻击?
  19. 与“鸡”对话的时代孤独
  20. (10) IFC中的构件与空间结构(IfcRelContainedInSpatialStructure) (Industry Foundation Class)

热门文章

  1. C++中的虚函数实现原理
  2. 一款基于TweenMax.js的网页幻灯片
  3. win11下编译pycocotools放入python 3.9 包中
  4. innerHTML VS createElement
  5. deskvideosys软件license管理功能介绍及使用
  6. DSE200:Python for Data Science 学习笔记(三)
  7. 每日一题10022-潜伏者
  8. 城市治理的“精英”逻辑批判
  9. 百度地图场所联系信息采集器功能介绍
  10. window 查看公网IP地址