Преобразование моделей машинного обучения на iOS | Навстречу AI

Преобразование TensorFlow в CoreML и проверка модели

Преобразование моделей TF в CoreML, формат, удобный для iOS

Изначально этот пост был опубликован в thinkmobile.dev - блоге о внедрении интеллектуальных решений в мобильные приложения (ссылка на статью).

Core ML

Хотя TensorFlow Lite кажется естественным выбором для разработчиков программного обеспечения Android, на iOS он не обязательно должен быть таким же. В 2017 году, когда была выпущена iOS 11, Apple анонсировала Core ML, новую платформу, которая ускоряет операции, связанные с ИИ.
Если вы новичок в машинном обучении на мобильных устройствах, Core ML значительно упростит задачу при добавлении модели. в ваше приложение (буквально перетаскивание). Он также поставляется с некоторыми предметно-ориентированными фреймворками - Vision (алгоритмы компьютерного зрения для определения лиц, прямоугольников или текста, классификация изображений и т. Д.) И Natural Language.
Core ML и Vision дают нам возможность для запуска процесса вывода с использованием пользовательской модели машинного обучения. И эти модели могут быть получены из фреймворков машинного обучения, таких как TensorFlow.
В этой статье мы рассмотрим преобразование из формата TensorFlow в Core ML и их сравнение.

Поддержка TensorFlow 2.0

В настоящий момент конвертер Core ML не поддерживает модели TensorFlow 2.0. Это изменится в будущем - конвертер намерен поддерживать последнюю стабильную версию TensorFlow. Стоит следующий выпуск на Github.

Предпосылки

Чтобы преобразовать модель TensorFlow в Core ML, нам понадобится нечто большее, чем среда Colaboratory. Вот список вещей, которые должны быть доступны на машине, на которой вы работаете:

  • TensorFlow v1. * (на момент написания этой статьи TensorFlow 2.0 еще не поддерживается в конвертере Core ML)
  • Python 3.6 с некоторыми дополнительными библиотеками: Numpy, Jupyter Notebook, Pillow, requests - вы найдете их все в Jupyter Notebook с кодом проверки модели.
    (Python 3.7 еще не поддерживается coremltools - проблема, которую необходимо отслеживать).
  • TF-CoreML - конвертер TensorFlow в Core ML и его зависимость - coremltools для преобразования и проверки.
  • macOS - не только для разработки приложений для iOS, но и для запуска coremltools.

Когда все требования будут выполнены, мы сделаем:

  1. Преобразование MobileNet v2 из формата TensorFlow в формат Core ML,
  2. Осмотрите модель Core ML (сравните ее с TF).

После этого наша модель будет готова к реализации в приложении для iOS.

Преобразование TensorFlow в CoreML

Этот раздел можно выполнить в совместной среде.
Давайте создадим новую записную книжку и начнем с установки tfcoreml и импорта соответствующих библиотек:

Теперь давайте загрузим и распакуем модель MobileNet v2 и ее этикетки:

Теперь нам нужно больше узнать о модели, которую мы собираемся преобразовать в CoreML. К счастью, пакет с сетью MobileNet v2 содержит текстовый файл с этой информацией.
Как вариант, вы можете использовать приложение Netron для предварительного просмотра файла * .pb.

А теперь последний шаг - преобразование замороженного графа TensorFlow в CoreML с помощью инструмента tf-coreml.

Что интересно в модели CoreML, она содержит встроенные метки и выполняет некоторую предварительную обработку данных перед запуском процесса вывода.
Вот несколько интересных параметров tfcoreml для:

  • image_input_names - если он установлен, эти входные данные будут обрабатываться Core ML как изображение,
  • image_scale - если задано image_input_names, мы также можем определить масштаб, который будет использоваться для входных данных. Чтобы преобразовать значения канала RGB из диапазона [0, 255] в [0, 1], мы используем IMAGE_INPUT_SCALE = 1.0/255.0.
  • red_bias (и green_, blue_, gray_) - здесь не используется, но мы также можем добавить смещение к масштабированному изображению. Так, например, если модели требуются данные в диапазоне [-1, 1], мы должны использовать: IMAGE_INPUT_SCALE = 2.0/255.0 и смещения установлены на -1.
  • class_labels - файл, содержащий метки модели.
  • output_feature_names - имя выходного слоя.

Для получения дополнительной информации просмотрите репозиторий tfcoreml и примеры Jupyter Notebooks, в которых показаны некоторые варианты использования.

По завершении преобразования вы должны увидеть новый файл: mobilenet_v2_1.0_224.mlmodel.
В выводе консоли вы должны увидеть некоторую информацию о вновь созданной модели, примерно так:

Аналогичную информацию можно увидеть в Netron:

Как вы могли заметить, имена входов и выходов были немного изменены: с: input:0 на: input__0 и с: MobilenetV2/Predictions/Reshape_1:0 на MobilenetV2__Predictions__Reshape_1__0. Это связано с тем, что сгенерированный файл должен быть семантически правильным с кодом Swift или Objective-C.

Блокнот Colab с преобразованием TensorFlow в CoreML доступен здесь.



Осмотр модели

Прежде чем мы поместим модель CoreML в мобильное приложение, хорошо бы проверить, работает ли она так же, как исходная модель TensorFlow. Для этого мы создадим записную книжку, которую на этот раз нужно запустить непосредственно в macOS (это требование coremltools).
Предполагая, что у вас есть все необходимые библиотеки Python на вашем компьютере. , чтобы создать новую записную книжку, сначала запустите среду Jupyter Notebook в Терминале:

$ jupyter notebook

А затем в веб-браузере запустите ссылку, которая появилась в результате этой операции (например, http: // localhost: 8888 /? Token = 1234abcd).

Теперь мы собираемся создать блокнот python 3, в котором мы будем выполнять логический вывод для обеих моделей - CoreML и TensorFlow и сравнивать результаты.
Во-первых, начните со всего необходимого импорта:

Теперь загрузим два изображения из Википедии:

Предварительный просмотр:

Теперь загрузим нашу модель CoreML:

Как видите, в спецификации показано то, что мы видели во время операции экспорта. Теперь займемся предварительной обработкой данных:

И нам здесь больше нечего делать. Преобразование данных (из диапазона от [0, 255] до [0, 1]) выполняется автоматически моделью Core ML.

Давайте сделаем прогноз:

И вывод:

Как видите, мы пробовали разные значения для флага useCPUOnly. Для Golden Retriever мы заставили Core ML использовать CPU, а для образа ноутбука мы позволили операционной системе определять, какое оборудование следует использовать. Хотя между ними не было большой разницы, мы увидим интересную вещь при сравнении результата с TensorFlow.

Теперь давайте сделаем аналогичный прогноз для модели TensorFlow.
Сначала загрузите ярлыки:

И сделаем некоторую предварительную обработку данных:

Для процесса вывода TensorFlow нам нужно немного больше подготовиться. Входные данные должны быть не только правильного размера (224x224x3), но также иметь правильный формат данных (значение с плавающей запятой в диапазоне [0, 1]), а входной тензор должен иметь форму четырех измерений.

Затем загрузим модель TensorFlow:

И наконец, предсказание:

Вот результаты:

Результаты очень похожи, когда CoreML запускается на ЦП (версия TF, которую мы здесь использовали, также выполняет вывод на ЦП). Но немного иначе, когда использовался графический процессор.

Откуда эта разница? Это не обязательно само оборудование. Существует несколько разных способов реализации высокоуровневых функций для обеих архитектур - CPU и GPU. Обычно эти различия очень тонкие, как здесь. Но если вы обнаружите их очень далеко друг от друга, скорее всего, это ошибка.

На данный момент результат удовлетворительный, и мы можем предположить, что модель CoreML работает правильно. Последнее, что мы можем сделать, - это реализовать его в приложении iOS. И это будет часть другой статьи в будущем.

Исходный код и ссылки

Исходный код этого сообщения в блоге доступен на Github (блокнот Colab для процесса преобразования и блокнот Jupyter для сравнения TensorFlow и CoreML): https://github.com/frogermcs/TF-to-CoreML/

Ноутбук с преобразованием TF в CoreML можно запустить здесь.



Превью Jupyter Notebook со сравнением TF и ​​CoreML можно увидеть здесь (этот блокнот можно запускать только на macOS): https://github.com/frogermcs/TF-to-CoreML/blob/master/notebooks/Core_ML_inspection.ipynb

В блоге также есть отличное сообщение от Маттейса Холлеманса о преобразовании модели SSD MobileNet в CoreML: MobileNetV2 + SSDLite с Core ML.

Спасибо за прочтение! 🙂
Поделитесь своим мнением ниже. 👇

Изначально этот пост был опубликован в thinkmobile.dev - блоге о внедрении интеллектуальных решений в мобильные приложения (ссылка на статью).