【发布时间】:2020-04-07 20:46:26
【问题描述】:
最近我使用 tensorflow 对象检测 API 来训练对象检测器(ssd mobilenet v1)。我想在Coral Edge TPU 上运行检测,所以我使用了量化感知训练。 我在我的 pipeline.config 中添加了以下部分以启用量化:
graph_rewriter {
quantization {
delay: 1800
activation_bits: 8
weight_bits: 8
}
}
训练完成后,我使用以下命令将其转换为 .pb:
python $TFAPIPATH/research/object_detection/export_tflite_ssd_graph.py \
--pipeline_config_path $CONFIG_NAME \
--trained_checkpoint_prefix $CHECKPOINT_PREFIX \
--output_directory $OUTPUT_DIR \
--add_postprocessing_op true
然后 - 使用生成的 .tflite 文件
--input_file=$INPUT_FILE \
--output_file=$OUTPUT_FILE \
--input_shapes=1,200,800,3 \
--input_arrays=normalized_input_image_tensor \
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
--inference_type=QUANTIZED_UINT8 \
--mean_values=128 \
--std_values=128 \
--change_concat_input_ranges=false \
--allow_custom_ops
我使用自己编译的 tflite 库(Ubuntu 18.04 x64)从 C++ 代码运行检测。我使用 Edge TPU 文档中提到的 tensorflow 存储库修订版来确保它与 libedgetpu(13.0 版)兼容。
检测成功运行,但与非量化版本相比,我的准确率下降了约 10%。我发现这种损失很大一部分是由于 tflite 没有执行 NMS 步骤造成的。我观察到一张图像,其中检测到两个几乎完全重叠的物体。
据我了解,tflite 支持 nms 操作,使用推荐工具(如上所述)转换为 tflite 的 ssd mobilenet v1 网络应该执行 nms。但出于某种原因,在我的情况下它不起作用。我不得不在我的 C++ 代码中添加 nms 步骤作为后处理操作,以提高模型的性能。
我是否遗漏了什么,或者我使用的转换命令有问题?
谢谢!
【问题讨论】:
-
您好,从 .pb 转换为 .tflite 后,您验证模型的准确性了吗?只是想知道这是否是由于 tflite 转换或 edgetpu 编译器造成的问题。
-
@NamVu 嗨,我没有比较 .pb 和 .tflite 的准确性,但是在 CPU 上运行的 .tflite 模型的结果与由 edgetpu 编译器编译的模型的结果几乎没有差异在 TPU 上运行。所以我几乎可以肯定这不是edgetpu编译器的问题。
标签: tensorflow-lite object-detection-api google-coral