Недавно я использовал API обнаружения объектов tensorflow для обучения детектора объектов (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
Я запускаю обнаружение из кода C ++, используя библиотеку tflite, которую я скомпилировал сам (Ubuntu 18.04 x64). Я использовал ревизию репозитория tensorflow, упомянутую в документации Edge TPU, чтобы убедиться, что она совместима с libedgetpu (версия 13.0).
Обнаружение прошло успешно, но у меня было огромное падение точности ~ 10% по сравнению с неквантованной версией. Я обнаружил, что большая часть этих потерь вызвана тем, что tflite не выполняет никаких шагов NMS. Я наблюдал изображение с двумя обнаруженными почти полностью перекрывающимися объектами.
Насколько я понимаю, tflite поддерживает работу nms, а сеть ssd mobilenet v1, преобразованная в tflite с помощью рекомендуемых инструментов (как я уже упоминал выше), должна работать с nms. Но почему-то в моем случае не работает. Мне пришлось добавить шаг nms в качестве операции постобработки в мой код на C ++, чтобы улучшить производительность модели.
Я что-то упустил или что-то не так с используемыми мной командами преобразования?
Спасибо!