В части 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.

Спасибо за прочтение!