ncnn
ncnn copied to clipboard
推理报错core dumped
你好,现在我想把.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)
{
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 要维持存在着,比如放在外面的全局作用域里
你好,现在我想把.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