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

Другие вопросы по тегам