[Из песочницы] Create ML в iOS

ppaxt4vc_weqdfh9qvgz7-9isk4.png

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

Но прежде чем начать, немного истории и пояснений. На ежегодной конференции для разработчиков WWDC2018 компания Apple представила инструменты для работы с машинным обучением Create ML. Обученная в Create ML модель является результатом применения алгоритма машинного обучения для набора обучающих данных. Модели не занимают много места (около 3Мб), поэтому их можно хранить в проекте. Изначально модели предлагалось обучать с помощью Playgrounds в XCode 10 и поддерживалась работа с изображениями, текстом и таблицами. При запуске playgrounds проекта необходимо было импортировать библиотеку CreateML и запустить MLImageClassifierBuilder (в случае если бы мы обучали модель для классификации изображений).

import CreateMLUI

let builder = MLImageClassifierBuilder()
builder.showInLineView()


В 2019 году Apple представила совершенно новый инструмент для работы с моделями машинного обучения, отделив его от Playgrounds. Стало возможным обучать модели без единой строчки кода. Список типов данных пополнился звуками и активностью. Всего представлено 5 типов данных и 9 шаблонов моделей. Давайте рассмотрим каждый тип данных и какие модели мы можем получить в результате.

Изображения


image

При обучении с использованием изображений доступны два шаблона — Image Classifier (классификатор изображений) и Object Detector (детектор объектов).

Image Classifier используется для классификации изображений на основе их содержимого. Обучив модель, мы можем идентифицировать один объект на изображении и отнести его к какому-либо типу. Например, идентифицировать животных на изображениях и даже различать какой цветок изображен на фотографии. В Create ML шаблон Image Classifier использует трансферное обучение. Трансферное обучение — это способность комбинировать заранее обученную модель с пользовательскими данными, что позволяет обучать модели на небольшом количестве изображений.

Object Detector является моделью, основанной на глубоком обучении. Позволяет идентифицировать несколько объектов на изображении, например людей, здания, автомобили. И всё это на одном изображении. Нужно также добавить, что при обучении моделей Object Detector используется GPU компьютера.

Звуки


image

При работе со звуками доступен только один шаблон для создания модели — Sound Classifier (классификатор звука). Sound Classifier является новым шаблоном и позволяет определять наиболее доминирующий звук в аудиопотоке. Например, вы можете определять, какой инструмент звучит в аудио. Sound Classifier так же, как Image Classifier, использует трансферное обучение.

Активность


image
Активность представлена только одним шаблоном — Activity Classifier (классификатор активности).
Activity Classifier является новым шаблоном в Create ML и используется для классификации данных движения от акселерометра и гироскопа.

Такие модели являются моделями глубокого обучения и обучаются с использованием GPU компьютера.

Текст


image

Текст представлен двумя шаблонами Text Classifier (классификатор текста) и Word Tagger (маркировщик слов).

Text Classifier используется для идентификации предложений, абзацев и даже целых статей на основе их содержания. Word Tagger используется для маркировки слов или распознавание каких-либо названий в тексте.

Таблицы


image

Таблицы представлены тремя шаблонами: Tabular Regressor (табличный регрессор), Tabular Classifier (табличный классификатор) и Recommender (рекомендатор).

Tabular Regressor — модель, которая может предсказывать числовое значение на основе некоторых данных. Например, вы можете обучить модель, которая будет предсказывать погоду.

Tabular Classifier классифицирует объекты на основе их особенностей. Например, вы можете обучить модель определять размер одежды в онлайн-магазине исходя из различных параметров пользователя. Модель работает с такими типами, как integer, double, string и long, если целью является дискретное значение.

Recommender позволяет рекомендовать контент на основе поведения пользователя, причём все вычисления производятся непосредственно на устройстве.

Теперь, когда мы познакомились со всеми доступными шаблонами, мы можем приступить к созданию своей первой модели машинного обучения. Начнём с Image Classifier.

Image Classifier


Смотрели сериал Silicon Valley от HBO? В одной из серии четвёртого сезона показали приложение, которое распознаёт «хот-доги» и «не хот-доги» на изображениях. С помощью Image Classifier можно создать аналог этого приложения. Но прежде необходимо подготовить данные для обучения модели. Архив с изображениями тут.

Немного требований для обучения модели Image Classifier. Изображения не должны быть менее 299 на 299 пикселей. Наборы для обучения должны содержать не менее 10 изображений, но чем больше, тем лучше. Теперь мы знаем, что при обучении Image Classifier используется трансферное обучение, что позволяет обучать модели на небольшом количестве изображений. Количество изображений для каждого набора должно быть равным, иначе будет смещение в сторону одной из категорий. Примерно 80% изображений используется для обучения модели, а остальные 20% — для тестирования. Также изображения не должны повторяться, то есть в папке с изображениями для обучения не должны быть изображения, которые будут в дальнейшем использоваться для тестирования. Названия папок для обучения будут использоваться в качестве идентификаторов для соответствующих классов, при использовании моделей. В моём примере используются названия HotDog или NotHotDog. Названия самих изображений не играют никакой роли, их можно называть как угодно. Я обозначил их порядковыми номерами.

Теперь, когда наши данные готовы, можно приступить к обучению модели. Для работы с Create ML нам понадобится XCode 11 или версией выше. Я буду использовать XCode 11.3.1. Чтобы запустить инструмент Create ML, необходимо перейти XCode → Open Developer Tool → Create ML. Появится окно, где можно выбрать существующий или создать новый проект. Выбираем New Document. Далее необходимо выбрать шаблон, в нашем случае мы будем использовать Image Classifier. Даём название нашему проекту, нажимаем Next и выбираем место где будет храниться проект. Открывается рабочая среда для работы с моделью.

image

Как мы видим, это совершенно отдельный проект, где можно создавать и обучать несколько моделей. В инспекторе слева отображается название проекта (Project), нажатие по нему отображает информацию о проекте и позволяет отредактировать её. Далее ниже в Model Sources содержатся все модели, используемые в нашем проекте. Давайте теперь рассмотрим раздел Data Inputs в основном окне инструмента.

Training Data — сюда необходимо добавить изображения для обучения моделей. Validation Data — здесь можно добавить набор изображений для проверки обучения модели (в моём случае я оставил Auto). Testing Data — сюда необходимо добавить изображения для тестирования модели, которые не были задействованы в обучении модели.

В разделе Parameters можно задать максимальное количество итераций, производимых над одним изображением во время обучения модели. А в разделе Augmentations можно выбрать эффекты, накладываемые на изображения.

Теперь, когда мы познакомились с Create ML, мы можем приступить к обучению своей первой модели. Мы просто перетаскиваем папку Training Data (название может быть любое) во вкладку Training Data. Теперь нажимаем Train. Начинается процесс обучения.

image

Итак, у меня обучение заняло около 27 секунд, и модель почти готова. После обучения можно оценить, насколько хорошо модель классифицирует изображения из набора Training Data. Поскольку модель обучена на этих изображениях, она хорошо классифицирует их. В моём случае модель определила все изображения из обучающего набора и 97% изображений из проверочного. Пришло время тестирования.

image

Перейдём во вкладку Testing. Как и в случае с данными для обучения модели, просто перетаскиваем папку Testing Data в окно Testing Data. На самом деле, мы могли бы перед стартом обучения задать папку с изображениями для тестирования. Но для линейности процесса сделаем по-другому. Нажимаем Test Model. По результатам тестирования, модель справилась на 98%.

image

Перейдя в Output, можно проверить работу модели, не добавляя её в свой проект. Для этого добавьте изображения хот-дога и не хот-дога и проверьте результат. Я добавил изображение салата и хот-дога и, в обоих случая модель справилась на отлично. Конечно, для серьёзных проектов может потребоваться больше данных для обучения, больше итераций и так далее. Но для тестового проекта будет достаточно и этого. Для сохранения модели просто перенесите её из Output в необходимую папку.

image

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

image

В разделе Machine Learning Model можно узнать информацию о модели. Эту информацию можно задать в проекте инструмента Create ML. Обратите внимание, что модель, которую мы обучили, занимает всего 17 KB. Далее в разделе Model Class нас предупреждают, что будет создан Swift класс с именем MyImageClassifier, настоятельно не рекомендую трогать там что-либо, так как это может отразиться на работе приложения. В разделе Prediction описаны входные параметры и что мы получим в результате. На случай если вы используете модель, которую обучали не вы, в разделе Experimentation можно проверить модель, для этого просто перенесите изображение.

image

Перейдите в класс ImageClassifierService, тут можно увидеть, как происходит инициализация модели.

private func makeImageClassifierModel() -> VNCoreMLModel? {
  return try? VNCoreMLModel(for: MyImageClassifier().model)
}


Достаточно просто, не правда ли? Далее необходимо создать, обработать и выполнить запрос на классификацию.

private func makeClassifierRequest(for model: VNCoreMLModel, ciImage: CIImage) {
    let request = VNCoreMLRequest(model: model) { [weak self] request, error in
      self?.handleClassifierResults(request.results)
    }
    
    let handler = VNImageRequestHandler(ciImage: ciImage)
    DispatchQueue.global(qos: .userInteractive).async {
      do {
        try handler.perform([request])
      } catch {
        self.onDidUpdateState?(.requestFailed)
      }
    }
  }


Остаётся только обработать результат.

  private func handleClassifierResults(_ results: [Any]?) {
    guard let results = results as? [VNClassificationObservation],
      let firstResult = results.first else {
      onDidUpdateState?(.requestFailed)
      return
    }
    
    DispatchQueue.main.async { [weak self] in
      let confidence = (firstResult.confidence * 100).rounded()
      let resultModel = ClassifierResultModel(identifier: firstResult.identifier, confidence: Int(confidence))
      self?.onDidUpdateState?(.receiveResult(resultModel: resultModel))
    }
  }


Теперь мы можем запустить приложение и проверить точность модели.

image

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

image

Как мы видим, модель определяет изображение с бургером как «не хот-дог». Предлагаю немного запутать модель и добавить изображение собаки в костюме хот-дога.

image

И здесь наша обученная модель справляется на отлично.

Заключение


В этой небольшой статье мы познакомились с инструментом Create ML. Узнали, с какими типами работает и какие шаблоны использует инструмент. А также попробовали обучить свою модель. Самое сложное в создании модели машинного обучения — это поиск и подготовка данных для обучения. Вы можете не обучать модели, а использовать уже обученные. Например, здесь уже есть готовые модели, которые работают с изображениями и текстом. Есть много пользовательских моделей на GitHub.
Изображения для обучения моделей также несложно найти, вот, например, архивы от Google. Но если вам необходимо обучить модель под узконаправленные задачи, то придётся собирать изображения и создавать свои архивы.

© Habrahabr.ru