Скомпилированная модель Google Coral Edge TPU - вывод всегда почти одинаковый

Я пытаюсь получить модель Mobilenetv2 (последние слои переобучены в мой набор данных) для работы на краю Google TPU Coral. Я могу квантовать и скомпилировать модель с помощью 'edgetpu_compiler' (перешел на эту страницу https://coral.withgoogle.com/docs/edgetpu/compiler/#usage). Но когда я запускаю логический вывод в TPU, я получаю аналогичный вывод для очень разных входных изображений.

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

tflite_convert --output_file=./model.tflite 
--keras_model_file=models/MobileNet2_best-val-acc.h5 --output_format=TFLITE
--inference_type=QUANTIZED_UINT8 --default_ranges_min=0 --default_ranges_max=6 
--std_dev_values=127 --mean_values=128 --input_shapes=1,482,640,3 --input_arrays=input_2

Затем я использовал инструмент edgetpu_compiler, чтобы скомпилировать его для TPU:

sudo edgetpu_compiler  model.tflite
Edge TPU Compiler version 2.0.258810407
INFO: Initialized TensorFlow Lite runtime.

Model compiled successfully in 557 ms.

Input model: model.tflite
Input size: 3.44MiB
Output model: model_edgetpu.tflite
Output size: 4.16MiB
On-chip memory available for caching model parameters: 4.25MiB
On-chip memory used for caching model parameters: 3.81MiB
Off-chip memory used for streaming uncached model parameters: 0.00B
Number of Edge TPU subgraphs: 1
Total number of operations: 71
Operation log: model_edgetpu.log
See the operation log file for individual operation details.

Затем, когда я запускаю вывод, используя этот код:

...
labels = ["Class1", "Class2", "Class3", "Class4"]
results = engine.ClassifyWithImage(img, top_k=4)
for result in results:
    print('---------------------------')
    print(labels[result[0]])
    print('Score : ', result[1])

Результат выглядит следующим образом (при условии, что метки ["Class1", "Class2", "Class3", "Class4"]):

---------------------------
Class1
Score :  0.2890625
---------------------------
Class2
Score :  0.26953125
---------------------------
Class3
Score :  0.21875
---------------------------
Class4
Score :  0.21875

Это почти то же самое для любого входного изображения, и обычно первые два класса имеют одинаковое (или очень похожее) значение (одинаковое для 3-го и 4-го), как показано в примере, показанном выше. Для одного класса должно быть 0,99 (as it is in the .h5 model or even in the .tflite model without quantization)

Может это что-то с параметрами -default_ranges_min=0 --default_ranges_max=6 --std_dev_values=127 --mean_values=128? Как их посчитать?

Изменить 1:

Используя ответ из этого сообщения, я пробовал чтобы квантовать модель, используя оба --std_dev_values=127 --mean_values=128 and --std_dev_values=255 --mean_values=0, но я все еще получаю вывод мусора. Поскольку mobilenet2 использует relu6, диапазоны по умолчанию должны быть -default_ranges_min=0 --default_ranges_max=6 правильно?

Модель представляет собой переобученную MobileNetv2, входное изображение - изображение RGB (3 канала), входная форма - 1,482,640,3.


person Paulo Ribeiro    schedule 09.09.2019    source источник
comment
Привет, Пауло, ты решил проблему? У меня аналогичная проблема с мобильной сетью V1. не знаю, как это решить. только что разместил здесь вопрос: stackoverflow.com/questions/57869149/   -  person MMH    schedule 10.09.2019
comment
Пока нет, тем временем я пытаюсь переобучить уже квантованную модель mobilenetv1, следуя этому руководству: coral.withgoogle.com/docs/edgetpu/   -  person Paulo Ribeiro    schedule 10.09.2019
comment
Coral использует подушку для уменьшения входного изображения перед выводом. Различные версии подушек могут давать немного разные входные тензоры. Не могли бы вы проверить версию подушки на вашей платформе? Можете ли вы также попытаться уменьшить масштаб входного изображения до входного размера модели и протестировать с этим изображением?   -  person Manoj    schedule 17.09.2019


Ответы (1)


Из вашего комментария к mobilenetv1 похоже, что вы берете переобученную модель с плавающей запятой и конвертируете ее в TFLite. Вы намеревались его квантовать, выполнив указанную вами команду.

Я бы порекомендовал вам внимательнее ознакомиться с документацией TensorFlow lite. В общем, есть два способа квантования (выполнение во время тренировки и выполнение после тренировки). Подход, который вы, кажется, хотите использовать, - это посттренировочный подход.

Правильный способ сделать это после тренировки для чего-то вроде Coral - следовать этому руководству (https://www.tensorflow.org/lite/performance/post_training_integer_quant), как рекомендовано здесь командой Coral (https://coral.withgoogle.com/news/updates-07-2019/).

Схема, которую вы используете выше, больше ориентирована на квантование времени обучения.

person Alan Chiao    schedule 14.09.2019
comment
Комментарий к mobilenetv1 представляет собой подход к квантованию обучения, но, как я сказал в комментарии, это альтернатива квантованию после обучения, которое я описал в посте. Я все еще хочу выяснить, что я делаю неправильно при посттренировочном квантовании переобученной модели mobilenetv2, которая у меня уже есть. - person Paulo Ribeiro; 16.09.2019
comment
Чтобы уточнить: использование tflite_convert с установкой inference_type = QUANTIZED_UINT8, default_ranges_min, default_ranges_max = 6, std_dev_values ​​= 127 --mean_values ​​= 128 - это не то, как выполняется квантование после обучения. Это путь для преобразования модели квантования времени обучения, которой у вас нет для мобильной сети v1. У вас есть только поплавковая модель. На вашем пути, учитывая модель с плавающей запятой, вы эффективно жестко кодируете все аспекты квантования без каких-либо вычисленных параметров квантования с использованием реальных данных или входных данных. Это не работает. Правильный путь - это руководство, на которое я указал. - person Alan Chiao; 16.09.2019
comment
Изменить: чего у вас нет для мобильной сети v2 - person Alan Chiao; 19.09.2019
comment
Раньше я пытался следовать этому руководству и в итоге получил эту ошибку: stackoverflow.com/questions/57234308/ - person Paulo Ribeiro; 19.09.2019