ncnn icon indicating copy to clipboard operation
ncnn copied to clipboard

推理报错core dumped

Open datuizhuang opened this issue 2 years ago • 2 comments

你好,现在我想把.param和.bin放到同一个二进制文件中,然后通过读取二进制文件再去加载模型,加载部分没有任何报错信息,但是推理的时候会报segmentation fault,请问是我读取文件方式不对么?代码如下:

static size_t getFileSize(FILE* file) {
    fseek(file, 0, SEEK_END);
    size_t read_len = ftell(file);
    fseek(file, 0, SEEK_SET);
    return read_len;
}

static size_t getFileSize(const char* filePath) {
    FILE* file = fopen(filePath, "rb");
    if (file == nullptr) {
        return 0;
    }
    size_t size = getFileSize(file);
    fclose(file);
    return size;
}

// 方法 1
std::vector<unsigned char> readFromFile1(const char* filePath) {
    FILE* file = fopen(filePath, "rb");
    std::vector<unsigned char> result;
    if (file == nullptr) {
        return result;
    }

    // 获取文件大小,尽量一次读完
    size_t fileSize = getFileSize(file);
    if (fileSize != 0) {
        result.resize(fileSize);
        size_t n = fread(&result[0], 1, fileSize, file);
        assert(n <= fileSize);
        if (n != fileSize) {
            result.resize(n);
        }
    }

    // 在读取过程当中,有可能文件大小有变化,再尝试读取
    const size_t read_len = 1024;
    char buf[read_len];
    for (;;) {
        size_t n = fread(buf, 1, read_len, file);
        result.insert(result.end(), buf, buf + n);
        if (n < read_len) {
            break;
        }
    }
    fclose(file);
    return result;
}

const char* nanodet_path = ""xxx;
ncnn::Net nanodet;
vector<unsigned char> data = readFile(nanodet_path);
unsigned char* p_data = &data[0];
{
    ncnn::Mat ncnn_data;
    ncnn_data.create(13602, (size_t) 1u);
    memcpy(ncnn_data, p_data + 4, 13602);
    int ret = nanodet.load_param_mem((const char*) nann_data);
    // ret == 0
}
{
    ncnn::Mat ncnn_data;
    ncnn_data.create(1858688, (size_t) 1u);
    memcpy(ncnn_data, p_data + 4 + 13602, 1858688);
    int ret = nanodet.load_model((const unsigned char*) ncnn_data);
    // ret == 1858688
}
ncnn::Mat in // 假设有数据
ncnn::Extractor ex = nanodet.create_extractor();
ex.input("input.1", in);
ncnn::Mat det_result;
ex.extract("792", det_result);  // 这里报错 segmentation fault(core dumped)

datuizhuang avatar Jun 30 '23 02:06 datuizhuang

{
    ncnn::Mat ncnn_data;
    ncnn_data.create(1858688, (size_t) 1u);
    memcpy(ncnn_data, p_data + 4 + 13602, 1858688);
    int ret = nanodet.load_model((const unsigned char*) ncnn_data);
    // ret == 1858688
}

这里 load model 的 ncnn_data 要维持存在着,比如放在外面的全局作用域里

nihui avatar Aug 24 '23 07:08 nihui

你好,现在我想把.param和.bin放到同一个二进制文件中,然后通过读取二进制文件再去加载模型,加载部分没有任何报错信息,但是推理的时候会报segmentation fault,请问是我读取文件方式不对么?代码如下:

static size_t getFileSize(FILE* file) {
    fseek(file, 0, SEEK_END);
    size_t read_len = ftell(file);
    fseek(file, 0, SEEK_SET);
    return read_len;
}

static size_t getFileSize(const char* filePath) {
    FILE* file = fopen(filePath, "rb");
    if (file == nullptr) {
        return 0;
    }
    size_t size = getFileSize(file);
    fclose(file);
    return size;
}

// 方法 1
std::vector<unsigned char> readFromFile1(const char* filePath) {
    FILE* file = fopen(filePath, "rb");
    std::vector<unsigned char> result;
    if (file == nullptr) {
        return result;
    }

    // 获取文件大小,尽量一次读完
    size_t fileSize = getFileSize(file);
    if (fileSize != 0) {
        result.resize(fileSize);
        size_t n = fread(&result[0], 1, fileSize, file);
        assert(n <= fileSize);
        if (n != fileSize) {
            result.resize(n);
        }
    }

    // 在读取过程当中,有可能文件大小有变化,再尝试读取
    const size_t read_len = 1024;
    char buf[read_len];
    for (;;) {
        size_t n = fread(buf, 1, read_len, file);
        result.insert(result.end(), buf, buf + n);
        if (n < read_len) {
            break;
        }
    }
    fclose(file);
    return result;
}

const char* nanodet_path = ""xxx;
ncnn::Net nanodet;
vector<unsigned char> data = readFile(nanodet_path);
unsigned char* p_data = &data[0];
{
    ncnn::Mat ncnn_data;
    ncnn_data.create(13602, (size_t) 1u);
    memcpy(ncnn_data, p_data + 4, 13602);
    int ret = nanodet.load_param_mem((const char*) nann_data);
    // ret == 0
}
{
    ncnn::Mat ncnn_data;
    ncnn_data.create(1858688, (size_t) 1u);
    memcpy(ncnn_data, p_data + 4 + 13602, 1858688);
    int ret = nanodet.load_model((const unsigned char*) ncnn_data);
    // ret == 1858688
}
ncnn::Mat in // 假设有数据
ncnn::Extractor ex = nanodet.create_extractor();
ex.input("input.1", in);
ncnn::Mat det_result;
ex.extract("792", det_result);  // 这里报错 segmentation fault(core dumped)

请问你的问题解决了吗?我是extract输出返回-100

191086 avatar Mar 26 '24 03:03 191086