HarmonyOS鸿蒙Next中ncnn加载模型文件和权重文件
HarmonyOS鸿蒙Next中ncnn加载模型文件和权重文件
// 初始化模型(ArkTS调用) static napi_value InitModel(napi_env env, napi_callback_info info) { // 创建成功和失败的返回值 - 修改返回值逻辑,成功返回1,失败返回0 napi_value errorCode; napi_create_int32(env, 0, &errorCode); napi_value successCode; napi_create_int32(env, 1, &successCode);
// 获取参数
size_t argc = 1;
napi_value argv[1];
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
// 获取资源管理器
NativeResourceManager* resMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
if (!resMgr) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "Get ResourceManager failed!");
return errorCode;
}
// 固定模型文件名
const char* paramFile = "model.ncnn.param";
const char* binFile = "model.ncnn.bin";
// 读取模型参数文件
std::vector<uint8_t> paramBuffer;
RawFile* paramRawFile = OH_ResourceManager_OpenRawFile(resMgr, paramFile);
if (!paramRawFile) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "Open %{public}s failed", paramFile);
return errorCode;
}
long paramFileSize = OH_ResourceManager_GetRawFileSize(paramRawFile);
if (paramFileSize <= 0) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "Get %{public}s size failed", paramFile);
OH_ResourceManager_CloseRawFile(paramRawFile);
return errorCode;
}
paramBuffer.resize(paramFileSize);
int paramReadSize = OH_ResourceManager_ReadRawFile(paramRawFile, paramBuffer.data(), paramFileSize);
OH_ResourceManager_CloseRawFile(paramRawFile);
if (paramReadSize != paramFileSize) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG,
"Read %{public}s failed: expected %{public}ld, got %{public}d",
paramFile, paramFileSize, paramReadSize);
return errorCode;
}
// 读取模型权重文件
std::vector<uint8_t> binBuffer;
RawFile* binRawFile = OH_ResourceManager_OpenRawFile(resMgr, binFile);
if (!binRawFile) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "Open %{public}s failed", binFile);
return errorCode;
}
long binFileSize = OH_ResourceManager_GetRawFileSize(binRawFile);
if (binFileSize <= 0) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "Get %{public}s size failed", binFile);
OH_ResourceManager_CloseRawFile(binRawFile);
return errorCode;
}
binBuffer.resize(binFileSize);
int binReadSize = OH_ResourceManager_ReadRawFile(binRawFile, binBuffer.data(), binFileSize);
OH_ResourceManager_CloseRawFile(binRawFile);
if (binReadSize != binFileSize) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG,
"Read %{public}s failed: expected %{public}ld, got %{public}d",
binFile, binFileSize, binReadSize);
return errorCode;
}
OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG,
"Model files loaded: param size=%{public}ld, bin size=%{public}ld",
paramFileSize, binFileSize);
// 创建模型对象
ncnn::Net* net = new ncnn::Net();
int ret = net->load_param_mem((const char*)paramBuffer.data());
if (ret != 0) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "加载参数失败: %{public}d", ret);
delete net; // 释放资源
return errorCode;
}
ret = net->load_model(binBuffer.data());
if (ret != 0) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "加载模型失败: %{public}d", ret);
delete net; // 释放资源
return errorCode;
}
// 打印模型结构信息
PrintModelInfo(net);
// 执行简单的推理测试
bool testResult = TestModelInference(net);
if (!testResult) {
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "模型推理测试失败,模型可能无法正常工作");
delete net;
return errorCode;
}
OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG,
"模型加载并验证成功!可以正常使用");
// 更新全局模型对象
if (g_net != nullptr) {
delete g_net; // 释放旧模型
}
g_net = net; // 保存新模型
return successCode;
}
模型文件读取没有问题,但是bin文件载入就报错了 load_model(binBuffer.data());
更多关于HarmonyOS鸿蒙Next中ncnn加载模型文件和权重文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,能否提供下demo和完整日志
更多关于HarmonyOS鸿蒙Next中ncnn加载模型文件和权重文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,ncnn加载模型文件和权重文件可以通过ncnn::Net
类实现。首先,使用load_param
方法加载模型文件(.param),然后使用load_model
方法加载权重文件(.bin)。示例代码如下:
ncnn::Net net;
net.load_param("model.param");
net.load_model("model.bin");
确保模型文件和权重文件路径正确,且文件格式与ncnn兼容。加载完成后,即可使用ncnn::Extractor
进行推理。
从代码和日志来看,问题主要出现在ncnn模型权重文件(bin文件)加载阶段。关键点分析:
-
日志显示参数文件(model.ncnn.param)已成功加载,但bin文件加载失败(错误码-1)
-
可能原因:
- bin文件格式不兼容(需确认是ncnn格式)
- 文件读取后数据损坏(建议检查binBuffer数据校验和)
- 模型版本与ncnn库版本不匹配
- 建议检查:
- 确认bin文件是否完整(比较原始文件和读取后的文件大小)
- 检查ncnn::Net::load_model()的返回值具体含义
- 验证模型在PC端能否正常加载
- 临时解决方案: 可以尝试改用load_model_from_memory()替代load_model():
ret = net->load_model_from_memory(binBuffer.data(), binBuffer.size());
注意确保binBuffer在模型使用期间保持有效。如果问题依旧,建议用hexdump检查bin文件头是否符合ncnn格式规范。