如何在Android Studio中添加ONNX模型作为资源文件并加载
解决Android中添加ONNX模型文件并加载的问题
一、能否添加ONNX这类二进制文件?
当然可以。Android支持将ONNX这类二进制/文本文件作为应用资源存放,推荐使用assets目录,它专门用于存放不需要系统自动生成资源ID的自定义文件(比如模型、配置文件等)。
二、详细操作步骤
步骤1:创建assets目录(如果没有)
- 打开Android Studio,在项目视图中找到
src/main目录 - 右键点击
main→ 选择New→Folder→Assets Folder - 在弹出窗口中确认
Target Source Set为main,点击Finish完成创建,最终目录结构为src/main/assets
步骤2:复制ONNX模型到assets目录
将你下载的Mobilenet ONNX文件直接拖拽到assets文件夹中,等待Android Studio完成文件同步(右下角会有同步提示)。
注意:文件名要记清楚,后续代码中要完全匹配(大小写敏感),比如你的模型文件名为
mobilenet.onnx,代码中就要用这个名字。
步骤3:修改代码加载模型
由于assets目录下的文件无法直接通过文件路径访问(打包在APK内),需要先将模型文件复制到应用的内部存储目录(无需额外权限),再加载。
3.1 添加文件复制方法
在你的Activity或工具类中添加以下方法,用于将assets中的模型复制到内部存储:
private String copyAssetToInternalStorage(Context context, String assetFileName) { // 内部存储的目标文件路径 File targetFile = new File(context.getFilesDir(), assetFileName); // 如果文件已存在且大小正常,直接返回路径 if (targetFile.exists() && targetFile.length() > 0) { return targetFile.getAbsolutePath(); } // 复制文件 try (InputStream inputStream = context.getAssets().open(assetFileName); OutputStream outputStream = new FileOutputStream(targetFile)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } return targetFile.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); return null; } }
3.2 修改模型加载代码
替换原来的Net dnnNet = Dnn.readNetFromONNX(MODEL_PATH);代码,改为:
// 调用复制方法获取模型的本地路径 String modelLocalPath = copyAssetToInternalStorage(this, "mobilenet.onnx"); if (modelLocalPath != null) { // 加载模型 Net dnnNet = Dnn.readNetFromONNX(modelLocalPath); // 后续的分类逻辑(比如图像预处理、推理等) } else { // 处理文件复制失败的情况,比如提示用户 Toast.makeText(this, "模型文件加载失败", Toast.LENGTH_SHORT).show(); }
三、常见问题排查
- 如果文件复制失败:检查assets目录下的文件名是否和代码中的一致,或者尝试
Build→Rebuild Project重新打包项目 - 如果加载时仍崩溃:确保OpenCV的DNN模块已正确集成到Android项目中,检查依赖是否完整
内容的提问来源于stack exchange,提问作者Mich
相关产品推荐
相关产品推荐

