基于CNN的快速人脸识别
深圳大学的于仕琪老师发布的人脸检测库:libfacedetectio 于昨日正式开源。
这是一个基于CNN的人脸检测的开源库,CNN模型权重信息已在C源文件中转换为stastic variales。也就是说我们需要的模型权重不再是某个特定格式的文件,而直接是.cpp。
面部识别源代码不依赖于任何其他库。因此在速度上还是精度上,都有巨大的优势,是目前已知开源库中最好用的一款。
下面是于仕琪老师的原话:
我们自己用C++语言实现了CNN的前向操作,专门针对人脸检测而实现。代码量少,使用方便。现在您可以下载源代码,在Windows、Linux、ARM、Android等所有支持C++编译的环境中编译使用!
这个开源算法库有如下优点:
速度快:在树莓派上可以实时进行人脸检测;有采用AVX2(x64平台)和NEON(ARM平台)指令集进行优化。
简洁:只有一个接口函数,把代码放到你的项目中,然后直接调用接口函数则可。
独立:不依赖Caffe、OpenBLAS、OpenCV等任何算法库。
兼容:可以在几乎所有平台上使用,只要有C++编译器则可。
小:代码仅1500行;INT8模型仅800KB!
另注意,项目License改用3-clause BSD License,注意不要违规哦!
看看有多快速
因为这个库使用了SIMD指令,我们在编译的时候可以选择开启从而提升人脸识别的速度:
SIMD instructions are used to speedup the detection. You can enable AVX2 if you use Intel CPU or NEON for ARM.
在桌面平台下,人脸检测识别的速度最高可以达到1500+fps,最小可以检测脸的大小为12x12,日常足够我们去使用了。
CNN-based Face Detection on Windows
Method
Time
FPS
Time
FPS
X64
X64
X64
X64
Single-thread
Single-thread
Multi-thread
Multi-thread
OpenCV Haar+AdaBoost (640×480)
—
—
12.33ms
81.1
cnn (CPU, 640×480)
64.21ms
15.57
15.59ms
64.16
cnn (CPU, 320×240)
15.23ms
65.68
3.99ms
250.40
cnn (CPU, 160×120)
3.47ms
288.08
0.95ms
1052.20
cnn (CPU, 128×96)
2.35ms
425.95
0.64ms
1562.10
OpenCV Haar+AdaBoost runs with minimal face size 48×48
Face detection only, and no landmark detection included.
Minimal face size ~12×12
Intel(R) Core(TM) i7-7700 CPU @ 3.6GHz.
另外一个比较厉害的是,这个库在树莓派上也可以跑到非常快的速度,树莓派相比大家都很清楚,200多块钱的一个小型处理器,树莓派PI3B+的处理芯片为 Cortex-A53 (ARMv8) 64-bit SoC @ 1.4GHz,而在这块芯片上以320x240的分辨率可以跑到23fps,可以说是实时了,当然稍微降低精度的话速度可以提升更快。
CNN-based Face Detection on ARM Linux (Raspberry Pi 3 B+)
Method
Time
FPS
Time
FPS
Single-thread
Single-thread
Multi-thread
Multi-thread
cnn (CPU, 640×480)
512.04ms
1.95
174.89ms
5.72
cnn (CPU, 320×240)
123.47ms
8.10
42.13ms
23.74
cnn (CPU, 160×120)
27.42ms
36.47
9.75ms
102.58
cnn (CPU, 128×96)
17.78ms
56.24
6.12ms
163.50
Face detection only, and no landmark detection included.
Minimal face size ~12×12
Raspberry Pi 3 B+, Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bit SoC @ 1.4GHz
为什么这么快
整个项目都是用C++编写的,包括所有的前向网络和前向操作,没有使用任何的神经网络库,类似于ncnn,将所有的卷积操作都通过多线程的方式进行了优化,并且本身算法设计的模型也提前进行了优化(本身就是小模型)。另外还支持量化模型,也就是int8精度的模型,这样的话网络可以在精度略微下降一点的情况下实现速度的大幅提升。
如何运行,目前为止如果我们直接使用项目地址中的CmakeLists在Linux下编译会报错,我们需要在提供的Cmakelist文件中添加这一句set(CMAKE_CXX_FLAGS "-mavx -mfma")。就可以编译通过了。
编译后执行./demo即可:
prototype@prototype-X299-UD4-Pro:~/$ ./demo kate.png
1 faces detected.
face_rect=[189, 89, 142, 142], neighbors=99, angle=0
项目地址