Запускаем модель машинного обучения на iPhone

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Чего уж только на Хабре не было, и DOOM на осциллографе, тесте на беременности и калькуляторе запускали, даже сервер Minecraft на зеркалке Canon 200D поднимали. Сегодня же, специально к старту нового потока курса по Machine Learning и углубленного Machine Learning и Deep Learning, попробуем описать кратчайший путь от обучения модели машинного обучения на Python до доказательства концепции iOS-приложения, которое можно развернуть на iPhone. Цель статьи — дать базовый скаффолдинг, оставляя место для дальнейшей настройки, подходящей для конкретного случая использования.


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

Шаг 1. Настройка среды 

Во-первых, давайте создадим виртуальную среду Python под названием .core_ml_demo, а затем установим необходимые библиотеки: pandas, scikit-learn и coremltools. Чтобы создать виртуальную среду, выполните в терминале эти команды:

python3 -m venv ~/.core_ml_demo
source  ~/.core_ml_demo/bin/activate
python3 -m pip install \
pandas==1.1.1 \
scikit-learn==0.19.2 \
coremltools==4.0

Далее установим Xcode. XCode — это инструментарий разработки для продуктов Apple. Обратите внимание, что Xcode довольно большой (больше 10 ГБ). Я бы порекомендовал выпить чашку кофе или запустить установку на ночь. 

Примечание: в этом туториале используется Xcode 12.3 (12C33) на MacOS Catalina 10.15.5.

Шаг 2. Обучение модели

Мы будем использовать набор данных Boston Housing Price от scikit-learn для обучения модели линейной регрессии и прогнозирования цен на жильё на основе свойств и социально-экономических атрибутов. 

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

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

# Load data
boston = load_boston()
boston_df = pd.DataFrame(boston["data"])
boston_df.columns = boston["feature_names"]
boston_df["PRICE"]= boston["target"]

y = boston_df["PRICE"]
X = boston_df.loc[:,["RM", "AGE", "PTRATIO"]]

# Train a model
lm = LinearRegression()
lm.fit(X, y)

Шаг 3. Преобразование модели в Core ML

Apple предоставляет два способа разработки моделей для iOS. Первый, Create ML, позволяет создавать модели полностью в рамках экосистемы Apple. Второй, Core ML, позволяет интегрировать модели от третьих лиц в платформу Apple, преобразовав их в формат Core ML. Поскольку мы заинтересованы в запуске обученной модели на iOS, воспользуемся вторым способом.

Перед импортом в Xcode мы преобразуем нашу модель sklearn в формат Core ML (.mlmodel) с помощью пакета python coremltool; coremltools позволяет назначать метаданные объекту модели, такие как информация об авторстве, описание функций модели и результатов.

# Convert sklearn model to CoreML
import coremltools as cml

model = cml.converters.sklearn. \
convert(lm,
        ["RM", "AGE", "PTRATIO"],
        "PRICE")

# Assign model metadata
model.author = "Medium Author"
model.license = "MIT"
model.short_description = \
"Predicts house price in Boston"

# Assign feature descriptions
model.input_description["RM"] = \
"Number of bedrooms"
model.input_description["AGE"] = \
"Proportion of units built pre 1940"
model.input_description["PTRATIO"] = \
"Pupil-teacher ratio by town"
# Assign the output description
model.output_description["PRICE"] = \
"Median Value in 1k (USD)"

# Save model
model.save('bhousing.mlmodel')

Шаг 4. Создание нового проекта в Xcode

С Python мы закончили. Теперь можно завершить прототип приложения при помощи только Xcode и Swift. Это можно сделать так:

  1. Откройте Xcode и создайте новый проект.

  2. Выберите «iOS» как тип мультиплатформы.

  3. Выберите тип приложения «App».

Создание нового проекта Xcode для iOS
Создание нового проекта Xcode для iOS

4. Дайте проекту название и выберите интерфейс «SwiftUI».

Конфигурация проекта
Конфигурация проекта

Теперь просто перетащите созданный на третьем шаге файл модели .ml в каталог Xcode. Xcode автоматически сгенерирует класс Swift для вашей модели, как показано в редакторе ниже. Если вы посмотрите на класс, то заметите, что он содержит детали, которые мы ввели при сохранении нашей модели на Python с помощью coremltools, такие как описания объектов и целевых полей. Это удобно при управлении моделью.

Импорт файла .coreml в проект Xcode
Импорт файла .coreml в проект Xcode

Шаг 5. Создание UI модели 

Далее создадим базовый пользовательский интерфейс, изменив файл contentView.swift. Приведённый ниже код на Swift отображает пользовательский интерфейс, который позволяет пользователям настраивать атрибуты дома, а затем прогнозировать его цену. Есть несколько элементов, которые мы можем здесь рассмотреть.

NavigationView содержит необходимый пользовательский интерфейс. Он включает:

  • Степпер (строки 19–30) для каждой из наших трёх функций, который позволяет пользователям изменять значения функций. Степперы — это в основном виджеты, которые изменяют @State атрибутных переменных нашего дома (строки 6–8).

  • Кнопку на панели навигации (строки 31–40) для вызова нашей модели из функции predictPrice (строка 46). На экране появится предупреждающее сообщение с прогнозируемой ценой.

За пределами NavigationView у нас есть функция predictPrice (строки 46–62). Она создаёт экземпляр класса Swift Core ML model и генерирует прогноз в соответствии с хранящимися в состояниях объектов значениями.

import SwiftUI
import CoreML
import Foundation

struct ContentView: View {
  @State private var rm = 6.5
  @State private var age = 84.0
  @State private var ptratio = 16.5
    
  @State private var alertTitle = ""
  @State private var alertMessage = ""
  @State private var showingAlert = false
    
  var body: some View {
      NavigationView {
        VStack {
        Text("House Attributes")
            .font(.title)
        Stepper(value: $rm, in: 1...10,
                step: 0.5) {
            Text("Rooms: \(rm)")
          }
          Stepper(value: $age, in: 1...100,
              step: 0.5) {
          Text("Age: \(age)")
          }
          Stepper(value: $ptratio, in: 12...22,
              step: 0.5) {
          Text("Pupil-teacher ratio: \(ptratio)")
          }
          .navigationBarTitle("Price Predictor")
          .navigationBarItems(trailing:
              Button(action: predictPrice) {
                  Text("Predict Price")
              }
          )
          .alert(isPresented: $showingAlert) {
              Alert(title: Text(alertTitle),
                    message: Text(alertMessage),
              dismissButton: .default(Text("OK")))
          }
        }
      }
  }
            
func predictPrice() {
    let model = bhousing()
    do { let p = try
      model.prediction(
          RM: Double(rm),
          AGE: Double(age),
          PTRATIO: Double(ptratio))

        alertMessage = "$\(String((p.PRICE * 1000)))"
      alertTitle = "The predicted price is:"
  } catch {
    alertTitle = "Error"
    alertMessage = "Please retry."
  }
    showingAlert = true
}
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

И, наконец, самое интересное: мы можем создать и запустить симуляцию приложения в Xcode, чтобы увидеть нашу модель в действии. В приведённом ниже примере я создал симуляцию с помощью iPhone 12.

Симуляция модели работает на iOS.
Симуляция модели работает на iOS.

Заключение

И это всё. Первый прототип завершён. Здесь есть что добавить, например валидацию модели, тесты для подтверждения ожидаемой производительности после импорта в iOS и более гладкий/дружественный пользовательский интерфейс. Тем не менее я надеюсь, что статья послужит полезным справочником по развёртыванию машинного обучения на мобильном устройстве.

Новые и усовершенствованные инструменты продолжают делать поиски в мобильной разработке более доступными для сообщества Data Science, и в мобильном мире есть большое пространство для творчества. Поскольку мобильная техника мультимедийная по своей сути, она даёт богатство типов данных (например, аудио, видео, движение и местоположение) наряду с уникальными вариантами применения приложений для расширения инструментария Data Science.

Если вы кодите на Python и столкнулись в работе с задачами машинного обучения — обратите внимание на наш курс Machine Learning, на котором вы сможете систематизировать и углубить полученные самостоятельно знания, пообщаться с профессионалами и применить модели Machine Learning на практике. Даже можно будет ворваться на хакатоны Kaggle.

Если же есть намерение сменить сферу деятельности и погрузиться в ML более плотно — то можно посмотреть на продвинутый курс Machine Learning и Deep Learning, на котором вы освоите основные алгоритмы машинного обучения, обучите рекомендательную систему и создадите несколько нейронных сетей.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

  • Профессия iOS-разработчик с нуля

  • Профессия Fullstack-разработчик на Python

  • Профессия Data Scientist

  • Профессия Data Analyst

  • Курс по Data Engineering

Другие профессии и курсы

ПРОФЕССИИ

  • Профессия Fullstack-разработчик на Python

  • Профессия Java-разработчик

  • Профессия QA-инженер на JAVA

  • Профессия Frontend-разработчик

  • Профессия Этичный хакер

  • Профессия C++ разработчик

  • Профессия Разработчик игр на Unity

  • Профессия Веб-разработчик

  • Профессия iOS-разработчик с нуля

  • Профессия Android-разработчик с нуля

КУРСЫ

  • Курс по Machine Learning

  • Курс "Machine Learning и Deep Learning"

  • Курс "Математика для Data Science"

  • Курс "Математика и Machine Learning для Data Science" 

  • Курс "Python для веб-разработки"

  • Курс "Алгоритмы и структуры данных"

  • Курс по аналитике данных

  • Курс по DevOps

Источник: https://habr.com/ru/company/skillfactory/blog/552402/

Интересные статьи

Интересные статьи

Земля – колыбель человечества, но нельзя вечно жить в колыбели Эту знаменитую фразу К.Э.Циолковского не забывают и по сей день. NASA, ESA, Роскосмос, SpaceX и множество других к...
Меня всегда раздражало, что я не могу запустить 64-битную игру на C# под MS-DOS. Сегодня я это исправил. Читать дальше →
Добрый день, уважаемые хабровчане! Несколько лет назад я купился на красочную рекламу zWave и установил себе оконные датчики, базирующиеся на этом протоколе. К домашнему серверу был подключен USB...
Глобальная паутина изо дня в день пополняется статьями о самых популярных, наиболее употребляемых алгоритмах машинного обучения для решения различных задач. Причём основа этих статей, немного...
Бизнес-смыслы появились в Битриксе в начале 2016 года, но мало кто понимает, как их правильно использовать для удобной настройки интернет-магазинов.