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.
Czy możesz opublikować komunikat o błędzie i pełne śledzenie stosu? –
@AllenLavoie Dodałem komunikat o błędzie i ślad stosu. –
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