Статьи

Оптимизируйте предварительно подготовленную сеть TF 2.0 для работы в выводе в OpenCV

В этом руководстве я покажу, как я преобразовал предварительно подготовленную сеть, написанную на TF 2.0, с немного продвинутой архитектурой, в оптимизированную сеть, подходящую для вывода. Моей целью было запустить предтренированную модель в выводе, используя C ++ и модуль Dnn OpenCV . Однако это руководство поможет вам создать оптимизированную модель, которая может использоваться на многих платформах, включая Python и TensorRT.

После обучения модели в TF 2.0 я искал простой способ оптимизировать модель для вывода. Однако я не нашел ни одного места, которое помогло бы мне сделать это в TF 2.0, поскольку TF удалила их поддержку в замороженных оптимизированных графиках, как видно из всех жалоб, собранных в StackOverflow (например, 1 , 2 ).

Есть много решений, написанных на разных интернет-форумах. Я пишу руководство по самому простому способу, который я нашел для этого.

Технические характеристики системы

Anaconda3 4.4+,

Tensorflow 2.0,

OpenCV 4.1.2+,


Вам также может понравиться:
Введение в TensorFlow .

Начиная

В моей сетевой реализации я использовал:

  1. Набор данных и итераторы ( tf.data.dataset).
  2. Заполнители ( tf.placeholder).
  3. Свертки ( tf.layers.conv2d).
  4. Глубинные свертки ( tf.nn.depthwise_conv2dи td.nn.bias_add).
  5. Relu6 ( tf.nn.relu6).
  6. Пакетная нормализация ( tf.layers.batch_normalization).
  7. Свести ( tf.layers.flatten).
  8. Softmax ( tf.nn.softmax).
  9. Глобальное среднее ( tf.layers.average_pooling2d).

После обучения мы хотели бы экспортировать нашу модель в файл .pb, чтобы запустить его на логическом этапе. Tensorflow имеет простой API кода для публикации модели:

 tf.saved_model.simple_save(sess,path,inputs,outputs) 

Однако это приведет к экспорту полной модели во многие файлы, включая определение графика, переменные, и не удалит сводки, которые не нужны во время вывода. Это ограничивает производительность использования графического процессора, поскольку ненужные сетевые компоненты часто работают на процессоре.

До TF 2.0 наилучшей практикой было:

  • Заморозить модель (взять график def в сочетании с контрольной точкой и преобразовать все переменные в константы только в одном файле pb)
  • Оптимизируйте замороженный график для вывода, в том числе:

    • Удалить неиспользуемые узлы.
    • Сложите арифметику и выражения для констант.
    • Удалить личность и никаких операций.
    • Сложите пакетную нормализацию в простые умножения.
    • Сортировать по порядку выполнения, который необходим для запуска в OpenCV.

Этот код в основном поддерживался Graph Transform Tool и был интегрирован в библиотеку инструментов TensorFlow. Это было до TF2.0, где TF удалил свою поддержку и свой граф использует код, поскольку tf.compact1.graph_utilв основном он пуст. Вместо этого они ожидают, что разработчики будут использовать API SavedModels  . Однако другие библиотеки и модули логического вывода не поддерживают его, и пользователям TF нужно сломать голову, чтобы найти способ оптимизировать свою модель.

Я подробно опишу, что я сделал, чтобы заморозить мою модель:

Напишите свой код заранее, чтобы соответствовать выводу

Используйте флаг с именем Inference

Для итераторов используйте: 


питон