Android应用从Firebase加载自定义ML模型报错问题咨询
错误原因及修复方案
以下是你代码和配置中可能存在的问题,按出现概率从高到低排列:
- 下载类型参数错误:你调用
getModel时传入的DownloadType.LOCAL_MODEL仅会读取设备本地已缓存的模型,首次加载时设备没有缓存就会直接抛出状态异常。你需要替换为DownloadType.LATEST_MODEL,让SDK优先拉取云端最新版本,本地有对应版本缓存时才会复用本地文件。 - 网络条件限制不匹配:你设置了
.requireWifi()的下载条件,如果测试设备当前使用的是移动数据,不会触发下载流程,也会返回该错误。测试阶段可先注释掉该限制,验证流程通了之后再按需开启。 - 模型名称不匹配:代码中填写的模型名
FindFunc需要和Firebase控制台中上传的模型名称完全一致,大小写、拼写差一个字符都会导致SDK找不到对应模型,抛出异常。 - 项目配置不匹配:需要确认你App中使用的
google-services.json文件和你上传模型的Firebase项目是同一个,配置文件不匹配会导致没有权限拉取模型。 - 异步逻辑时序问题:模型下载是异步操作,你在构造方法中启动下载,若调用
getInterpreter()时下载还未完成,拿到的就是空值,也会引发相关错误。建议你增加下载完成的回调,上层收到回调后再获取Interpreter实例。
修正后的核心代码示例
public class ImportUnFuncModel { private Interpreter interpreter = null; private static final String TAG = "ImportUnFuncModel"; // 可选:增加回调接口通知上层下载状态 public interface OnModelLoadListener { void onLoadSuccess(Interpreter interpreter); void onLoadFail(Exception e); } public ImportUnFuncModel(OnModelLoadListener listener) { CustomModelDownloadConditions conditions = new CustomModelDownloadConditions.Builder() // 测试阶段可注释掉WiFi要求 // .requireWifi() .build(); FirebaseModelDownloader.getInstance() // 替换为LATEST_MODEL .getModel("FindFunc", DownloadType.LATEST_MODEL, conditions) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.i(TAG, "onFailure exception : " + e.toString()); if(listener != null) { listener.onLoadFail(e); } } }) .addOnSuccessListener(new OnSuccessListener<CustomModel>() { @Override public void onSuccess(CustomModel model) { Log.i(TAG, "onSuccess model : " + model.toString()); File modelFile = model.getFile(); if (modelFile != null) { interpreter = new Interpreter(modelFile); Log.i(TAG, "onSuccess interpreter has been created successful : " + modelFile.toString()); if(listener != null) { listener.onLoadSuccess(interpreter); } } } }); } public Interpreter getInterpreter() { return interpreter; } }
内容的提问来源于stack exchange,提问作者Roman Kazmin
相关产品推荐
相关产品推荐

