Мы пытаемся запустить модель семантической сегментации на Android с использованием deeplabv3 и mobilenetv2.Мы следовали официальной процедуре преобразования тензорного потока Lite с использованием TOCO и tflite_convert с помощью bazel. Исходный замороженный график был получен из официального TensorFlow DeepLab Model Zoo .
Мы смогли успешно преобразовать модель с помощью следующей команды: -
CUDA_VISIBLE_DEVICES = "0" toco --output_file = toco256.tflite
--graph_def_file = путь / к / deeplab / deeplabv3_mnv2_pascal_trainval / frozen_inference_graph.pb
--input_arrays = ImageTensor --output_arrays = SemanticPredictions --input_shapes = 1,256,256,3 --inference_input_type = QUANTIZED_UINT8 --inference_type = FLOAT --mean_values = 128 --std_dev_values = 127 --allow_custom_ops --post_training_ops
Размер файла tflite составлял около 2,25 Мб. Но когда мы попытались протестировать модель с использованием официального инструмента для тестирования производительности, произошел сбой со следующим сообщением об ошибке: -
bazel run -c opt tensorflow/contrib/lite/tools/benchmark:benchmark_model -- --graph=`realpath toco256.tflite`
INFO: Analysed target //tensorflow/contrib/lite/tools/benchmark:benchmark_model (0 packages loaded).
INFO: Found 1 target...
Target //tensorflow/contrib/lite/tools/benchmark:benchmark_model up-to-date:
bazel-bin/tensorflow/contrib/lite/tools/benchmark/benchmark_model
INFO: Elapsed time: 0.154s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action
INFO: Running command line: bazel-bin/tensorflow/contrib/lite/tools/benchmark/benchmark_model '--graph=path/to/deeplab/venINFO: Build completed successfully, 1 total action
STARTING!
Num runs: [50]
Inter-run delay (seconds): [-1]
Num threads: [1]
Benchmark name: []
Output prefix: []
Warmup runs: [1]
Graph: path/to/venv/tensorflow/toco256.tflite]
Input layers: []
Input shapes: []
Use nnapi : [0]
Loaded model path/to/venv/tensorflow/toco256.tflite
resolved reporter
Initialized session in 45.556ms
Running benchmark for 1 iterations
tensorflow/contrib/lite/kernels/pad.cc:96 op_context.dims != 4 (3 != 4)
Node number 24 (PAD) failed to prepare.
Failed to invoke!
Aborted (core dumped)
Мы также попробовали эту же команду без включения параметров allow_custom_ops и post_training_quantize и даже использовали тот же размер ввода, что и 1,513,513,3; но результат был тот же.
Эта проблема похожа на следующую проблему с github:
(https://github.com/tensorflow/tensorflow/issues/21266). Однако в последней версии TensorFlow проблема должна быть исправлена.
Модель: http://download.tensorflow.org/models/deeplabv3_mnv2_pascal_trainval_2018_01_29.tar.gz
Версия Tensorflow: 1.11
Базель версия: 0.17.2
ОС: Ubuntu 18.04
Также приложение для Android не смогло загрузить модель должным образом (tflite interpretr)
Итак, как мы можем правильно преобразовать модель сегментации в формат tflite, который можно использовать для вывода на устройстве Android?
UPDATE: -
Используя tensflow 1.12, мы получили новую ошибку:
$ bazel run -c opt tensorflow/lite/tools/benchmark:benchmark_model -- --graph=`realpath /path/to/research/deeplab/venv/tensorflow/toco256.tflite`
tensorflow/lite/kernels/depthwise_conv.cc:99 params->depth_multiplier * SizeOfDimension(input, 3) != SizeOfDimension(filter, 3) (0 != 32)
Node number 30 (DEPTHWISE_CONV_2D) failed to prepare.
Кроме того, при использовании более новой версии той же модели (файл 3 МБ .pb) с deep_multiplier = 0,5 из тензорного потока deeplab модель zoo , мы получили другую ошибку: -
F tensorflow/lite/toco/graph_transformations/propagate_fixed_sizes.cc:116] Check failed: dim_x == dim_y (3 vs. 32)Dimensions must match
В этом случае мы использовали ту же вышеупомянутую команду для преобразования tflite, но мы даже не смогли создать файл 'tflite' в качестве вывода. Кажется, это проблема со значениями множителя глубины. (Даже если мы попытались дать глубину_множителя параметр в качестве аргумента во время преобразования).