我正在尝试在Android Tensorflow上运行通过imagenet训练的mobilenet模型进行对象识别,并面对如下所述的问题。
TensorFlowInferenceInterface: Failed to load model
from 'file:///android_asset/mobilenet_imagenet.pb': java.io.IOException:
Not a valid TensorFlow Graph serialization:
NodeDef mentions attr 'data_format' not in Op<name=DepthwiseConv2dNative;
signature=input:T, filter:T -> output:T;
attr=T:type,allowed=[DT_FLOAT, DT_DOUBLE]; attr=strides:list(int);
attr=padding:string,allowed=["SAME", "VALID"]>;
NodeDef: conv_dw_1/depthwise =
DepthwiseConv2dNative[T=DT_FLOAT, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1]]
(conv1_relu/clip_by_value, conv_dw_1/depthwise_kernel/read)
我按照link中给出的教程在Android上集成了Tensorflow。我可以运行基本的CNN分类器自定义训练(使用python 2.7.12,Tensorflow 1.2在Ubuntu 16.04上),它工作正常。
我可以使用Tensorflow 1.2和1.3成功运行在Ubuntu 16.04上的python 2.7.12上通过imagenet训练的Mobilenet。现在,当我尝试运行相同的&#39; .pb&#39;在Android上的模型它给了我上面提到的错误。
初始化模型的代码如下:
TensorFlowImageClassifier c = new TensorFlowImageClassifier();
c.inferenceInterface = new TensorFlowInferenceInterface();
if (c.inferenceInterface.initializeTensorFlow(assetManager, modelFilename) != 0) {
throw new RuntimeException("TF initialization failed");
}
请为我提供解决方案或解决方法
答案 0 :(得分:4)
通过将“libandroid_tensorflow_inference_java.jar”和“libtensorflow_inference.so”更新为最新版本(即Tensorflow - 1.4),解决了上述问题。可以找到最新的“.jar”和“。so”文件here。
问题是由于Tensorflow版本不匹配造成的。在ImageNet上训练的Mobilenet分类器是基于Tensorflow - 1.3构建的,并且用于在Android上使用Tensorflow - 1.1进行推理。
答案 1 :(得分:0)
这里在主要活动java文件
中说private static final String MODEL_FILE = "file:///android_asset/expert-graph.pb";
private static final String LABEL_FILE = "file:///android_asset/labels.txt";
您的模型文件似乎是&#34; mobilenet_imagenet.pb&#34;。在此确保您的模型和标签名称与项目文件匹配后,更改您训练的输入大小。(retrain.py文件可能包含此信息。)
private static final int INPUT_SIZE = 160;//
private static final int IMAGE_MEAN = 128;
private static final float IMAGE_STD = 128;
private static final String OUTPUT_NAME = "final_result";