人脸检测dlib, mtcnnx对比,FDDB测试对比

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

问题来源 How does MTCNN perform vs DLIB for face detection?

前面一直做人脸检测相关内容,然后对比了下dib以及MTCNN的人脸检测效果主要是速度,以及FDDB准确率。最后给出生成FDDB测试文件的C++代码。


FDDB 测试结果

注本文的MTCNN效果检测准确率不是最优的,最优的在FDDB上可达95%,测试效果如下:

可以看到三种方法:

  1. MTCNN 大概90%
  2. dlib 大概 77%
  3. opencv 大概 62%

dlib的作者非要说我的测试有问题,如果谁感兴趣可以使用dlib测试下FDDB的结果。


速度

在CPU和GPU模式下,对于三种不同尺寸的图片,运行一千次测试平均的时效:

CPU模式

MTCNN(既检测人脸又做landmark):

dlib (仅仅检测人脸):

GPU模式

MTCNN(既检测人脸又做landmark):

dlib (仅仅检测人脸):

可以看到:

  1. 在检测精度上MTCNN显然好于dlib
  2. 无论是CPU还是GPU模型下MTCNN的检测数度都好于dlib,而且dlib还做了人脸的landmark

dlib c++生成FDDB结果代码如下(至于怎么使用FDDB测试可见前面blog,有py实现)或者我的stackoverflow回答

#include <iostream>
#include <dlib/dnn.h>
#include <dlib/data_io.h>
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
using namespace std;
using namespace dlib;

// ----------------------------------------------------------------------------------------

template <long num_filters, typename SUBNET> using con5d = con<num_filters,5,5,2,2,SUBNET>;
template <long num_filters, typename SUBNET> using con5  = con<num_filters,5,5,1,1,SUBNET>;

template <typename SUBNET> using downsampler  = relu<affine<con5d<32, relu<affine<con5d<32, relu<affine<con5d<16,SUBNET>>>>>>>>>;
template <typename SUBNET> using rcon5  = relu<affine<con5<45,SUBNET>>>;

using net_type = loss_mmod<con<1,9,9,1,1,rcon5<rcon5<rcon5<downsampler<input_rgb_image_pyramid<pyramid_down<6>>>>>>>>;

// ----------------------------------------------------------------------------------------

void getAllImgPaths(const std::string& file, std::vector<std::string>& vecPaths){

    std::fstream fStream(file);
    std::string sLine;

    while (std::getline(fStream, sLine)){
        if (sLine.size() > 0){
            vecPaths.emplace_back(sLine);
        }
    }

    fStream.close();
}

void writeStrVecToFile(const std::string& file, const std::vector<std::string>& vecStr){
    std::ofstream fout(file);
    for (auto const& x:vecStr){
        fout<<x<<'\n';
    }

    fout.close();
}



int main(){

    std::string fPath = "/home/xy/face_sample/evaluation/compareROC/FDDB-folds/filePath.txt";
    std::vector<std::string> vecImgPaths;

    getAllImgPaths(fPath, vecImgPaths);

    std::string imgBaseDir = "/home/xy/face_sample/evaluation/compareROC/originalPics/";
    std::vector<std::string> vecDetRet;

    string model_path = "/home/xy/anaconda2/lib/python2.7/site-packages/face_recognition_models/models/mmod_human_face_detector.dat";
    net_type net;
    deserialize(model_path) >> net;

    for (auto const& img_name:vecImgPaths){
        std::string imgFullPath = imgBaseDir + img_name + ".jpg";

        matrix<rgb_pixel> img;
        load_image(img, imgFullPath);

        auto dets = net(img);
        vecDetRet.push_back(img_name);
        vecDetRet.push_back(std::to_string(dets.size()));

        for (auto det:dets){

            using std::to_string;

            // sFaceInfo like 49 55 193 193 0.999784
            std::string sFaceInfo = to_string(det.rect.left()) + " " + to_string(det.rect.top()) + " " +
                                    to_string(det.rect.width()) + " " + to_string(det.rect.height()) + " " + to_string(1);

            std::cout<<sFaceInfo<<std::endl;
            vecDetRet.push_back(sFaceInfo);

        }

    }

    // write face detect result to txt file for fddb compare
    std::string fddbTxtPath = "fddb_ret.txt";
    writeStrVecToFile(fddbTxtPath, vecDetRet);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CNN

MobileNet V1官方预训练模型的使用

MobileNet V1的网络结构可以直接从官方Github库中下载定义网络结构的文件,地址为:https://raw.githubusercontent.co...

6922
来自专栏PaddlePaddle

【进阶篇】命令行参数使用案例

编写|PaddlePaddle 排版|wangp 1 本地训练 本地训练的实验,诸如图像分类,自然语言处理等,通常都会使用下面这些命令行参数 paddle ...

3164
来自专栏机器学习算法工程师

分布式TensorFlow入门教程

深度学习在各个领域实现突破的一部分原因是我们使用了更多的数据(大数据)来训练更复杂的模型(深度神经网络),并且可以利用一些高性能并行计算设备如GPU和FPGA来...

3083
来自专栏图形学与OpenGL

机械版CG 附加实验1 中点画线算法

822
来自专栏mathor

“达观杯”文本智能处理挑战赛

 由于提供的数据集较大,一般运行时间再10到15分钟之间,基础电脑配置在4核8G的样子(越消耗内存在6.2G),因此,一般可能会遇到内存溢出的错误

3572
来自专栏瓜大三哥

face++人脸识别

该系统主要分为: 1.数据库:500万张图片和2000个人,而且删除了LFW中特有的人,其分布如下(网上搜集的图片有一个长尾效应:就是随着图片数量的增加不利于网...

3819
来自专栏数据科学与人工智能

Python玩机器学习简易教程

本文介绍利用Python和Python的机器学习库scikit-learn完成一个端到端的机器学习项目。 俗话说,“师傅领进门,修行在个人”。本文就是扮演领进门...

4457
来自专栏ATYUN订阅号

【教程】利用Tensorflow目标检测API确定图像中目标的位置

深度学习提供了另一种解决“Wally在哪儿”(美国漫画)问题的方法。与传统的图像处理计算机视觉方法不同的是,它只使用了少量的标记出Wally位置的示例。 在我的...

7026
来自专栏数值分析与有限元编程

弹性厚板的剪切锁定(shear locking)

Kirchhoff 薄板理论忽略了剪切变形, 即γzx = 0, γzy = 0。但对于厚板来说,不考虑剪切变形会产生较大的误差。下面结合厚板理论作简要分析。 ...

4215
来自专栏机器之心

教程 | TensorEditor :一个小白都能快速玩转的神经网络搭建工具

2136

扫码关注云+社区

领取腾讯云代金券