В Предыдущей серии блогов мы говорили о том, почему прогнозирование качества изображения важно для нашей платформы и как мы решили эту проблему с помощью глубоких сверточных сетей с использованием трансферного обучения Pre -Подготовьте модель MobileNet.

В этой части мы поговорим о том, как мы использовали модель машинного обучения в iOS для предсказания изображений.

Первый подход: использование TensorFlow

TensorFlow - это библиотека с открытым исходным кодом для потока данных и дифференцируемого программирования для целого ряда задач. Он также содержит символьную математическую библиотеку, полезную для приложений машинного обучения, таких как нейронные сети. Его разработала команда Google Brain.

Один из самых простых способов интегрировать TensorFlow - через CocoaPods.

Предпосылкой для использования TensorFlow является наличие модели глубокого обучения, совместимой с TensorFlow. В предыдущем блоге мы обучили нашу модель с помощью Keras (, который создает модель в формате .h5). Однако .h5 несовместим с TensorFlow, поэтому мы сначала преобразовали модель Keras в совместимую с TensorFlow (формат .pb).

Keras - это высокоуровневый API нейронных сетей, написанный на Python и способный работать поверх TensorFlow, CNTK или Theano. Он был разработан с упором на возможность быстрого экспериментирования.

Для преобразования модели Keras в формат, совместимый с TensorFlow, мы использовали существующие функции, предоставляемые Tensor Prepare Model Tool. Для мобильного развертывания этот инструмент сначала замораживает все переменные и узлы графа, чтобы оптимизировать размер графа (поскольку мы не можем обучить модель машинного обучения на реальных устройствах, поэтому нам не нужны графы переменных и мы можем сэкономить здесь немного места в памяти). Затем этот инструмент сохраняет постоянные графики и веса в двоичный файл Protobuf (Protobuf проведет еще один раунд оптимизации размера, поскольку он имеет сокращенный шаблонный код). Во время замораживания инструмент также применяет отсечение узлов, которое удаляет узлы без вклада в выходной тензор.

На следующей диаграмме показан процесс преобразования. Более подробную информацию вы можете найти здесь.

Вы можете найти сценарий конвертации здесь.

Теперь у нас все настроено для внедрения машинного обучения в наше приложение. К сожалению, когда мы закончили реализацию, мы поняли, что использование TensorFlow увеличило двоичный размер приложения еще на 11 МБ. Глубоко погрузившись в проблему, мы обнаружили, что размер фреймворка TensorFlow iOS составляет ~ 10 МБ. Это слишком, и нам это совсем не нравится! Итак, мы провели мозговой штурм еще раз, и вуаля, по нашему второму подходу!

Плюсы:

  • Его адаптивная конструкция позволяет легко визуализировать каждый аспект графика.
  • Поддерживаемый Google, TensorFlow имеет преимущество в непрерывной производительности, быстрых обновлениях и частых выпусках новых выпусков с новыми функциями.
  • Когда дело доходит до распределенных вычислений, их легко идентифицировать как на CPU, так и на GPU.
  • Его можно настроить, и его исходный код открыт.
  • Он предлагает расширенную поддержку очередей, асинхронных вычислений и потоков.
  • Его возможности автоматического дифференцирования позволяют использовать алгоритмы машинного обучения на основе градиентов. Это позволяет вам вычислять несколько производных значений по отношению к другим значениям, что приводит к расширению графика.

Минусы:

  • Для работы требуется глубокое понимание машинного обучения, исчисления и линейной алгебры.
  • Не поддерживает OpenCL (язык открытых вычислений)
  • Память графического процессора конфликтует с Theano (библиотекой Python, которая позволяет определять, оптимизировать и оценивать математические выражения, эффективно задействуя многомерные массивы) при импорте в той же области.
  • Платформа TensorFlow iOS имеет размер 10 МБ - значительный недостаток, если вы хотите сохранить размер приложения оптимизированным.

Второй подход: CoreML

CoreML - это новый фреймворк машинного обучения, представленный Apple в 2017 году - он отлично подходит для новичков, только начинающих. Эту структуру можно использовать для создания более интеллектуальных функций Siri, Camera и QuickType. CoreML обеспечивает невероятно высокую производительность с простой интеграцией, позволяя разработчикам добавлять интеллектуальные функции с помощью всего нескольких строк кода.

CoreML поставляется в комплекте с iOS, поэтому для машинного обучения не требуется дополнительного места. Это идеально соответствует нашим требованиям!

Первым шагом интеграции является преобразование модели Keras в формат, совместимый с CoreML (.mlmodel). Большое спасибо Apple за то, что они предоставляют инструмент поддержки (CoreMLTool) для такого преобразования. Скрипт преобразования ниже:

"""
Convert model saved in keras h5 format to apple coreml format
Dependencies: 
coremltools - latest version built from source https://github.com/apple/coremltools.git
Arguments
    - path to the keras .h5 file
    - path to the output .mlmodel file where the converted model is stored
    
Usage
    python convert_keras_to_coreml.py model.h5 model.mlmodel
"""
import coremltools
import sys
if len(sys.argv) != 3:
        raise ValueError("Script expects two arguments. " +
              "Usage: python convert_keras_to_coreml.py model.h5 model.mlmodel")
coreml_model = coremltools.converters.keras.convert(sys.argv[1],input_names=['image'],image_input_names="image", output_names=['dense_1/Sigmoid'], image_scale=1/127.5, red_bias=-1.0,  green_bias=-1.0, blue_bias=-1.0)
coreml_model.save(sys.argv[2])

Второй шаг - добавить эту недавно созданную модель (.mlmodel) в исходный код приложения. Еще раз большое спасибо Apple за простой в интеграции интерфейс. Все, что нам нужно сделать, это импортировать модель в проект, а Xcode сделает все остальное. Вот как это выглядит при импорте.

На иллюстрации выше показано:

  • Информация о модели
  • Тип модели и его ожидаемые входы и выходы

Следующая блок-схема [Рис 3] иллюстрирует процесс интеграции модели:

Повторюсь, наша цель машинного обучения здесь - предсказать качество изображения. Вот где нам нужен фреймворк Apple Vision.

Vision работает с CoreML для применения моделей классификации к изображениям и предварительной обработки этих изображений, что упрощает и повышает надежность задач машинного обучения.

Мы готовы начать кодирование и прогнозировать качество изображения.

  1. Создание модели зрения из модели CoreML - модель обзора помогает настроить весь конвейер обработки изображений, а также помогает выполнять предварительную обработку, масштабирование, обрезку, обнаружение прямоугольников / штрих-кодов / лиц и многое другое.
let coreModel = ImageQualityModel().model
guard let model = try? VNCoreMLModel(for: coreModel) else {                  fatalError("can't load Places ML model")
}

2. Create Vision Request для прогнозирования качества изображения - запрос анализа изображения, который использует модель Core ML для обработки изображений.

let request = VNCoreMLRequest(model: model) { [weak self] request, error in
/// Do result task
}}

На приведенном выше рисунке (Рис. 2) выходные данные оценки модели представляют собой несколько массивов (массив оценок качества изображения). При прогнозировании качества выходной массив содержит только один результат (показатель качества) для входного изображения.

3. Обработка результатов

let request = VNCoreMLRequest(model: model) { [weak self] request, error in
guard let topResult = request.results?.first as? VNCoreMLFeatureValueObservation else {
fatalError("unexpected result type from VNCoreMLRequest")
}
let firstValue: Double = Double(truncating: topResult.featureValue.multiArrayValue?[0] ?? 0)
DispatchQueue.main.async { [weak self] in
// Do your main thread work here with result
}}}

Поскольку мы ожидаем одного результата, наш код извлекает первое значение из выходного массива и использует его как VNCoreMLFeatureValueObservation (VNCoreMLFeatureValueObservation - это тип наблюдения, который является результатом анализа изображений, роль которого заключается в прогнозировании, а не классификация или преобразование изображения в изображение).

Все запросы Vision используют вычисления с помощью графического процессора (в фоновом потоке с высоким приоритетом), поэтому результат должен быть передан в основной поток.

4. Выполнить запрос на видение. В нашем случае прогноз качества изображения происходит, когда пользователь выбирает изображение при публикации объявления [Рис. 4].

let ciImage = CIImage(image: image)
let handler = VNImageRequestHandler(ciImage: image)
DispatchQueue.global(qos: .userInteractive).async {
do {
try handler.perform([request])
} catch {
print(error)
}}

Плюсы:

  • Очень легко интегрировать.
  • Не ограничивается только глубоким обучением - может использоваться для логистической регрессии, деревьев решений и других классических моделей машинного обучения.
  • Поставляется с удобным инструментом конвертера, который поддерживает несколько различных учебных пакетов (Keras, Caffe, scikit-learn и другие).

Минусы:

  • CoreML поддерживает только ограниченное количество типов моделей. Если ваша модель обучена делать что-то, что CoreML не поддерживает, вы не можете использовать CoreML.
  • Инструменты преобразования в настоящее время поддерживают только несколько учебных пакетов. Заметным упущением является TensorFlow - возможно, самый популярный инструмент машинного обучения. Вы можете написать свои собственные конвертеры, но это не работа для новичка. TensorFlow не поддерживается, поскольку это низкоуровневый пакет для создания общих вычислительных графов, тогда как CoreML работает на более высоком уровне абстракции.
  • Никакой гибкости и небольшого контроля - Core ML API очень прост, так как позволяет только загружать модель и запускать ее. Невозможно добавить настройки к вашим моделям.
  • Доступно только на устройствах, поддерживающих iOS 11+.

Таким образом, на пути преобразования модели к интеграции модели мы узнали, что использование TensorFlow для машинного обучения на мобильных устройствах может немного увеличить размер вашего приложения, что делает его менее благоприятным подходом. С другой стороны, использование CoreML упрощает интеграцию.

В ходе этого процесса мы также узнали, как модель Keras можно преобразовать и развернуть в различных средах машинного обучения высокого уровня.

В конечном итоге все это упражнение делает наше приложение более ориентированным на клиента. Каким образом?
Прогноз качества изображения помогает нашим пользователям [продавцам] понять и улучшить качество своих объявлений, что приведет к увеличению числа заинтересованных покупателей, заключению более выгодной сделки и счастливому пользователю.

Ссылки: