В части 1 (Edge ML: Часть 1 — преобразование модели из TF в CoreML) мы смогли преобразовать существующую модель мобильной сети в модель CoreML. В этой части давайте воспользуемся преобразованной моделью CoreML для выполнения классификации на iPhone.
Это включает в себя создание приложения для iOS. Начнем с создания пустого приложения SwiftUI с помощью Xcode.
Шаг 1 (Xcode) — импорт модели CoreML в приложение. Xcode позволяет очень легко импортировать модель, просто перетащив файл модели и папку с весами в пространство проекта. Наше преобразование дало файл .mlPackage. На Mac щелкните правой кнопкой мыши и выберите «Показать содержимое пакета», в котором есть фактический файл .mlmodel и папка с весами. Оба должны быть добавлены. Перетащите родительскую папку в Xcode. Xcode автоматически распознает файл модели и создаст класс модели на основе имени файла модели, а также создаст входные и выходные классы по мере необходимости.
Дважды щелкните файл .mlmodel, чтобы убедиться, что модель успешно загружена. Xcode отображает, что класс был сгенерирован автоматически. Теперь модель успешно импортирована в проект.
Шаг 2 (Swift). Оберните модель в VNCoreModel. После создания классов использование модели упрощается. Поскольку эта модель является моделью классификации изображений, ее можно обернуть в VNCoreMLModel. Рамки видения предоставляют множество полезных возможностей. Например, ввод заботится о предварительной обработке ввода для удовлетворения требований модели.
let defaultConfig = MLModelConfiguration() //convertMobileNet - auto generated by Xcode when model was imported let converted_model = try! convertMobileNet(configuration: defaultConfig) //wrap the model in a VNCoreModel guard let vnModel = try? VNCoreMLModel(for: converted_model.model) else{ fatalError("not a valid VNCoreMLModel") }
Шаг 3 (Swift) — Создайте запрос на выполнение модели. На этом шаге создается запрос на модель. Здесь в качестве входных данных предоставляется тестовое изображение. Ввод обрабатывается через VNCoreMLRequest, который упаковывает входные данные, используемые моделью.
let classificationReq = VNCoreMLRequest(model:vnModel,completionHandler: {}) //the images I chose were are not centered. hence scale to fit classificationReq.imageCropAndScaleOption = .scaleFit let imgHandler = VNImageRequestHandler(cgImage: testInput.cgImage!) //create a request array with just the classification req let requests: [VNRequest] = [classificationReq] //perform the prediction. Ideally kick off a separate thread to perform this in the background try imgHandler.perform(requests)
Шаг 4 (Swift) — обработка результатов модели. После завершения классификации запрос получает ответ внутри завершенияHandler. В обработчике завершения запрос получается как объект, из которого извлекаются наблюдения.
completionHandler: {request,error in guard let observations = request.results as? [VNClassificationObservation] else{ print("unable to get results from classification") return } //the observations are sorted by the descending order of the confidence already. so retrieve the first element of the array. let resultLabel = observations[0].identifier
Быстрая демонстрация из примера тестового приложения. Каждый файл был разного размера, и классификация была довольно быстрой. Предварительная обработка изображений была решающим фактором. Например, изображение автомобиля имеет размер 2,9 МБ, на обработку которого ушло около 2 секунд. Другие были стабильно быстрее. Модель была довольно точной, однако она классифицировала изображение кошки как египетскую кошку! Может быть это!
С этой демонстрацией Часть 2 завершена. Мы можем выполнить классификацию с помощью существующей модели на устройстве iPhone, преобразовав ее в модель CoreML. Для выполнения классификации с использованием CoreML и Vision Framework у Apple есть документация по ссылке Классификация изображений с помощью Vision и Core ML.
Спасибо за прочтение!