Tensorflow学习笔记(七)Android端调用遇到的一个小问题
之前在Android端调用模型的时候因为是简单示范,所以都是在MainActivity中使用,没想到在继承activity类之外的类中使用居然遇到了一点小麻烦~~
之前在TF类中定义了下面的接口来加载Tensorflow的.pb模型
TF(AssetManager assetManager) {
//接口定义
Log.e("模型","TensoFlow模型文件加载");
inferenceInterface = new TensorFlowInferenceInterface(assetManager,MODEL_FILE);
Log.e("模型","TensoFlow模型文件加载成功");
}
跳进去查看一下
可以看到这里需要传入一个AssetManager
用来加载Assets资源文件夹中的.pb模型。AssetManager
提供对应用程序的原始资源文件进行访问,这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。
更加具体的AssetManager类的介绍和使用可以参考这里的文章
如果是在MainActivity中那么传入AssetManager
是非常简单的:
TF tf = new TF(getAssets());
但是在其他 非继承activity类中使用就不太一样了,这里需要用到Application类,Android中Application类用法请参考这篇文章这里直接贴出具体解决方法:
1.在ApplicationManifest.xml文件中配置自定义的Application
(1)打开ApplicationManifest.xml文件,添加
android:name= ".MyApplication"
鼠标指针点到上方 alt+enter,利用Android自动纠错创建 继承Application类的MyApplication。
2.在生成的MyApplication类中创建onCreate()方法,并且声明Context,在onCreate() 方法中使用getApplicationContext() 获取到Context,在创建一个get方法,以便其他类获取Context:
public class MyApplication extends Application {
private static Context mContext;
@Override
public void onCreate()
{
super.onCreate();
mContext = getApplicationContext();
}
public static Context getContext(){
return mContext;
}
}
这样,别的类就可以通过getContext() 来获取context了。在利用获取到的context.getAssets() 就OK了
Context My_Context;
My_Context = My_Application.getContext();
TF tf = new TF(My_Context.getAssets());
希望这篇文章对您有帮助,感谢阅读!