我正试图在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识别它?
到目前为止我做了什么:
$ ./flow --model cfg / yolo.cfg --load bin / yolo.weights --savepb --verbalise
$ 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.如果您需要更多信息,请随时发表评论。 谢谢你的时间!
答案 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 课。