最近我使用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库(Ubuntu18.04 x64)从C++代码运行检测。我使用了Edge TPU文档中提到的tensorflow存储库版本,以确保它与libedgetpu (版本13.0)兼容。
检测运行成功,但与非量化版本相比,我的准确率下降了约10%。我发现这种损失很大程度上是由于tflite没有执行NMS步骤造成的。我观察到一幅图像,检测到两个几乎完全重叠的物体。
据我所知,tflite支持nms操作,ssd mobilenet v1网络使用推荐的工具(如上所述)转换为tflite后应该支持nms。但由于某些原因,在我的情况下,它不起作用。我不得不将nms步骤作为后处理操作添加到我的C++代码中,以提高模型的性能。
我是不是遗漏了什么,或者我使用的转换命令有问题?
谢谢!
发布于 2020-10-16 03:36:05
嗯,准确性下降可能是一个单独的问题,应该解决,但我不认为这是因为nms没有执行。使用以下标志将pb模型导出到.tflite时:--add_postprocessing_op true,非最大抑制应包含在后期处理操作中。如果你想探索,代码在这里:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/detection_postprocess.cc
我知道已经有很长一段时间了,但此时您可能需要再次检查您的配置并降低iou_threshold以获得更少的输出框:https://github.com/tensorflow/models/blob/master/research/object_detection/samples/configs/ssd_mobilenet_v1_quantized_300x300_coco14_sync.config#L130
https://stackoverflow.com/questions/61089151
复制相似问题