Если вы следили за объявлениями Apple в прошлом году, то знаете, что они вкладывают значительные средства в машинное обучение. С тех пор, как они представили Core ML в прошлом году на WWDC 2017, появилось множество приложений, использующих возможности машинного обучения.

Однако перед разработчиками всегда стояла одна проблема: как создавать модели? К счастью, Apple решила наш вопрос прошлой зимой, когда объявила о приобретении Turi Create у GraphLab. Turi Create - это инструмент Apple, который может помочь разработчикам упростить создание собственных пользовательских моделей. С Turi Create вы можете создавать собственные модели машинного обучения.

Краткое знакомство с Turi Create

Если вы читали другие руководства по машинному обучению, вы, вероятно, задаетесь вопросом: Разве Apple не объявила о« Create ML в этом году? В чем преимущества Turi Create перед CreateML? »

Хотя Create ML - отличный инструмент для людей, только начинающих работать с ML, он сильно ограничен в использовании. С Create ML вы ограничены текстовыми или графическими данными. Хотя это и есть для большинства проектов, его можно сделать бесполезным для немного более сложных приложений машинного обучения (например, Style Transfer!).

С Turi Create вы можете создавать те же модели Core ML, что и Create ML, но не только! Поскольку Turi Create намного сложнее, чем Create ML, он сильно интегрирован с другими инструментами машинного обучения, такими как Keras и TensorFlow. В нашем руководстве по CreateML вы видели типы моделей Core ML, которые мы могли бы создать с помощью Create ML. Вот типы алгоритмов, которые вы можете создать с помощью Turi Create:

Вы можете видеть, что этот список состоит из классификаторов и регрессоров, которые могут быть выполнены либо с помощью Create ML, либо в основном с помощью Turi Create. Вот почему Turi Create предпочитают более опытные специалисты по данным, поскольку он предлагает уровень настраиваемости, недоступный в Create ML.

Что такое перенос стиля?

Теперь, когда вы хорошо разбираетесь в Turi Create, давайте посмотрим, что такое Style Transfer. Перенос стиля - это техника перекомпоновки изображений в стиле других изображений. Что я имею в виду? Взгляните на изображение ниже, созданное с помощью Prisma:

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

Сверточные нейронные сети (CNN) - это тип нейронных сетей в машинном обучении, которые обычно используются в таких областях, как распознавание и классификация изображений. CNN добились успеха в решении проблем, связанных с компьютерным зрением, таких как идентификация лиц, объектов и т. Д. Это довольно сложные идеи, поэтому я бы не стал особо беспокоиться об этом.

Создание собственной демонстрации передачи стилей

Теперь, когда у вас есть понимание инструментов и концепций, которые мы рассмотрим в этом руководстве, наконец-то пришло время приступить к работе! Мы создадим нашу собственную модель переноса стилей с помощью Turi Create и импортируем ее в образец проекта iOS, чтобы увидеть, как она будет работать!

Сначала скачайте стартовый проект здесь. В этом руководстве мы будем использовать Python 2, Jupyter Notebook и Xcode 9.

На момент написания часть программного обеспечения все еще находится в стадии бета-тестирования. Помните об этом, когда начнете. Обязательно используйте Xcode 9, потому что в бета-версии Xcode 10 есть некоторые ошибки с Core ML. В этом проекте будет использоваться Swift 4.1.

Обучение модели передачи стиля

Turi Create - это пакет Python, но он не встроен в macOS. Поэтому позвольте мне рассказать, как это действительно быстро установить. В вашей macOS должен быть установлен Python. Если на вашем устройстве не установлено Python или pip, вы можете изучить процедуры установки здесь.

Установка Turi Create и Jupyter

Откройте Терминал и введите следующую команду:

pip install turicreate==5.0b2

Подождите минуту или две, пока установится пакет Python. А пока скачайте Jupyter Notebook. Jupyter Notebook - это компилятор для многих языков, используемых разработчиками, благодаря богатой интерактивной визуализации вывода. Поскольку Turi Create поддерживает только Python 2, введите следующие команды в Терминале, чтобы установить Jupyter Notebook для Python 2.

python -m pip install — upgrade pip
python -m pip install jupyter

После того, как вы установили все пакеты, самое время приступить к созданию нашего алгоритма!

Кодирование с Turi Create

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

Сначала скачайте тренировочные данные и разархивируйте их. Одна папка должна называться content, а другая - style. Если вы откроете content, вы увидите около 70 изображений с разной тематикой. Эта папка содержит различные изображения, поэтому наш алгоритм знает, к какому типу изображений применить перенос стиля. Поскольку мы хотим преобразовать все изображения, у нас будет множество изображений.

Style, с другой стороны, просто содержит только одно изображение: StarryNight.jpg. Эта папка содержит изображение, из которого мы хотим перенести художественный стиль.

Теперь давайте начнем наш сеанс программирования, открыв Jupyter Notebook. Введите в Терминал следующее.

jupyter notebook

Это откроет Safari со страницей, как показано ниже.

Выберите кнопку New и щелкните Python 2!

Примечание. Важно убедиться, что в записной книжке, которую вы используете, работает Python 2, поскольку Turi Create не поддерживает Python 3.

Как только вы нажмете на эту кнопку, должен открыться новый экран. Здесь мы создадим нашу модель. Щелкните первую ячейку и начните с импорта пакета Turi Create:

Нажмите SHIFT + Enter, чтобы запустить код в этой ячейке. Подождите, пока пакет будет импортирован. Затем давайте создадим ссылку на папки, содержащие наши изображения. Убедитесь, что вы изменили параметры на собственные пути к папкам.

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

Не беспокойтесь о предупреждениях. Затем мы введем команду для создания модели переноса стиля. Настоятельно рекомендуется запускать следующий код на Mac с очень мощным графическим процессором! Это будет означать большинство последних MacBook Pro, а также iMac. Если вы решите запустить код, например, на MacBook Air, вычисления будут выполняться на процессоре и могут занять несколько дней!

Запустите код. Это может занять очень много времени в зависимости от устройства, на котором вы его используете. На моем MacBook Air с момента выполнения вычислений на процессоре прошло 3,5 дня! Если у вас мало времени, не беспокойтесь. Вы можете скачать финальную модель Core ML здесь. Однако вы всегда можете запустить всю функцию, чтобы почувствовать, на что она похожа!

Таблица, которую вы видите, содержит три столбца: Итерация, Потери и Прошедшее время. В машинном обучении будет функция, которая запускается назад и вперед несколько раз. Когда функция выполняется вперед, это называется стоимостью. Когда он возвращается, это называется потерей. Каждый раз, когда функция запускается, цель состоит в том, чтобы настроить параметры, чтобы уменьшить потери. Таким образом, каждый раз, когда изменяются параметры, добавляется еще одна итерация. Цель состоит в том, чтобы получить небольшое количество убытков. По мере продвижения тренировки вы можете видеть, что потери постепенно уменьшаются. Прошедшее время относится к тому, сколько времени прошло.

Когда модель закончила обучение, остается только ее сохранить! Этого можно добиться с помощью простой строчки кода!

Это все! Зайдите в свою библиотеку, чтобы увидеть окончательную модель!

Краткий обзор проекта Xcode

Теперь, когда у нас есть модель, нам остается только импортировать ее в наш проект Xcode. Откройте Xcode 9 и взгляните на проект.

Скомпилируйте и запустите проект, чтобы убедиться, что вы можете его скомпилировать. Приложение сейчас не работает. Когда нажимаем кнопку Van Gogh!, ничего не происходит! Мы должны написать код. Давайте начнем!

Внедрение машинного обучения

Первый шаг - перетащить файл модели (т.е. StarryStyle.mlmodel) в проект. Убедитесь, что установлен флажок Copy Items If Needed и выбрана цель проекта.

Затем нам нужно добавить код для обработки машинного обучения в ViewController.swift. Большая часть кода будет написана в нашей transformImage() функции. Начнем с импорта пакета Core ML и вызова модели.

Эта строка просто назначает нашу модель Core ML константе с именем model.

Преобразование изображения

Затем мы должны преобразовать изображение, которое выбирает пользователь, в некоторые читаемые данные. Если вы снова заглянете в файл StarryStyle.mlmodel, вы обнаружите, что он принимает изображение размером 256 × 256. Следовательно, мы должны выполнить преобразование. Прямо под нашей transformImage() функцией добавьте новую функцию.

Это вспомогательная функция, аналогичная той же функции, которая использовалась в более раннем руководстве по Core ML. Если не помнишь, не волнуйся. Позвольте мне шаг за шагом объяснить, что делает эта функция.

  1. Поскольку наша модель принимает только изображения размером 256 x 256, мы конвертируем изображение в квадрат. Затем мы назначаем квадратное изображение другой константе newImage.
  2. Теперь мы конвертируем newImage в CVPixelBuffer. Если вы не знакомы с CVPixelBuffer, это, по сути, буфер изображений, в котором хранятся пиксели в основной памяти. Вы можете узнать больше о CVPixelBuffers здесь.
  3. Затем мы берем все пиксели, присутствующие в изображении, и преобразуем их в цветовое пространство RGB, зависящее от устройства. Затем, создав все эти данные в CGContext, мы можем легко вызывать его всякий раз, когда нам нужно отобразить (или изменить) некоторые из его основных свойств. Это то, что мы делаем в следующих двух строках кода, переводя и масштабируя изображение.
  4. Наконец, мы превращаем графический контекст в текущий контекст, визуализируем изображение и удаляем контекст из верхнего стека. После всех этих изменений мы возвращаем наш пиксельный буфер.

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

Применение переноса стиля к изображению

Теперь, когда у нас есть вспомогательная функция Core ML, давайте вернемся к transformImage() и реализуем код. Ниже строки, в которой мы объявляем нашу константу model, вставьте следующий код:

Turi Create позволяет объединить в модель более одного «стиля». Для этого проекта у нас есть только один стиль: Звездная ночь. Однако, если вы хотите добавить больше стилей, вы можете добавить больше изображений в папку style. Мы объявляем styleArray как MLMultiArray. Это тип массива, используемый Core ML для ввода или вывода модели. Поскольку у нас один стиль, у нас есть только одна фигура и один элемент данных. Вот почему мы установили количество элементов данных равным 1 для нашего styleArray.

Наконец, все, что осталось, - это сделать прогноз, используя нашу модель, и установить для него значение imageView.

Эта функция сначала проверяет, есть ли изображение в imageView. В блоке кода он определяет predictionOutput для сохранения результатов прогноза модели. Мы вызываем predictionметод модели с изображением пользователя и массивом стилей. Прогнозируемый результат - это буфер пикселей. Однако мы не можем назначить набор пикселей для буфера для UIImageView, поэтому мы придумали творческий способ сделать это.

Сначала мы устанавливаем буфер пикселей predictionOutput.stylizedImage для изображения типа CIImage. Затем мы создаем переменную tempContext, которая является экземпляром CIContext. Мы вызываем встроенную функцию контекста (т.е. createCGImage), которая генерирует CGImage из ciImage. Наконец, мы можем установить imageView на tempImage. Это все! Если есть ошибка, мы аккуратно обрабатываем ее, выводя ошибку.

Создайте и запустите свой проект. Выберите изображение из своей фото-библиотеки и проверьте, как работает приложение!

Вы можете заметить, что модель может выглядеть не слишком близко к Звездной ночи, и это может происходить по разным причинам. Может нам нужно больше данных для обучения? Или, возможно, нам нужно обучить модель большему (или меньшему) количеству итераций? Я настоятельно рекомендую вам вернуться и поиграть с числами, пока не получите удовлетворительный результат!

Заключение

Это подводит итог урока! Я познакомил вас с Turi Create и создал вашу собственную модель передачи стилей - подвиг, который невозможно было бы создать в одиночку всего 5 лет назад. Вы также узнали, как импортировать эту модель Core ML в приложение для iOS и использовать ее в творческих целях!

Однако Style Transfer - это только начало. Как я упоминал ранее, Turi Create можно использовать для множества приложений. Вот несколько отличных ресурсов о том, что делать дальше:

Чтобы получить полный проект, загрузите его с GitHub. Если у вас есть какие-либо комментарии или отзывы, пожалуйста, оставьте мне комментарий и поделитесь своими мыслями ниже.

Статья впервые опубликована на AppCoda.com.

Подпишитесь на нас в социальных сетях:
Facebook: facebook.com/AppCodamobile/
Twitter: twitter.com/AppCodaMobile
Instagram: instagram. ru / AppCodadotcom

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