我正在尝试让YOLO/Darknet在UE4项目中工作。我已经将YOLO构建为C++ DLL,并将所有依赖项添加到项目中。它可以正常运行,并且代码的某些部分可以正常工作,但是我在某个时候遇到了异常,经过数天的时间试图弄清楚,现在我茫然了,需要一些帮助。

这是我要从UE4类内部创建YOLO Detector类的代码:

YOLO_DataPath = FPaths::ProjectDir() + "Plugins/Stereolabs/Source/YOLO/Data/";
std::string YOLO_DataPathC(TCHAR_TO_UTF8(*YOLO_DataPath));

std::string  NamesFile = YOLO_DataPathC + "obj.names";
std::string  CFGFile = YOLO_DataPathC + "yolo-obj.cfg";
std::string  WeightsFile = YOLO_DataPathC + "yolo-obj.weights";

Detector YOLODetector(CFGFile, WeightsFile);

这是被调用的构造函数(来自“yolo_v2_class.cpp”,第130行):
LIB_API Detector::Detector(std::string cfg_filename, std::string weight_filename, int gpu_id) : cur_gpu_id(gpu_id)
{
    wait_stream = 0;
#ifdef GPU
    int old_gpu_index;
    check_cuda( cudaGetDevice(&old_gpu_index) );
#endif

    detector_gpu_ptr = std::make_shared<detector_gpu_t>();
    detector_gpu_t &detector_gpu = *static_cast<detector_gpu_t *>(detector_gpu_ptr.get());

#ifdef GPU
    //check_cuda( cudaSetDevice(cur_gpu_id) );
    cuda_set_device(cur_gpu_id);
    printf(" Used GPU %d \n", cur_gpu_id);
#endif
    network &net = detector_gpu.net;
    net.gpu_index = cur_gpu_id;
    //gpu_index = i;

    _cfg_filename = cfg_filename;
    _weight_filename = weight_filename;

    char *cfgfile = const_cast<char *>(_cfg_filename.c_str());
    char *weightfile = const_cast<char *>(_weight_filename.c_str());

    net = parse_network_cfg_custom(cfgfile, 1, 1);
    if (weightfile) {
        load_weights(&net, weightfile);
    }
    set_batch_network(&net, 1);
    net.gpu_index = cur_gpu_id;
    fuse_conv_batchnorm(net);

    layer l = net.layers[net.n - 1];
    int j;

    detector_gpu.avg = (float *)calloc(l.outputs, sizeof(float));
    for (j = 0; j < NFRAMES; ++j) detector_gpu.predictions[j] = (float*)calloc(l.outputs, sizeof(float));
    for (j = 0; j < NFRAMES; ++j) detector_gpu.images[j] = make_image(1, 1, 3);

    detector_gpu.track_id = (unsigned int *)calloc(l.classes, sizeof(unsigned int));
    for (j = 0; j < l.classes; ++j) detector_gpu.track_id[j] = 1;

#ifdef GPU
    check_cuda( cudaSetDevice(old_gpu_index) );
#endif
}

所有这些代码似乎运行良好,但是当到达构造函数的末尾时,它在此行上遇到了一个异常,在该行中它似乎试图删除字符串(xmemory的132行-c:\ Program Files(x86) \ Microsoft Visual Studio 14.0 \ VC \ include \ xmemory0):
::operator delete(_Ptr);

完整的调用堆栈如下所示:
[Inline Frame] yolo_cpp_dll.dll!std::_Deallocate(void * _Ptr, unsigned __int64) Line 132
[Inline Frame] yolo_cpp_dll.dll!std::allocator<char>::deallocate(char *) Line 720
[Inline Frame] yolo_cpp_dll.dll!std::_Wrap_alloc<std::allocator<char> >::deallocate(char * _Count, unsigned __int64) Line 987
[Inline Frame] yolo_cpp_dll.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(bool) Line 2258
[Inline Frame] yolo_cpp_dll.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::{dtor}() Line 1017
yolo_cpp_dll.dll!Detector::Detector(std::basic_string<char,std::char_traits<char>,std::allocator<char> > cfg_filename, std::basic_string<char,std::char_traits<char>,std::allocator<char> > weight_filename, int gpu_id) Line 177

从有限的信息中我可以找到有关此错误的信息,似乎这是使用不同的编译器编译DLL的问题。我花了几天的时间尝试从头开始编译所有内容的不同版本-源代码中的UE4,UE4项目,YOLO cpp DLL。我已经尝试对所有内容进行完全全新的Visual Studio 2015和2017安装,每次都遇到相同的问题。

有人知道这到底是怎么回事吗?以及我如何解决它或解决它?

最佳答案

简单方法:永远不要在不同模块之间传递std::xxx对象。使用原始C类型。内存应在分配内存的模块中释放。

检测器(const char * cfg_filename,const char * weight_filename,int gpu_id)

困难方式:使用相同的编译器/选项编译所有模块(对于UE4,则特别困难)。

关于c++ - 为std::string (trying to use YOLO/Darknet inside UE4)分配内存的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60623053/

10-10 23:44