NMS не работает в квантованной модели с тензорным потоком - PullRequest
0 голосов
/ 07 апреля 2020

Недавно я использовал 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 ++, чтобы улучшить производительность модели.

Я что-то упустил или, возможно, что-то не так с командами преобразования, которые я использовал?

Спасибо!

...