Чего уж только на Хабре не было, и 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_demosource ~/.core_ml_demo/bin/activatepython3 -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 pdfrom sklearn.linear_model import LinearRegressionfrom sklearn.datasets import load_boston# Load databoston = 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 modellm = 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 CoreMLimport coremltools as cmlmodel = cml.converters.sklearn. \convert(lm, ["RM", "AGE", "PTRATIO"], "PRICE")# Assign model metadatamodel.author = "Medium Author"model.license = "MIT"model.short_description = \"Predicts house price in Boston"# Assign feature descriptionsmodel.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 descriptionmodel.output_description["PRICE"] = \"Median Value in 1k (USD)"# Save modelmodel.save('bhousing.mlmodel')
Шаг 4. Создание нового проекта в Xcode
С Python мы закончили. Теперь можно завершить прототип приложения при помощи только Xcode и Swift. Это можно сделать так:
-
Откройте Xcode и создайте новый проект.
-
Выберите iOS как тип мультиплатформы.
-
Выберите тип приложения App.
4. Дайте проекту название и выберите интерфейс SwiftUI.
Конфигурация проектаТеперь просто перетащите созданный на третьем шаге файл модели .ml в каталог Xcode. Xcode автоматически сгенерирует класс Swift для вашей модели, как показано в редакторе ниже. Если вы посмотрите на класс, то заметите, что он содержит детали, которые мы ввели при сохранении нашей модели на Python с помощью coremltools, такие как описания объектов и целевых полей. Это удобно при управлении моделью.
Импорт файла .coreml в проект XcodeШаг 5. Создание UI модели
Далее создадим базовый пользовательский интерфейс, изменив файл contentView.swift. Приведённый ниже код на Swift отображает пользовательский интерфейс, который позволяет пользователям настраивать атрибуты дома, а затем прогнозировать его цену. Есть несколько элементов, которые мы можем здесь рассмотреть.
NavigationView содержит необходимый пользовательский интерфейс. Он включает:
-
Степпер (строки 1930) для каждой из наших трёх функций, который позволяет пользователям изменять значения функций. Степперы это в основном виджеты, которые изменяют @State атрибутных переменных нашего дома (строки 68).
-
Кнопку на панели навигации (строки 3140) для вызова нашей модели из функции predictPrice (строка 46). На экране появится предупреждающее сообщение с прогнозируемой ценой.
За пределами NavigationView у нас есть функция predictPrice (строки 4662). Она создаёт экземпляр класса Swift Core ML model и генерирует прогноз в соответствии с хранящимися в состояниях объектов значениями.
import SwiftUIimport CoreMLimport Foundationstruct 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 и более гладкий/дружественный пользовательский интерфейс. Тем не менее я надеюсь, что статья послужит полезным справочником по развёртыванию машинного обучения на мобильном устройстве.
Новые и усовершенствованные инструменты продолжают делать поиски в мобильной разработке более доступными для сообщества Data Science, и в мобильном мире есть большое пространство для творчества. Поскольку мобильная техника мультимедийная по своей сути, она даёт богатство типов данных (например, аудио, видео, движение и местоположение) наряду с уникальными вариантами применения приложений для расширения инструментария Data Science.
Если вы кодите на Python и столкнулись в работе с задачами
машинного обучения обратите внимание на наш курс
Machine Learning, на котором вы сможете систематизировать и
углубить полученные самостоятельно знания, пообщаться с
профессионалами и применить модели Machine Learning на практике.
Даже можно будет ворваться на хакатоны Kaggle.
Если же есть намерение сменить сферу деятельности и погрузиться в
ML более плотно то можно посмотреть на продвинутый курс
Machine Learning и Deep Learning, на котором вы освоите
основные алгоритмы машинного обучения, обучите рекомендательную
систему и создадите несколько нейронных сетей.
Узнайте, как прокачаться и в других специальностях или освоить их с нуля:
ПРОФЕССИИ
КУРС