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



我正在尝试让一个Mobilenetv2模型(重新训练到我的数据集的最后一层(在Google Edge 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])

输出如下所示(假设标签 ["类 1"、"类 2"、"类 3"、"类 4"](:

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

对于任何输入图像,它几乎都是相同的,通常,前两个类具有相同(或非常相似(的值(第 3 个和第 4 个相同(,如上例所示。对于一个类(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个通道(,输入形状为1,482,640,3。

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

我建议您仔细查看TensorFlow lite文档。一般来说,有两种量化方法(在训练期间进行量化,在训练后进行量化(。您似乎想要采取的方法是训练后。

在像珊瑚这样的东西训练后这样做的正确方法是遵循这个 指南(https://www.tensorflow.org/lite/performance/post_training_integer_quant(,按照珊瑚团队的建议在这里(https://coral.withgoogle.com/news/updates-07-2019/(。

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

最新更新