NMS не работает в квантованной модели tenorflow-lite

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

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

Спасибо!


person Sergey P    schedule 07.04.2020    source источник
comment
Привет, после преобразования из .pb в .tflite, вы проверили точность модели? Просто интересно, связана ли это с преобразованием tflite или компилятором edgetpu.   -  person Nam Vu    schedule 28.04.2020
comment
@NamVu Привет, я не сравнивал точность .pb и .tflite, но почти не было различий между результатами модели .tflite, запущенной на CPU, и модели, скомпилированной из нее компилятором edgetpu и запущенной на TPU. Так что я почти уверен, что это не проблема компилятора edgetpu.   -  person Sergey P    schedule 29.04.2020


Ответы (1)


Хумн, точность падает, возможно, это отдельная проблема, которую следует решить, но я не думаю, что это связано с тем, что 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

person Nam Vu    schedule 15.10.2020