1.首先不做特别申明,dlib库为开源代码,具体是做什么的,请读者自行查阅。
2.本文只对dlib相关检测人脸代码进行详细解读优化指南。其他本分尚未涉及,请谅解。
dlib 人脸检测相关源码分析 见下面 博客,感谢博客奉献:
开始正题,优化吧:
在硬件RK 3368上,android 5.1 dlib 版本19.10
1.第一点,无非就是多线程。----->
找到最耗时方法,然后想办法,尽量缩短时间。在保证程序运行正常的同时,提升效率。
在scanner.load 这里。如果检测图片较大,那么这个用时比较长。就拿640×480大小,至少需要100ms吧。
这个函数,就是载入图片,并且生成fhog.图里面的特征.
在dlib的scan_fhog_pyramid.h 下,
create_fhog_pyramid函数。
在广大有心人士热心奉献帮助下,有这个一篇对此 提供了帮助。
献出他的github.
git clone http://www.github.com/fastfastball/dlib_for_arm
在终端输入,即可下载这份代码。
而他的思想主要是线程优化。改过之后,与之前相比,可减少50-80ms
2.在第一步减少时间后,dlib在android上的性能可能还是不会让你满意。
别急。---->
在object_detector.h 下,
for (int i = 0; i < w.size(); ++i) { const double thresh = w[i].w(scanner.get_num_dimensions()); scanner.detect(w[i].get_detect_argument(), dets, thresh + adjust_threshold); for (unsigned long j = 0; j < dets.size(); ++j) { rect_detection temp; temp.detection_confidence = dets[j].first-thresh; temp.weight_index = i; temp.rect = dets[j].second; dets_accum.push_back(temp); } }
w.size()= 5,
for 循环5次。人脸的5个方向。
循环一次40-60ms,如果5次。这里至少 200ms 。
dlib库中自带并行for循环函数。
dlib::parallel_for(0,5,[&](long i){
std::vector<std::pair<double, rectangle> > dets;
const double thresh = w[i].w(scanner.get_num_dimensions());
scanner.detect(w[i].get_detect_argument(), dets, thresh + adjust_threshold);
for (unsigned long j = 0; j < dets.size(); ++j)
{
rect_detection temp;
temp.detection_confidence = dets[j].first-thresh;
temp.weight_index = i;
temp.rect = dets[j].second;
dets_accum.push_back(temp);
}
});
本人已测上述代码正确。大约耗时60-100ms.
在确保各方向人脸能检测同时又不失效率。这可以一试。
3.缩小图片大小--->
可从根源上减少运算时间。但是人脸稍微小点便检测不出来,就举个例子。要在在摄像头检测上。
人虽然远一点。1m左右就检测不到了。
具体情况自行测定。
4.最后可能就是指令集优化了。---->
这个不过多说明。
注:
object_detector<scan_fhog_pyramid<pyramid_down<6> > > frontal_face_detector;
减少金字塔层数,虽会降低时间,但人脸检测效果不好。请谨慎。 3 -- 6,若检测不到人脸,再优化有个神码用呢?
愿我的所写,能够让你少走 弯路。早日登上 人生巅峰。赢取白富美。