libfacedetection 第三代终于开源,小弟我赶紧屁颠屁颠的去看了一下,确实很厉害。libfacedetection v3在不增加资源消耗的清情况下,相比libfacedetection v2增加了人脸特征点的回归,可以看作是一个轻量级的MTCNN。想到github上面同样还有一个很牛逼的ultra-light-generic-face-detector,于是心血来潮想去对比一下两个模型的优劣。
首先分别介绍下今天的两位主角,libfacedetection是深圳大学余老师的作品,其一共经历了从传统算法,到libfacedetection v1,v2,v3的迭代。这个项目的亮点包括:(1)提供了一套自己实现的框架,包括其中的卷积运算,池化,标准化等等。(2)提供了轻量化的人脸检测模型。因此这个项目可以说是身上有人脸检测需求的工程师的福音,基本上clone下来,二(gai)次(xia)开(bian)发(liang)就可以先出一个版本~~~~。libfacedetection的框架还包含了基于SSE的加速和基于NEON的加速,因此他可以同时游走在PC和板子上,其框架的一个特点是数据读取的方式不是通常的CHW而是HWC,这样就保证了图像分辨率宽高不为8的倍数时也能榨干设备的性能。
Ultra-light-generic-face-detector,同样也是相当牛逼的项目,跟libfacedetection一样,目前提供了针对人脸检测的模型。该项目可以在多种框架下运行(caffe,ncnn)等。在项目的介绍中,Ultra-light-generic-face-detector的两个模型的召回率是全面超过了libfacedetectionv1,v2,并且其slim版本的运行速度也与libfacedetection v1基本没有差异。同时其模型大小也很小,也就是说,我不仅模型小,我跑的跟你一样快,我精度还甩你一大截,大有成为天下第一轻量级人脸检测模型的架势。
废话少说,项目描述是一回事,实际跑起来又是另一回事。为了比较两个模型,首先要将两个模型在同一设备,同一框架下运行。其实直接将两个模型放在caffe,或者pytorch下运行比较一次就行了。不过我不是很想这么做,我决定都把他们放在libfacedetection框架下比较,去掉所有的加速。(这么做的原因,一方面是为了让我更好的熟悉多各种各样的框架,比较把模型放在经典框架下跑谁都能做,第二方面是万一Ultra-light-generic-face-detector很厉害我就直接部署了哈哈)
将Ultra-light-generic-face-detector的slim版本移植到libfacedetection框架之后,对于分辨率为320 * 240的图像进行了测试,因为初步是在PC端测,而PC端的运行速度不稳定,因此我重复测了十次然后取了均值,运行时间为0.247113s / 次。然后同样的图片,用libfacedetection v1又测试了一次,平均运行时间为0.223585s / 次。由此看出,Ultra-light-generic-face-detection的耗时是比libfacedetection-v1要稍多一些。此外,我分别测试了Ultra-light-generic-face-detection和libfacedetection的内存消耗,发现Ultra-light-generic-face-detection的内存消耗比libfacedetection-v1的内存要更多。此外,简单对比了一下结果,Ultra-light-generic-face-detection的确比libfacedetection-v1多检测出了几个正确的人脸,看来Ultra-light-generic-face-detection在实际环境下的效果比libfacedetection-v1要稍好一些。具体的数据表格就先不放出了,用的系统是ubuntu-14.0.4,有兴趣可以自己尝试下,一天应该就可以配置完了。
简单总结一下,(1)模型大小方面,Ultra-light-generic-face-detection比libfacedetection小;(2)运行时间方面,Ultra-light-generic-face-detection比libfacedetection稍多;(3)内存消耗方面,Ultra-light-generic-face-detection比libfacedetection消耗的多;(4)效果方面,Ultra-light-generic-face-detection比libfacedetection效果稍好。
因此如果要部署到性能不那么好的芯片上的话,一个建议是用Ultra-light-generic-face-detection转libfacedetection框架部署,同时利用共享内存改进内存效果过大的问题。主要是因为Ultra-light-generic-face-detection效果更好,模型更轻量,速度问题可以自己去用winograd改进。(libfacedetection-v3还没测过,没准libfacedetection-v3是更好的选择)
博客就先写到这里吧。验证的过程不是很严谨,比较时间有限。后续工作包括(1)加入libfacedetection-v3的比较。(2)增加实际场景的数据集,从而多方面比较两个模型的优劣。(3)将两个模型移植到其他的深度学习框架上看看。