Хорошие вещи входят в пакеты (TF) lite!

Следуя моим предыдущим блогам о запуске граничных моделей на Python, в этом пятом блоге из серии «Обучение и запуск моделей Tensorflow» будет рассказано, как запустить модель классификации изображений TensorFlow Lite на Python. Если вы не читали мою предыдущую публикацию об обучении моделей для этой задачи, вы можете прочитать это здесь:



Пит-стопы серии

В то время как в предыдущем блоге рассказывалось о построении и подготовке этой модели, в этом блоге будет рассмотрено, как запустить эту модель TensorFlow Lite на Python.

Модели TensorFlow Lite имеют определенные преимущества по сравнению с традиционными моделями TensorFlow, а именно, они обычно меньше по размеру и имеют меньшую задержку вывода.

Однако здесь есть небольшой компромисс с точки зрения точности модели; но если ваш вариант использования допускает такой компромисс, то вы золотой!

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

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



Шаг 1. Скачивание модели TensorFlow Lite

Предполагая, что вы обучили свою модель TensorFlow с помощью Google Cloud, вы можете загрузить модель из панели управления Vision, как показано на снимке экрана здесь:

После загрузки мы готовы настроить нашу среду и перейти к следующим шагам.

Шаг 2. Установка необходимых зависимостей

Прежде чем мы продолжим писать какой-либо код, важно, чтобы у нас были установлены все необходимые зависимости на нашей машине разработки.

В текущем примере нам понадобятся следующие зависимости:

tensorflow==1.13.1
pathlib
opencv-python

Мы можем использовать pip для установки этих зависимостей с помощью следующей команды:

pip install dependency_name

Примечание. Хотя это и не обязательно, настоятельно рекомендуется всегда использовать виртуальную среду для тестирования новых проектов. Вы можете узнать больше о том, как настроить и активировать его по ссылке здесь:



Шаг 3. Загрузка модели и изучение ее входных и выходных данных.

Теперь, когда у нас есть модель и наша среда разработки, следующий шаг - создать фрагмент кода Python, который позволяет нам загрузить эту модель и выполнить с ней логический вывод.

Вот как может выглядеть такой фрагмент:

Здесь мы сначала загружаем загруженную модель, а затем получаем от нее входные и выходные тензоры.

Затем мы печатаем полученные ранее входные и выходные тензоры.
Если вы запустите код, результат может выглядеть следующим образом:

Input: [{'name': 'image', 'index': 0, 'shape': array([  1, 224, 224,   3], dtype=int32), 'dtype': <class 'numpy.uint8'>, 'quantization': (0.007874015718698502, 128)}]
Output: [{'name': 'scores', 'index': 173, 'shape': array([1, 3], dtype=int32), 'dtype': <class 'numpy.uint8'>, 'quantization': (0.00390625, 0)}]

Здесь модель принимает входные данные с индексом 0, а тип входных данных представляет собой массив формы [1,224,224,3], что в основном означает, что она принимает одно изображение размером 224 x 224 в формате RGB.

Модель дает результат с индексом 173, а форма выходного массива - [1,3], что по сути означает, что мы будем получать оценки для каждой из наших меток. Для целей моего проекта я обучил модель классифицировать входное изображение как недоэкспонированное, переэкспонированное или хорошее, поэтому результат имеет форму [1,3].

Если бы я обучил свою модель обнаружению n меток, то выходной формой был бы [1, n].

Теперь, когда у нас есть входной и выходной тип и формы модели, давайте загрузим изображение и пропустим его через модель TensorFlow Lite.

Шаг 4: чтение изображения и передача его модели TFLite

Далее мы будем использовать Pathlib для итерации по папке, содержащей некоторые изображения, для которых мы будем выполнять логический вывод. Затем мы прочитаем каждое изображение с помощью OpenCV, изменим его размер до 224x224 и передадим его нашей модели.

После этого мы напечатаем имя файла и вывод для этого файла:

После запуска этого кода результат может выглядеть следующим образом:

For file DSC00117, the output is [[ 75 164  17]]
For file DSC00261, the output is [[252   2   2]]
For file DSC00248, the output is [[252   2   2]]
For file DSC00116, the output is [[ 21 210  25]]
For file DSC00128, the output is [[  9 112 136]]
For file DSC00114, the output is [[203  42  12]]

Как видите, результат содержит 3 значения, которые в сумме составляют 256. Они представляют собой оценки для изображения, которые показывают, является ли оно недоэкспонированным, хорошим или переэкспонированным соответственно.

Чтобы получить прогноз, прогнозируемый вашей моделью, просто выберите индекс с наибольшим количеством баллов и сопоставьте его со своей меткой.

Например, на первом изображении в выходных данных выше наивысшая оценка - это второй элемент в массиве, который отображается с меткой «хорошо»; тогда как второе изображение - «недоэкспонировано», а предпоследнее - «передержано».

Чтобы еще больше повысить производительность модели, вы также можете группировать запросы. Посмотрим, как это сделать.

Шаг 5. Пакетные запросы для повышения производительности

Пакетная обработка с помощью TensorFlow, по сути, означает одновременный запуск нескольких запросов на вывод, а не их выполнение по одному.

Это приведет к уменьшению задержки в нашей модели.

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

Чтобы упростить задачу, мы установим размер пакета равным 50. Вот как выглядит приведенный выше пример с пакетной обработкой:

Но при запуске приведенного выше кода вы можете увидеть ошибку, которая выглядит следующим образом:

Traceback (most recent call last):
  File "test.py", line 48, in <module>
    interpreter.set_tensor(input_details[0]['index'], input_data)
  File "/Users/harshitdwivedi/Desktop/tf_env/lib/python3.7/site-packages/tensorflow/lite/python/interpreter.py", line 175, in set_tensor
    self._interpreter.SetTensor(tensor_index, value)
  File "/Users/harshitdwivedi/Desktop/tf_env/lib/python3.7/site-packages/tensorflow/lite/python/interpreter_wrapper/tensorflow_wrap_interpreter_wrapper.py", line 136, in SetTensor
    return _tensorflow_wrap_interpreter_wrapper.InterpreterWrapper_SetTensor(self, i, value)
ValueError: Cannot set tensor: Dimension mismatch

Причина этого - несоответствие формы входного тензора и формы входных данных, которые мы предоставляем.

Модель принимает входные данные [1, 224, 224, 3], а входные данные, которые мы предоставляем, - [50, 224, 224, 3]. Чтобы исправить это, мы можем просто изменить размер нашего ввода перед выполнением вывода.

Вот как выглядит код для этого:

Перед запуском вывода мы также можем изменить размер ввода, чтобы он принимал столько изображений, сколько есть в текущем пакете изображений.

Запустив приведенный выше код, вы можете получить следующий результат:

[[ 75 164  17], [252   2   2], [252   2   2], [ 21 210  25], ..., [203  42  12], [  9 112 136]]

Длина этого массива будет такой же, как размер вашего пакета (здесь 50); поэтому, если вы ведете другой список имен файлов, вы можете легко ссылаться на оценку для каждого изображения!

Вот и все! Хотя модели TFLite не всегда являются эффективным решением, они, тем не менее, являются чрезвычайно жизнеспособной альтернативой, когда дело доходит до запуска ваших моделей на периферийном оборудовании или если задержка модели является основной проблемой для вашего приложения!

В следующей части этой серии я расскажу, как мы можем сделать то же самое для моделей TF Lite для обнаружения объектов, чтобы находить и отслеживать обнаруженные объекты на изображении. Следите за обновлениями!

Спасибо за внимание! Если вам понравилась эта история, пожалуйста, нажмите 👏 кнопку и поделитесь ею, чтобы помочь другим найти ее! Не стесняйтесь оставлять комментарии 💬 ниже.

Есть отзывы? Подключим в Twitter.

Примечание редактора. Heartbeat - это онлайн-издание и сообщество, созданное авторами и посвященное предоставлению первоклассных образовательных ресурсов для специалистов по науке о данных, машинному обучению и глубокому обучению. Мы стремимся поддерживать и вдохновлять разработчиков и инженеров из всех слоев общества.

Независимо от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить лучшие модели машинного обучения.