Модель Tensorflow Lite переобучена: приложение Android вылетает после замены моей модели - PullRequest
0 голосов
/ 31 мая 2018

Я следую этому уроку по тензорному свету: https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2-tflite/#5

Приложение для Android предоставляется здесь

Работает нормально, когда я устанавливаю и запускаю на мобильном телефоне Android.Но когда я заменял только что созданную цветочную модель, она всегда вылетала.Вот журналы:

05-31 22:55:46.492 581-581/? I/art: Late-enabling -Xcheck:jni
05-31 22:55:47.484 581-581/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Created a Tensorflow Lite Image Classifier.
05-31 22:55:47.496 581-598/android.example.com.tflitecamerademo D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
05-31 22:55:47.657 581-598/android.example.com.tflitecamerademo I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build:  (Ifd751822f5)
    OpenGL ES Shader Compiler Version: XE031.06.00.05
    Build Date: 01/26/16 Tue
    Local Branch: AU12_SBA
    Remote Branch: 
    Local Patches: 
    Reconstruct Branch: 
05-31 22:55:47.664 581-598/android.example.com.tflitecamerademo I/OpenGLRenderer: Initialized EGL, version 1.4
05-31 22:55:47.892 581-581/android.example.com.tflitecamerademo I/CameraManagerGlobal: Connecting to camera service
05-31 22:55:48.010 581-581/android.example.com.tflitecamerademo I/CameraManager: Using legacy camera HAL.
05-31 22:55:48.395 581-597/android.example.com.tflitecamerademo I/CameraDeviceState: Legacy camera service transitioning to state CONFIGURING
05-31 22:55:48.395 581-648/android.example.com.tflitecamerademo I/RequestThread-0: Configure outputs: 1 surfaces configured.
05-31 22:55:48.395 581-648/android.example.com.tflitecamerademo D/Camera: app passed NULL surface
05-31 22:55:48.469 581-581/android.example.com.tflitecamerademo I/Choreographer: Skipped 35 frames!  The application may be doing too much work on its main thread.
05-31 22:55:48.555 581-597/android.example.com.tflitecamerademo I/CameraDeviceState: Legacy camera service transitioning to state IDLE
05-31 22:55:48.633 581-597/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Timecost to put values into ByteBuffer: 41
05-31 22:55:48.801 581-597/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Timecost to run model inference: 169
05-31 22:55:48.853 581-597/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Timecost to put values into ByteBuffer: 43
05-31 22:55:48.985 581-597/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Timecost to run model inference: 133
05-31 22:55:48.987 581-597/android.example.com.tflitecamerademo I/RequestQueue: Repeating capture request set.
05-31 22:55:48.993 581-648/android.example.com.tflitecamerademo W/LegacyRequestMapper: convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
    Only received metering rectangles with weight 0.
    Only received metering rectangles with weight 0.
05-31 22:55:49.033 581-597/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Timecost to put values into ByteBuffer: 40
05-31 22:55:49.159 581-597/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Timecost to run model inference: 126
05-31 22:55:49.212 581-597/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Timecost to put values into ByteBuffer: 42
05-31 22:55:49.332 581-597/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Timecost to run model inference: 121
05-31 22:55:49.385 581-597/android.example.com.tflitecamerademo D/TfLiteCameraDemo: Timecost to put values into ByteBuffer: 46
05-31 22:55:49.545 581-597/android.example.com.tflitecamerademo A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0xb946ac98 in tid 597 (CameraBackgroun)

Было бы здорово, если бы кто-нибудь мог предоставить какую-либо информацию по этому вопросу

Спасибо за рассмотрение вопроса и извините за поздний ответ.Вот шаги, которые я выполнил: 1. Переучил модель, используя этот учебник: https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/index.html?index=..%2F..%2Findex#3

Команда для создания модели:

python -m scripts.retrain   
--bottleneck_dir=tf_files/bottlenecks   
--how_many_training_steps=500   
--model_dir=tf_files/models/   
--summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}"   
--output_graph=tf_files/retrained_graph.pb   
--output_labels=tf_files/retrained_labels.txt   
--architecture="${ARCHITECTURE}"   
--image_dir=/home/ganesh/Documents/Developement/MachineLearning/new_approach/flower_photos_subset

Здесь размер изображения, который я использовал: - 224 и архитектура: mobilenet_0.50_224

Я протестировал переобученную модель, и она отлично работает, используя команду:

python -m scripts.label_image \
--graph=tf_files/retrained_graph.pb  \
--image=/home/ganesh/Documents/Developement/MachineLearning/new_approach/flower_images/flower.jpeg

Это дает правильный результат. Затем я преобразовал ее в облегченную модель Tensorflow, используя:

toco \
--input_file=/tmp/output_graph.pb \
--output_file=/tmp/graph.lite \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TFLITE \
--input_shape=1,224,224,3 \
--input_array=input \
--output_array=final_result \
--inference_type=FLOAT \
--input_data_type=FLOAT

Файлы сгенерированы успешно, но когда я заменил их в приложении для Android, происходит сбой Поскольку я могу протестировать переобученную модель с помощью команды, и она дает правильные результаты, я чувствую, что естьпроблема при конвертации в облегченный формат (для Android)

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Проблема в том, что вы конвертируете модель TF в модель float tflite через toco --input_data_type=FLOAT, тогда как приложение tflite poets 2 передает ByteBuffer входные данные для модели (она преобразует изображение *От 1006 * до ByteBuffer).Первоначально он использовал квантованную модель mobilenet tflite, которая ожидала ввода Byte.Однако, когда вы заменили это своей моделью, модель начала ожидать float, но приложение подало ее Byte.Таким образом, он разбился.

Другое упомянутое вами приложение Приложение TFMobile poets 2 работает правильно, поскольку оно преобразует растровые изображения в float[], а не ByteBuffer.

Так что если вы хотитечтобы вернуться к своему первому приложению, вы можете сначала квантовать свой переобученный граф в тензорном потоке, а затем сообщить toco, что ваш ввод quantized (см. примеры командной строки toco здесь ), а затем попробовать его.снова.

(Этот скрипт взят из репозитория TensorFlow, но он не включен в установку по умолчанию).

python -m scripts.quantize_graph \
--input=tf_files/optimized_graph.pb \
--output=tf_files/rounded_graph.pb \
--output_node_names=final_result \
--mode=weights_rounded

Однако учтите, что квантование графика после обучения может привести к потере точности.Так что определенно измерить это.Другой вариант - вставить поддельные операции квантования в график во время обучения перед преобразованием в квантованный график.Это обеспечит меньшую потерю точности, но это намного больше работы.

0 голосов
/ 03 июня 2018

Я создал собственную модель таким же образом, и на этот раз я попытался с другим приложением для Android (TFMobile), это сработало :) Вот ссылка на учебник: здесь

...