Чего уж только на Хабре не было, и 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. Это можно сделать так:
Откройте Xcode и создайте новый проект.
Выберите «iOS» как тип мультиплатформы.
Выберите тип приложения «App».
4. Дайте проекту название и выберите интерфейс «SwiftUI».
Теперь просто перетащите созданный на третьем шаге файл модели .ml в каталог Xcode. Xcode автоматически сгенерирует класс Swift для вашей модели, как показано в редакторе ниже. Если вы посмотрите на класс, то заметите, что он содержит детали, которые мы ввели при сохранении нашей модели на Python с помощью coremltools, такие как описания объектов и целевых полей. Это удобно при управлении моделью.
Шаг 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 и более гладкий/дружественный пользовательский интерфейс. Тем не менее я надеюсь, что статья послужит полезным справочником по развёртыванию машинного обучения на мобильном устройстве.
Новые и усовершенствованные инструменты продолжают делать поиски в мобильной разработке более доступными для сообщества Data Science, и в мобильном мире есть большое пространство для творчества. Поскольку мобильная техника мультимедийная по своей сути, она даёт богатство типов данных (например, аудио, видео, движение и местоположение) наряду с уникальными вариантами применения приложений для расширения инструментария Data Science.
Если вы кодите на Python и столкнулись в работе с задачами машинного обучения — обратите внимание на наш курс Machine Learning, на котором вы сможете систематизировать и углубить полученные самостоятельно знания, пообщаться с профессионалами и применить модели Machine Learning на практике. Даже можно будет ворваться на хакатоны Kaggle.
Если же есть намерение сменить сферу деятельности и погрузиться в ML более плотно — то можно посмотреть на продвинутый курс Machine Learning и Deep Learning, на котором вы освоите основные алгоритмы машинного обучения, обучите рекомендательную систему и создадите несколько нейронных сетей.
Узнайте, как прокачаться и в других специальностях или освоить их с нуля:
Другие профессии и курсы
ПРОФЕССИИ
КУРСЫ