android tensorflow ExtractImagePatches Op未找到

时间:2017-07-21 12:27:52

标签: android tensorflow build inference darkflow

我正试图在darkflow yolo模型上使用tensorflow android进行推理。我可以成功运行默认的tiny-yolo-voc模型,但是当我将模型(以及相应的参数)更改为yolo时,我得到以下异常:

java.lang.RuntimeException: Unable to resume activity {com.bendaf.tfdroidtest/com.bendaf.tfdroidtest.MainActivity}: java.lang.IllegalArgumentException: No OpKernel was registered to support Op 'ExtractImagePatches' with these attrs.  Registered devices: [CPU], Registered kernels:
  <no registered kernels>

   [[Node: ExtractImagePatches = ExtractImagePatches[T=DT_FLOAT, ksizes=[1, 2, 2, 1], padding="VALID", rates=[1, 1, 1, 1], strides=[1, 2, 2, 1]](47-leaky)]]
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3841)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3882)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
    at android.app.ActivityThread.-wrap14(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1639)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6780)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
 Caused by: java.lang.IllegalArgumentException: No OpKernel was registered to support Op 'ExtractImagePatches' with these attrs.  Registered devices: [CPU], Registered kernels:
  <no registered kernels>

   [[Node: ExtractImagePatches = ExtractImagePatches[T=DT_FLOAT, ksizes=[1, 2, 2, 1], padding="VALID", rates=[1, 1, 1, 1], strides=[1, 2, 2, 1]](47-leaky)]]
    at org.tensorflow.Session.run(Native Method)
    at org.tensorflow.Session.access$100(Session.java:48)
    at org.tensorflow.Session$Runner.runHelper(Session.java:295)
    at org.tensorflow.Session$Runner.run(Session.java:245)
    at org.tensorflow.contrib.android.TensorFlowInferenceInterface.run(TensorFlowInferenceInterface.java:143)
    at org.tensorflow.contrib.android.TensorFlowInferenceInterface.run(TensorFlowInferenceInterface.java:112)
    at com.bendaf.tfdroidtest.inference.InferenceRunner.runInference(InferenceRunner.java:44)
    at com.bendaf.tfdroidtest.MainActivity.runInferenceWithTiming(MainActivity.java:65)
    at com.bendaf.tfdroidtest.MainActivity.onResume(MainActivity.java:59)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1277)
    at android.app.Activity.performResume(Activity.java:7094)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3818)
      ... 10 more

我假设关于this问题评论,提到了tensracflow无法识别ExtracImagePatches运算符。 但是如何在我的Android设备上让tensorflow识别它?

到目前为止我做了什么:

  • 根据this从yolo.cfg生成带有暗流的yolo.pb文件。 (使用相同的命令生成了tiny-yolo-voc.pb):
  

$ ./flow --model cfg / yolo.cfg --load bin / yolo.weights --savepb   --verbalise

  • 根据this可能的解决方案优化了yolo.pb文件 并将它放到我的android项目的资产文件夹:
  

$ bazel-bin / tensorflow / tools / graph_transforms / transform_graph --in_graph = .. / darkflow / darkflow / built_graph / yolo.pb --out_graph = .. / android / test / TfDroidTest / app / src / main / assets / optimized_yolo.pb --inputs ='input' - 输出='输出'--transforms ='strip_unused_nodes(type = float,shape =“1,2,2,1”)fold_constants(ignore_errors = true)fold_batch_norms fold_old_batch_norms “

  • 根据this修改我的tensorflow/contrib/makefile/tf_op_files.txt以包含行tensorflow/core/kernels/extract_image_patches_op.cc

  • 使用以下命令重建android tensorflow:

  

$ cd tensorflow / contrib / makefile /&amp;&amp; ./build_all_android.sh& amp;&amp; cd -

     

$ ./configure

     

$ bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so --crosstool_top = // external:android / crosstool --host_crosstool_top = @ bazel_tools // tools / cpp:toolchain --cpu = arm64- V8A

     

$ bazel build // tensorflow / contrib / android:android_tensorflow_inference_java

并将.so和.jar文件添加到我的android项目中。

  • 使用原生支持重建和部署我的android项目。这是我的InferenceRunner.java的相关部分:

    mInferenceInterface.feed(INPUT_NODE, floatValues, 1, mInputSize, mInputSize, 3);
    mInferenceInterface.run(new String[]{OUTPUT_NODE});
    
    final float[] resu =
            new float[mGridSize * mGridSize * (mNumOfLabels + 5) * 5];
    mInferenceInterface.fetch(OUTPUT_NODE, resu);
    

在第二行抛出异常。正如我上面提到的,这适用于tiny-yolo-voc模型,但不适用于yolo模型。

我在Ubuntu 16.04,android API级别24.如果您需要更多信息,请随时发表评论。 谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

将实现添加到构建

如果你正在使用Bazel,你需要将你找到的文件添加到 android_extended_ops_group1或android_extended_ops_group2 目标。您可能还需要包含它们所依赖的任何.cc文件 那里。如果构建抱怨缺少头文件,请添加.h 在android_extended_ops目标中需要。

如果你正在使用makefile,请转到tensorflow / contrib / makefile / tf_op_files.txt并在那里添加正确的实现文件。

答案 1 :(得分:0)

如果您使用Darkflow,则可以尝试在。\ darkflow \ net \ ops卷积中更改/交换方法名称(转发和_forward )。 reorg 课。

请参阅参考资料:using graph-yolo.pb error android example