2017-05-19 23 views
7

Przede wszystkim zostały poszukiwania to dla ostatnich 2 dni i nie był w stanie znaleźć coś związane z tym inne niż to stackoverflow postu - How to read tensorflow memory mapped graph file in android?Jak odczytać pamięci mapowane wykres w android użyciu tensorflow

I Z powodzeniem udało się zbudować tensorflow dla Androida z repo, podążając za tym linkiem - https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android/

Udało mi się zintegrować funkcję wykrywania z moim projektem za pomocą ClassifierActivity i mogłem załadować i odczytać niestandardowy wykres z tego. Mogłem przeczytać plik retrained_graph.pb lub stripped_graph.pb, a nawet optimized_graph.pb, używając mojej aplikacji.

użyłem bazel build tensorflow/python/tools:optimize_for_inference

bazel build tensorflow/python/tools:strip_unused

poleceń, aby uzyskać zoptymalizowane i pozbawione wykresy (chociaż wykresy są łatwo dostępne od strony serwera).

Ale przy użyciu wykresu odwzorowanego w pamięci, pojawia się błąd, który uniemożliwił odczytanie wykresu.

Z powyższego stackoverflow link byłem pewien, że można to zrobić jakoś. Ale nie znalazłem żadnej pomocy w sieci, aby to zrobić ze strony Androida.

Proszę, poprowadzić mnie do niektórych postów lub forów, które mogą dostarczyć wiele informacji o tym, jak można to zrobić. Nie publikuję żadnego kodu, ponieważ postępowałem zgodnie z github systemu Android tensorflow, aby działało i utknąłem z tym tylko.

Z góry dziękuję za radę.

Aktualizacja

Po to błąd otrzymuję przy próbie odczytania pamięci mapowane wykres

FATAL EXCEPTION: main Process: nanob2c.nano.com.nanob2c, PID: 2632 
java.lang.RuntimeException: Failed to load model from 'file:///android_asset/optimized_mmapped_graph.pb' 
    at org.tensorflow.contrib.android.TensorFlowInferenceInterface.<init>(TensorFlowInferenceInterface.java:100) 
    at nanob2c.nano.com.nanob2c.tensorflow.core.TensorFlowImageClassifier.create(TensorFlowImageClassifier.java:109) 
    at nanob2c.nano.com.nanob2c.tensorflow.ClassifierActivity.onPreviewSizeChosen(ClassifierActivity.java:147) 
    at nanob2c.nano.com.nanob2c.tensorflow.core.CameraActivity$3.onPreviewSizeChosen(CameraActivity.java:603) 
    at nanob2c.nano.com.nanob2c.tensorflow.core.CameraConnectionFragment.setUpCameraOutputs(CameraConnectionFragment.java:425) 
    at nanob2c.nano.com.nanob2c.tensorflow.core.CameraConnectionFragment.openCamera(CameraConnectionFragment.java:432) 
    at nanob2c.nano.com.nanob2c.tensorflow.core.CameraConnectionFragment.access$000(CameraConnectionFragment.java:68) 
    at nanob2c.nano.com.nanob2c.tensorflow.core.CameraConnectionFragment$1.onSurfaceTextureAvailable(CameraConnectionFragment.java:99) 
    at android.view.TextureView.getHardwareLayer(TextureView.java:368) 
    at android.view.View.updateDisplayListIfDirty(View.java:15175) 
    at android.view.View.draw(View.java:15971) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:3610) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 
    at android.view.View.updateDisplayListIfDirty(View.java:15193) 
    at android.view.View.draw(View.java:15971) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:3610) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 
    at android.view.View.draw(View.java:16204) 
    at android.view.View.updateDisplayListIfDirty(View.java:15198) 
    at android.view.View.draw(View.java:15971) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:3610) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 
    at android.view.View.updateDisplayListIfDirty(View.java:15193) 
    at android.view.View.draw(View.java:15971) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:3610) 
    at android.support.design.widget.CoordinatorLayout.drawChild(CoordinatorLayout.java:1195) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 
    at android.view.View.draw(View.java:16204) 
    at android.view.View.updateDisplayListIfDirty(View.java:15198) 
    at android.view.View.draw(View.java:15971) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:3610) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 
    at android.view.View.updateDisplayListIfDirty(View.java:15193) 
    at android.view.View.draw(View.java:15971) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:3610) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 
    at android.view.View.updateDisplayListIfDirty(View.java:15193) 
    at android.view.View.draw(View.java:15971) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:3610) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 
    at android.view.View.updateDisplayListIfDirty(View.java:15193) 
    at android.view.View.draw(View.java:15971) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:3610) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 
    at android.view.View.updateDisplayListIfDirty(View.java:15193) 
    at android.view.View.draw(View.java:15971) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:3610) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400) 
    at android.view.View.draw(View.java:16204) 
    at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690) 
    at android.view.View.updateDisplayListIfDirty(View.java:15198) 
    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:282) 
    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:288) 
    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:323) 
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:2642) 
    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2461) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2094) 
    at android.view.ViewRootImpl.doTraversal(ViewRo 

Aktualizacja - 23 maja 2017

Od blogpost Pete naczelnika - https://petewarden.com/2016/09/27/tensorflow-for-mobile-poets/

Jest oczywiste, że możemy odczytać niepobrany wykres w urządzeniach mobilnych Wspomniano, że - Jedną z rzeczy, na którą należy zwrócić uwagę, jest to, że plik na dysku nie jest już zwykłym protobufem GraphDef, więc jeśli spróbujesz załadować go do programu takiego jak label_image, który oczekuje, zobaczysz błędy. Musisz załadować plik modelu nieco inaczej, co pokażemy w poniższym przykładzie na iOS.

Poszukuję implementacji tego samego w Androidzie.

+0

Czy możesz opublikować komunikat o błędzie i pełne śledzenie stosu? –

+0

@AllenLavoie Dodałem komunikat o błędzie i ślad stosu. –

+0

czy nadal robisz to z bazelem? Wiesz, że teraz wypuścili zależności gradowe z wcześniej zbudowanymi wykresami. Nie jestem pewien, czy to pomoże – Blundell

Odpowiedz

1

Po wykonaniu niektórych badań z wyjątkiem zakończyłem here, do metody loadGraph() (który jest awarią aplikacji).

Wydaje się, że obecnie ładowanie pamięci mapowane wykres nie jest obsługiwana w Android realizacji używasz, w rzeczywistości w linii #376 jest TODO do polecania proszą (lub przynajmniej jest to coś związane)

+0

Negatywne głosy bez wyjaśnienia ... ok ... – MatPag

+0

Dałem ci +1, co powinno anulować 5 -1. – MaxB

+0

Dziękuję człowieku :) – MatPag

4

O ile sprawdziłem w Internecie i na blogu Pete'a Wardena obsługa map odwzorowanych w pamięci nie jest obsługiwana od strony Androida. Również to samo zostało wymienione przez MatPag jako odpowiedź.

Ale na to trzeba popracować. O ile przeszukaliśmy, możemy zmienić ustawienia na części JNI i umożliwić obsługę mapy z tej strony. Moje odkrycia zawrzeć z dokonywania zmian na następujących plików może dostać pracę wokół tego (nie jestem sukcesy jeszcze) -

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/java/src/main/native/tensor_jni.cc

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/java/src/main/native/graph_jni.cc

Należy również zaktualizować odpowiednie pliki na części java -

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/java/src/main/java/org/tensorflow/Tensor.java

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/java/src/main/java/org/tensorflow/NativeLibrary.java

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/java/org/tensorflow/contrib/android/TensorFlowInferenceInterface.java

Będzie aktualizować odpowiedź, jeśli mi się to uda.

Dziękuję wszystkim za dostarczenie ważnych informacji na ten temat, ponieważ wszystko to bardzo pomogło mi w znalezieniu rozwiązania.