Google Coral Edge TPU 编译模型 - 推理总是几乎相同

Google Coral Edge TPU compiled model - Inference always almost the same

我正在尝试在 Google 边缘 TPU Coral 上将 Mobilenetv2 模型(将最后一层重新训练到我的数据集)到 运行。我能够使用 '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

它几乎与任何输入图像相同,通常前两个 classes 具有相同(或非常相似)的值(第 3 个和第 4 个相同)上面显示的例子。一个class(as it is in the .h5 model or even in the .tflite model without quantization)

应该是0.99

可以是带参数的东西吗-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通道),输入shape是1,482,640,3。

从您对 mobilenetv1 的评论来看,您似乎正在采用重新训练的浮动模型并将其转换为 TFLite。您打算通过 运行 您列出的命令对其进行量化。

我建议您仔细查看 TensorFlow lite 文档。一般来说,有两种量化方式(在训练时间做和post-training)。您似乎想要采用的方法是 post-training。

正确的做法post-像珊瑚这样的东西的训练是遵循这个 指南(https://www.tensorflow.org/lite/performance/post_training_integer_quant), as recommended by the Coral team here (https://coral.withgoogle.com/news/updates-07-2019/)。

您在上面使用的流程更适合训练时间量化。