Android тензор потока ExtractImagePatches Op не найден
Я пытаюсь выполнить вывод с помощью Android тензорного потока на модели Yolo Darkflow. Я мог бы успешно запустить модель по умолчанию 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
Я предполагаю в отношении этого вопроса, что оператор ExtracImagePatches не был распознан tenorflow. Но как я могу заставить tenorflow распознавать его на моем устройстве Android?
Что я сделал до сих пор:
- сгенерировал файл yolo.pb с darkflow из yolo.cfg в соответствии с этим. (С помощью той же команды я сгенерировал tiny-yolo-voc.pb):
$./flow --model cfg / yolo.cfg - загрузить bin/yolo.weights --savepb --verbalise
- оптимизировал файл yolo.pb в соответствии с этим возможным решением и поместил его в папку ресурсов моего проекта Android:
$ bazel-bin / tenorflow/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' --outputs='output' --transforms='strip_unused_nodes(type=float, shape="1,2,2,1") fold_constants(ignore_errors=true) fold_batch_norms fold_old_batch_norms'
Модифицированный мой
tensorflow/contrib/makefile/tf_op_files.txt
содержать строкуtensorflow/core/kernels/extract_image_patches_op.cc
в соответствии с этим.Восстановить тензор потока Android с помощью этих команд:
$ cd tenorflow / contrib / makefile / &&./build_all_android.sh && 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 // tenorflow/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);
исключение выдается во второй строке. Как я упоминал выше, это работает с моделью крошечного йоло-вока, но не с моделью йоло.
Я нахожусь на Ubuntu 16.04, Android API уровня 24. Если вам нужна дополнительная информация, не стесняйтесь комментировать. Спасибо за ваше время!
1 ответ
Добавьте реализацию в сборку
Если вы используете Bazel, вам нужно добавить найденные файлы в целевые объекты android_extended_ops_group1 или android_extended_ops_group2. Вам также может понадобиться включить туда любые файлы.cc, от которых они зависят. Если сборка жалуется на отсутствующие заголовочные файлы, добавьте необходимые.h в цель android_extended_ops.
Если вы используете make-файл, перейдите в tenorflow/contrib/makefile/ tf_op_files.txt и добавьте туда правильные файлы реализации.
Если вы используете Darkflow, вы можете попробовать изменить / поменять местами имена методов (forward и _forward) в классе реорганизации.\ Darkflow\net\ops convolution.py.
См. Ссылку: использование примера ошибки graph-yolo.pb для Android