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