dlib优化指南

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/teleger/article/details/81382202

1.首先不做特别申明,dlib库为开源代码,具体是做什么的,请读者自行查阅。

2.本文只对dlib相关检测人脸代码进行详细解读优化指南。其他本分尚未涉及,请谅解。

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,若检测不到人脸,再优化有个神码用呢?

愿我的所写,能够让你少走    弯路。早日登上 人生巅峰。赢取白富美。

猜你喜欢

转载自blog.csdn.net/teleger/article/details/81382202