За последние несколько лет тема искусственного интеллекта и машинного обучения перестала быть для людей чем-то из области научной фантастики и прочно вошла в повседневную жизнь.
Социальные сети приглашают нас посетить интересующие нас мероприятия, машины на дорогах научились передвигаться без участия водителя, а голосовой помощник на телефоне подсказывает, когда лучше выйти из дома, чтобы избежать пробок, и стоит ли вам нужно взять с собой зонтик.
В этой статье мы рассмотрим инструменты машинного обучения, которые Apple предлагает разработчикам, посмотрим, что нового в этой области компания показала на WWDC18, и попытаемся понять, как все это можно применить на практике.
Машинное обучение
Итак, машинное обучение — это процесс, в котором система, используя определенные алгоритмы анализа данных и обрабатывая огромное количество примеров, выявляет закономерности и использует их для прогнозирования характеристик новых данных.Машинное обучение зародилось из теории, согласно которой компьютеры могут учиться самостоятельно, не будучи запрограммированы на выполнение определенных действий.
Другими словами, в отличие от обычных программ с заранее запрограммированными инструкциями для решения конкретных задач, машинное обучение позволяет системе научиться распознавать закономерности и самостоятельно делать прогнозы.
БННС и CNN
Apple уже довольно давно использует технологии машинного обучения на своих устройствах: Mail идентифицирует электронные письма, содержащие спам, Siri помогает быстро находить ответы на вопросы, Photos распознает лица на изображениях.На WWDC16 компания представила два API на основе нейронных сетей — базовые подпрограммы нейронных сетей (BNNS) и сверточные нейронные сети (CNN).
BNNS является частью системы Accelerate, которая является основой для выполнения быстрых вычислений на CPU, а CNN — частью библиотеки Metal Performance Shaders, использующей графический процессор.
Более подробную информацию об этих технологиях можно найти, например, Здесь .
Core ML и Turi Create
В прошлом году Apple анонсировала фреймворк, который значительно упрощает работу с технологиями машинного обучения — Core ML. Он основан на идее взять предварительно обученную модель данных и буквально интегрировать ее в ваше приложение всего за несколько строк кода.
С помощью Core ML можно реализовать множество функций:
- идентификация объектов на фотографиях и видео;
- интеллектуальный ввод текста;
- отслеживание и распознавание лиц;
- анализ движения;
- обнаружение штрих-кода;
- понимание и распознавание текста;
- распознавание изображений в реальном времени;
- стилизация изображения;
- и многое другое.
Ядро поддерживает нейронные сети, обобщенные линейные модели, разработку функций, ансамбли деревьев, машины опорных векторов и модели конвейеров.
Но Apple изначально не показала собственных технологий создания и обучения моделей, а лишь сделала конвертер для других популярных фреймворков: Caffe, Keras, scikit-learn, XGBoost, LIBSVM. Использование сторонних инструментов зачастую было не самой простой задачей; обученные модели были довольно большими, а само обучение занимало много времени.
В конце года компания представила Turi Create — фреймворк для обучения моделей, основной идеей которого была простота использования и поддержка большого количества сценариев — классификации изображений, обнаружения объектов, систем рекомендаций и многих других.
другие.
Но Turi Create, несмотря на то, что он относительно прост в использовании, поддерживал только Python.
Создать машинное обучение
А в этом году Apple, помимо Core ML 2, наконец-то показала собственный инструмент для обучения моделей — фреймворк Create ML, использующий родные технологии Apple — Xcode и Swift. Это быстро, а создавать универсальные модели с помощью Create ML очень просто.На WWDC была анонсирована впечатляющая производительность Create ML и Core ML 2 на примере приложения Memrise. Раньше обучение одной модели с использованием 20 000 изображений занимало 24 часа, но Create ML сокращает это время до 48 минут на MacBook Pro и 18 минут на iMac Pro. Размер обученной модели уменьшился с 90 МБ до 3 МБ.
Create ML позволяет использовать изображения, тексты и структурированные объекты, такие как таблицы, в качестве входных данных.
Классификация изображений
Давайте сначала посмотрим, как работает классификация изображений.Для обучения модели нам понадобится исходный набор данных: возьмите три группы фотографий животных: собак, кошек и птиц и распределите их по папкам с соответствующими названиями, которые станут названиями категорий модели.
Каждая группа содержит 100 изображений с разрешением до 1920х1080 пикселей и размером до 1Мб.
Фотографии должны быть как можно более разными, чтобы обученная модель не полагалась на такие сигналы, как цвет изображения или окружающее пространство.
Также, чтобы проверить, насколько хорошо обученная модель справляется с распознаванием объектов, необходим тестовый набор данных — изображения, не входящие в исходный набор данных.
Apple предоставляет два способа взаимодействия с Create ML: с помощью пользовательского интерфейса в macOS Playground Xcode и программно — с помощью CreateMLUI.framework и CreateML.framework. Используя первый метод, вам просто нужно написать пару строк кода, перенести выбранные изображения в указанную область и дождаться обучения модели.
На Macbook Pro 2017 года в максимальной конфигурации обучение заняло 29 секунд за 10 итераций, а размер обученной модели составил 33Кб.
Выглядит впечатляюще.
Попробуем разобраться, как нам удалось добиться таких показателей и что находится «под капотом».
Задача классификации изображений — один из самых популярных вариантов использования сверточных нейронных сетей.
Для начала стоит объяснить, что они собой представляют. Человек, увидев изображение животного, может быстро отнести его к определенному классу по каким-либо отличительным признакам.
Нейронная сеть работает аналогичным образом, выполняя поиск основных характеристик.
Принимая на вход исходный массив пикселей, он последовательно пропускает информацию через группы сверточных слоев и строит все более сложные абстракции.
На каждом последующем слое он учится выделять определенные признаки — сначала это линии, затем наборы линий, геометрические фигуры, части тела и так далее.
На последнем слое мы получаем выходные данные класса или группы вероятных классов.
В случае с Create ML нейросеть не обучается с нуля.
Фреймворк использует нейронную сеть, предварительно обученную на огромном наборе данных, который уже включает в себя большое количество слоев и отличается высокой точностью.
Эта технология называется трансферным обучением.
С его помощью можно изменить архитектуру предварительно обученной сети так, чтобы она была пригодна для решения новой задачи.
Затем модифицированная сеть обучается на новом наборе данных.
Create ML извлекает из фотографий около 1000 отличительных особенностей во время обучения.
Это могут быть формы предметов, цвет фактур, расположение глаз, размеры и многое другое.
Следует отметить, что исходный набор данных, на котором обучается используемая нейросеть, как и наш, может содержать фотографии кошек, собак и птиц, но конкретно не выделяет эти категории.
Все категории образуют иерархию.
Поэтому просто применить эту сеть в чистом виде невозможно — необходимо дополнительно обучать ее на наших данных.
В конце процесса мы можем увидеть, насколько точно наша модель была обучена и проверена после нескольких итераций.
Чтобы улучшить результаты, мы можем увеличить количество изображений в исходном наборе данных или изменить количество итераций.
Далее мы можем сами протестировать модель на тестовом наборе данных.
Изображения в нем должны быть уникальными, т.е.
не входить в исходный набор.
Оценка отображается для каждого изображения.
уверенность — насколько точно категория была распознана с помощью нашей модели.
Практически для всех фотографий, за редким исключением, этот показатель составлял 100%.
Я специально добавил изображение, которое вы видите выше, в тестовый набор данных, и, как видите, Create ML распознал в нем 86% собак и 13% птиц.
Обучение модели завершено, и нам остается только сохранить файл *.
mlmodel и добавить его в наш проект.
Чтобы протестировать модель, я написал простое приложение с использованием фреймворка Vision. Он позволяет работать с моделями Core ML и использовать их для решения таких задач, как классификация изображений или обнаружение объектов.
Наше приложение распознает картинку с камеры устройства и отобразит категорию и процент уверенности в правильности классификации.
Давайте инициализируем модель Core ML для работы с Vision и настроим запрос:
Добавим метод, который будет обрабатывать полученные результаты VNCoreMLRequest. Мы будем отображать только те, у которых показатель достоверности превышает 70%:func setupVision() { guard let visionModel = try? VNCoreMLModel(for: AnimalsClassifier().
model) else { fatalError("Can't load VisionML model") } let request = VNCoreMLRequest(model: visionModel) { (request, error) in guard let results = request.results else { return } self.handleRequestResults(results) } requests = [request] }
func handleRequestResults(_ results: [Any]) {
let categoryText: String?
defer {
DispatchQueue.main.async {
self.categoryLabel.text = categoryText
}
}
guard let foundObject = results
.
compactMap({ $0 as? VNClassificationObservation })
.
first(where: { $0.confidence > 0.7 })
else {
categoryText = nil
return
}
let category = categoryTitle(identifier: foundObject.identifier)
let confidence = "\(round(foundObject.confidence * 100 * 100) / 100)%"
categoryText = "\(category) \(confidence)"
}
И напоследок добавим метод делегата AVCaptureVideoDataOutputSampleBufferDelegate, который будет вызываться при каждом новом кадре с камеры и выполнять запрос:
func captureOutput(
_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return
}
var requestOptions: [VNImageOption: Any] = [:]
if let cameraIntrinsicData = CMGetAttachment(
sampleBuffer,
key: kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix,
attachmentModeOut: nil) {
requestOptions = [.
cameraIntrinsics:cameraIntrinsicData]
}
let imageRequestHandler = VNImageRequestHandler(
cvPixelBuffer: pixelBuffer,
options: requestOptions)
do {
try imageRequestHandler.perform(requests)
} catch {
print(error)
}
}
Проверим, насколько хорошо модель справляется со своей задачей:
Категория определяется с достаточно высокой точностью, и это особенно удивительно, учитывая, как быстро происходило обучение и насколько мал был исходный набор данных.
Периодически модель обнаруживает птиц на темном фоне, но я думаю, это можно легко решить, увеличив количество изображений в исходном наборе данных или повысив минимально допустимый уровень достоверности.
Если мы хотим дополнительно обучить модель классификации другой категории, нам просто нужно добавить новую группу изображений и повторить процесс — это займет несколько минут. В качестве эксперимента я сделал еще один датасет, в котором заменил все фотографии кошек на фотографии одного кота в разных ракурсах, но на одном и том же фоне и в той же обстановке.
При этом модель стала почти всегда ошибаться и распознавать категорию в пустой комнате, видимо, полагаясь на цвет как на ключевой признак.
Еще одна интересная функция, представленная в Vision только в этом году, — это возможность распознавать объекты на изображении в режиме реального времени.
Он представлен классом VNRecouncedObjectObservation, который позволяет получить категорию объекта и его местоположение —boundingBox.
В настоящее время Create ML не позволяет создавать модели для реализации этой функциональности.
В этом случае Apple предлагает использовать Turi Create. Процесс не намного сложнее описанного выше: нужно подготовить папки категорий с фотографиями и файл, в котором для каждого изображения будут указаны координаты прямоугольника, где находится объект.
Обработка естественного языка
Следующая функция Create ML — обучение моделей классификации текстов на естественном языке — например, для определения эмоциональной окраски предложений или обнаружения спама.
Для создания модели мы должны собрать таблицу с исходным набором данных — предложений или целых текстов, отнесенных к определенной категории, и обучить с ее помощью модель с помощью объекта MLTextClassifier: let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/Users/CreateMLTest/texts.json"))
let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 5)
let textClassifier = try MLTextClassifier(trainingData: trainingData, textColumn: "text", labelColumn: "label")
try textClassifier.write(to: URL(fileURLWithPath: "/Users/CreateMLTest/TextClassifier.mlmodel"))
В данном случае обученная модель имеет тип Классификатор текста:
Табличные данные
Давайте подробнее рассмотрим еще одну особенность Create ML — обучение модели с использованием структурированных данных (таблиц).Напишем тестовое приложение, которое прогнозирует цену квартиры на основе ее местоположения на карте и других заданных параметров.
Итак, у нас есть таблица с абстрактными данными о квартирах Москвы в виде csv-файла: известны площадь каждой квартиры, этаж, количество комнат и координаты (широта и долгота).
Кроме того, известна стоимость каждой квартиры.
Чем ближе к центру или больше площадь, тем выше цена.
Задачей Create ML будет построение модели, способной прогнозировать цену квартиры на основе заданных характеристик.
Такая задача в машинном обучении называется проблемой регрессии и является классическим примером обучения с учителем.
Create ML поддерживает множество моделей — линейную регрессию, регрессию дерева решений, классификатор деревьев, логистическую регрессию, классификатор случайного леса, регрессию усиленных деревьев и т. д. Мы будем использовать объект MLRegressor, который на основе входных данных подберет оптимальный вариант.
Сначала мы инициализируем объект MLDataTable содержимым нашего CSV-файла: let trainingFile = URL(fileURLWithPath: "/Users/CreateMLTest/Apartments.csv")
let apartmentsData = try MLDataTable(contentsOf: trainingFile)
Разделим исходный набор данных на данные для обучения и тестирования модели в процентном соотношении 80/20: let (trainingData, testData) = apartmentsData.randomSplit(by: 0.8, seed: 0)
Мы создаем модель MLRegressor, указывая данные обучения и имя столбца, значения которого мы хотим предсказать.
Тип регрессора для конкретной задачи (линейный, дерево решений, усиленное дерево или случайный лес) будет выбран автоматически на основе исследования входных данных.
Мы также можем указать столбцы признаков — конкретные параметры столбцов для анализа, но в данном примере это не обязательно; мы будем использовать все параметры.
В конце сохраните обученную модель и добавьте ее в проект: let model = try MLRegressor(trainingData: apartmentsData, targetColumn: "Price")
let modelPath = URL(fileURLWithPath: "/Users/CreateMLTest/ApartmentsPricer.mlmodel")
try model.write(to: modelPath, metadata: nil)
В этом примере мы видим, что тип модели уже является «Конвейерный регрессор», а в поле «Описание» указан тип регрессора «Автоматически выбранный» — «Модель регрессии с усиленным деревом».
Параметры «Входы» и «Выходы» соответствуют столбцам таблицы, но их тип данных стал Double. Теперь проверим результат.
Инициализируйте объект модели: let model = ApartmentsPricer()
Вызываем метод прогнозирования, передавая ему указанные параметры: let area = Double(areaSlider.value)
let floor = Double(floorSlider.value)
let rooms = Double(roomsSlider.value)
let latitude = annotation.coordinate.latitude
let longitude = annotation.coordinate.longitude
let prediction = try? model.prediction(
area: area,
floor: floor,
rooms: rooms,
latitude: latitude,
longitude: longitude)
Выводим прогнозируемое значение себестоимости: let price = prediction?.
price
priceLabel.text = formattedPrice(price)
Меняя точку на карте или значения параметров, мы получаем стоимость квартиры, достаточно близкую к нашим тестовым данным:
Заключение
Теперь платформа Create ML — это один из самых простых способов работы с технологиями машинного обучения.Он пока не позволяет создавать модели для решения определенных задач: распознавание объектов на изображении, стилизация фотографий, определение похожих изображений, распознавание физических действий на основе данных акселерометра или гироскопа, с чем, например, может справиться Turi Create. Но стоит отметить, что Apple за последний год добилась достаточно серьезного прогресса в этой области, и, наверняка, вскоре мы увидим развитие описываемых технологий.
Теги: #Машинное обучение #iOS #разработка iOS #Разработка мобильных приложений #машинное обучение #core ml #Swift #vision #create ml
-
"Как..."
19 Oct, 24 -
Сюжет «6 Часов До Запуска Бака»
19 Oct, 24 -
Онлайн Всемогущий
19 Oct, 24