Мы пытаемся запустить модель семантической сегментации на android с помощью deeplabv3 и mobilenetv2. Мы следовали официальной процедуре преобразования tensorflow 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 --pesput_IZE_Type_input_arrays = 1,28input_arrays - --inference_type = FLOAT --mean_values = 128 --std_dev_values = 127 --allow_custom_ops --post_training_quantize
Размер файла 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 проблема должна быть исправлена.
Также приложение Android не смогло правильно загрузить модель (интерпретатор tflite)
Итак, как мы можем правильно преобразовать модель сегментации в формат tflite, который можно использовать для вывода на устройстве Android?
ОБНОВИТЬ:-
Используя тензорный поток 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.
Кроме того, при использовании более новой версии той же модели (файл .pb 3 МБ) с depth_multiplier = 0,5 из tensorflow deeplab модель зоопарка, мы получили другую ошибку: -
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 в качестве вывода. Похоже, это проблема со значениями множителя глубины. (Даже мы пытались указать параметр depth_multiplier в качестве аргумента. на момент конвертации).