Я пытаюсь получить модель 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.