itlab-vision / dl-benchmark

Deep Learning Inference benchmark. Supports OpenVINO™ toolkit, Caffe, TensorFlow, TensorFlow Lite, ONNX Runtime, OpenCV DNN, MXNet, PyTorch, Apache TVM, ncnn, etc.
http://hpc-education.unn.ru/dli
Apache License 2.0
27 stars 37 forks source link

Ошибка при запуске вывода TensorFlow #432

Closed valentina-kustikova closed 11 months ago

valentina-kustikova commented 11 months ago

Запускаю скрипт вывода TensorFlow для модели inception_v4 с использованием командной строки:

python inference_tensorflow.py --model /home/itmm/Documents/kustikova_v/public/googlenet-v4-tf/inception_v4.frozen.pb --input /home/itmm/Documents/kustikova_v/data/ --batch_size 3 --task classification --input_name input --output_names InceptionV4/Logits/Predictions --labels labels/image_net_synset_first_class_base.txt --input_shape 299 299 3 --mean 127.5 127.5 127.5 --input_scale 127.7

В результате получаю следующую ошибку.

[ INFO ] Preparing input data: ['/home/itmm/Documents/kustikova_v/data/']
Traceback (most recent call last):
  File "/home/itmm/Documents/kustikova_v/upstream/dl-benchmark/src/inference/inference_tensorflow.py", line 318, in <module>
    sys.exit(main() or 0)
  File "/home/itmm/Documents/kustikova_v/upstream/dl-benchmark/src/inference/inference_tensorflow.py", line 291, in main
    io.prepare_input(graph, args.input)
  File "/home/itmm/Documents/kustikova_v/upstream/dl-benchmark/src/inference/io_adapter.py", line 177, in prepare_input
    self.__parse_input_instance(input_[0], input_blob, model)
  File "/home/itmm/Documents/kustikova_v/upstream/dl-benchmark/src/inference/io_adapter.py", line 158, in __parse_input_instance
    element_type = self._io_model_wrapper.get_input_layer_dtype(model, input_blob)
  File "/home/itmm/Documents/kustikova_v/upstream/dl-benchmark/src/inference/io_model_wrapper.py", line 101, in get_input_layer_dtype
    return graph.get_tensor_by_name(layer_name).dtype.as_numpy_dtype
  File "/home/itmm/miniconda/envs/tensorflow_env_3.9/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 2999, in get_tensor_by_name
    return self.as_graph_element(name, allow_tensor=True, allow_operation=False)
  File "/home/itmm/miniconda/envs/tensorflow_env_3.9/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 2856, in as_graph_element
    return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
  File "/home/itmm/miniconda/envs/tensorflow_env_3.9/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 2938, in _as_graph_element_locked
    raise ValueError(err_msg)
ValueError: The name 'input' refers to an Operation, not a Tensor. Tensor names must be of the form "<op_name>:<output_index>".

При этом, если запускаю ту же модель, но в формате savedmodel (командная строка ниже). Все работает нормально.

python inference_tensorflow.py --model /home/itmm/Documents/kustikova_v/public/googlenet-v4-tf/saved_model --input /home/itmm/Documents/kustikova_v/data/ --batch_size 3 --task classification --output_names InceptionV4/Logits/Predictions --labels labels/image_net_synset_first_class_base.txt --input_shape 299 299 3 --mean 127.5 127.5 127.5 --input_scale 127.7

Подскажите, пожалуйста, в чем проблема?

valentina-kustikova commented 11 months ago

Также есть проблема с запуском моделей в формате meta. Командная строка для модели efficientnet-b0 ниже. Но здесь я похоже не могу угадать название входного тензора. Использую название input, как написано в документации.

 python inference_tensorflow.py --model /home/itmm/Documents/kustikova_v/public/efficientnet-b0/efficientnet-b0/model.ckpt.meta --input /home/itmm/Documents/kustikova_v/data/ --batch_size 3 --task classification --output_names logits --labels labels/image_net_synset_first_class_base.txt --input_shape 224 224 3 --input_name input

Результат:

[ INFO ] Converting to saved model into folder /home/itmm/Documents/kustikova_v/public/efficientnet-b0/efficientnet-b0/saved_model
Traceback (most recent call last):
  File "/home/itmm/miniconda/envs/tensorflow_env_3.9/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 2894, in _as_graph_element_locked
    op = self._get_operation_by_name(op_name)
KeyError: ''

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/itmm/Documents/kustikova_v/upstream/dl-benchmark/src/inference/inference_tensorflow.py", line 318, in <module>
    sys.exit(main() or 0)
  File "/home/itmm/Documents/kustikova_v/upstream/dl-benchmark/src/inference/inference_tensorflow.py", line 274, in main
    model, _ = load_model(model_path,
  File "/home/itmm/Documents/kustikova_v/upstream/dl-benchmark/src/model_converters/tf2tflite/tensorflow_common.py", line 140, in load_model
    convert_to_saved_model(model_graph, input_names, output_names, str(model_path))
  File "/home/itmm/Documents/kustikova_v/upstream/dl-benchmark/src/model_converters/tf2tflite/tensorflow_common.py", line 55, in convert_to_saved_model
    inputs[input_name] = g.get_tensor_by_name(f'{input_name}:0')
  File "/home/itmm/miniconda/envs/tensorflow_env_3.9/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 2999, in get_tensor_by_name
    return self.as_graph_element(name, allow_tensor=True, allow_operation=False)
  File "/home/itmm/miniconda/envs/tensorflow_env_3.9/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 2856, in as_graph_element
    return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
  File "/home/itmm/miniconda/envs/tensorflow_env_3.9/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 2896, in _as_graph_element_locked
    raise KeyError(
KeyError: "The name 'input:0' refers to a Tensor which does not exist. The operation, 'input', does not exist in the graph."
n-berezina-nn commented 11 months ago

@valentina-kustikova приложите пожалуйста файл модели или дайте сылку, откуда можно скачать

valentina-kustikova commented 11 months ago

@valentina-kustikova приложите пожалуйста файл модели или дайте сылку, откуда можно скачать

@n-berezina-nn, обе модели загружаю через omz_downloader --name googlenet-v4-tf,efficientnet-b0

n-berezina-nn commented 11 months ago

для efficientnet-b0 попробуйте "input_name": "sub:0", "output_names": "logits"

valentina-kustikova commented 11 months ago

для efficientnet-b0 попробуйте "input_name": "sub:0", "output_names": "logits"

Спасибо, при такой комбинации вывод efficientnet-b0 заработал, в документации к модели вход называется input :)

n-berezina-nn commented 11 months ago

@valentina-kustikova лучше всего открыть файл модели через сервис https://netron.app/ и посмотреть как реально называются входы и выходы модели. для googlenet я могу посмотреть позже в течение дня, если нужно

valentina-kustikova commented 11 months ago

@valentina-kustikova лучше всего открыть файл модели через сервис https://netron.app/ и посмотреть как реально называются входы и выходы модели. для googlenet я могу посмотреть позже в течение дня, если нужно

Да, спасибо, буду очень благодарна.

n-berezina-nn commented 11 months ago

@valentina-kustikova для inception-v4 вход называется input:0, с ним у меня прошла конвертация. Пожалуйста попробуйте.

Название входов и выходов нужны для конвертации в saved model, если у вас уже изначально модель в saved model формате, то такая конвертация не требуется, поэтому в вашем случае инференс работал. Формат Frozen Graph объявлен как deprecated в TF2, поэтому для того чтобы производить инференс с помощью tf2 API все форматы отличные от saved model приводятся к saved model.

valentina-kustikova commented 11 months ago

@valentina-kustikova для inception-v4 вход называется input:0, с ним у меня прошла конвертация. Пожалуйста попробуйте.

Название входов и выходов нужны для конвертации в saved model, если у вас уже изначально модель в saved model формате, то такая конвертация не требуется, поэтому в вашем случае инференс работал. Формат Frozen Graph объявлен как deprecated в TF2, поэтому для того чтобы производить инференс с помощью tf2 API все форматы отличные от saved model приводятся к saved model.

Поняла. Спасибо большое за помощь! Принесу попозже небольшой фикс в валидации классификационных моделей.