在 VS2015 中使用 openFrameworks 进行 dlib 模板

Posted

技术标签:

【中文标题】在 VS2015 中使用 openFrameworks 进行 dlib 模板【英文标题】:dlib Templating with openFrameworks in VS2015 【发布时间】:2018-02-27 12:20:19 【问题描述】:

我正在尝试在 openFrameworks 中使用 dlib 库的深度神经网络部分。到目前为止,我已经能够自己构建 dlib 示例而没有任何问题。我也一直在使用 openFrameworks 一段时间,并且知道它可以毫无问题地构建。

每当我尝试将两者集成时,我都会在 Visual Studio 2015 中遇到编译问题:

dlib::add_loss_layer<dlib::loss_mmod_,dlib::add_layer<dlib::con_<1,9,9,1,1,4,4,SUBNET,void>>::add_loss_layer(T &&...)': could not deduce template argument for '<unnamed-symbol&gt';

“dnn_mmod_face_detection_ex.cpp”中给出的示例构造神经网络如下:

#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>>>>>>>>;

int main(int argc, char** argv) try

    if (argc == 1)
    
        cout << "Call this program like this:" << endl;
        cout << "./dnn_mmod_face_detection_ex mmod_human_face_detector.dat faces/*.jpg" << endl;
        cout << "\nYou can get the mmod_human_face_detector.dat file from:\n";
        cout << "http://dlib.net/files/mmod_human_face_detector.dat.bz2" << endl;
        return 0;
    


    net_type net;

catch(std::exception& e)

    cout << e.what() << endl;

openFrameworks example中分享的例子如下:

#include "ofMain.h"
#include <dlib/dnn.h>
#include <dlib/data_io.h>
#include <dlib/image_processing.h>
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>>>>>>>>;

class ofApp : public ofBaseApp

public:
    void setup() override;
    void draw() override;

    net_type net;
;

第一个代码块在 VS2015 中编译得很好,但是第二个代码块抛出了我上面提到的错误。我已经能够将其范围缩小到编译器在“net_type net”的实例化方面存在问题,但无法弄清楚原因。

【问题讨论】:

【参考方案1】:

不确定dlib 的具体内部结构,但编译器生成的默认移动构造函数(以及可能的移动赋值运算符)似乎存在问题;第一个代码块仅实例化 net_type 对象,它不会将其包装在类中。

尝试删除 ofApp 类的移动构造函数,看看是否有帮助:

class ofApp : public ofBaseApp

public:
    ofApp() = default;
    ~ofApp() = default;

    ofApp(ofApp&&) = delete;
    ofApp& operator=(ofApp&&) = delete;

    void setup() override;
    void draw() override;

    net_type net;
;

【讨论】:

刚刚试过这个。它会导致“没有适当的默认构造函数”错误。 这有点奇怪,因为在代码 sn-p 中你实际上并没有构造一个对象。无论如何,您可以重新添加一个默认构造函数。请参阅修改后的 sn-p。

以上是关于在 VS2015 中使用 openFrameworks 进行 dlib 模板的主要内容,如果未能解决你的问题,请参考以下文章

在 VS2015 中使用 cl 编译器的 C vs C++

VS 2017 通过文件路径引用本地项目(如在 VS 2015 中使用 global.json)

在 VS Community 2015 中使用 qmake

如何在VS2015中使用QT

Visual Leak Detector在 VS 2015 中使用 VLD

7.vs2015如何在报表中添加日期、时间、页号等