fast.ai - отличный бесплатный курс с открытым исходным кодом для многих людей, которые любят изучать и тренировать модель глубокого обучения. Одна из причин, по которой fast.ai так популярен, заключается в том, что fast.ai упрощает и ускоряет использование и обучение моделей для специалистов по машинному обучению. Несмотря на то, что обучение с fast.ai происходит быстро (благодаря нескольким встроенным методам, например, автоматический поиск скорости обучения, стохастический градиентный спуск с перезапусками (SGDR)…), оно обычно дает самые современные результаты.

Для многих людей, у которых есть собственные идеи и данные, одной модели обучения недостаточно. Конечной целью на самом деле является преобразование их обученной модели fast.ai в производство (например, iOS, приложение для Android, веб-сервисы). В этом руководстве будет показано, как превратить модель классификатора изображений из fast.ai в приложение для iOS.

Поток

Поскольку fast.ai построен на Pytorch, мы фактически преобразуем его из модели Pytorch в ONNX и, наконец, в модель Apple Core ML, которую затем импортируем в проект iOS.

Pytorch → ONNX → Apple Core ML

Что нам нужно установить

  • Pytorch: если среда fast.ai все еще использует старую версию Pytorch, лучше обновить Pytorch до последней версии (например, Pytorch 0.4.1) через https://pytorch.org
  • onnx-coreml: https://github.com/onnx/onnx-coreml

Шаги

›Подготовка. Pytorch-onnx в настоящее время не поддерживает AdaptivePooling, но fast.ai использует его для обучения на входных изображениях разных размеров (способ предотвращения переобучения). Но если нас интересует только один размер, скажем 299, мы должны заменить AdaptivePooling на поддерживаемый уровень пула с фиксированным размером. Перейдите в библиотеку fastai и отредактируйте файл fastai / Layers.py следующим образом:

  • Добавление двух классов: MyAdaptiveMaxPool2d и MyAdaptiveAvgPool2d.
  • Замена двух слоев Max и Average в AdaptiveConcatPool2d этими двумя новыми классами, указанными выше.

›Обучение: теперь мы можем обучать классификатор изображений с фиксированным размером изображения с заменой новых слоев AdaptivePooling. Предположим, что мы тренировали модель Собака против кошки, как этот блокнот курса fast.ai, и мы получили точность 0,9975 на проверочном наборе.

Примечание. Я пробовал как Resnext50, так и Resnet50, Pytorch-onnx и onnx-coreml смогли преобразовать их без ошибок.

›Извлечение модели Pytorch из fast.ai learn.model:

  • Добавьте слой Изображение Преобразование на передний план: перед отправкой по модели все данные изображения нормализуются в диапазоне [0, 1]. Это делает Dataloader, а не модель. Поэтому нам нужно добавить слой трансформации в начало модели. Здесь я просто добавляю масштаб, разделив данные изображения на 255,0. Я надеюсь, что библиотека Apple Core ML или ONNX сделает это за нас в будущем.
  • Замените слой LogSoftmax на Softmax в конце, чтобы получить вероятность вместо потерь / стоимости.

›Преобразование:

  • Во-первых, нам нужно создать фиктивное входное изображение с формой (3, 299, 299). Этот фиктивный ввод не повлияет на вес нашей модели. Для приложения для iOS оно будет предсказывать по одному изображению за раз, поэтому мы не используем здесь пакетную обработку.
  • Во-вторых, при вызове torch.onnx.export нам нужно указать имя для нашего входного слоя, которым является изображение, с помощью параметра «input_names». И после этого нам нужно использовать то же имя для «image_input_names» при вызове convert в Apple Core ML. Таким образом, Xcode будет понимать наш ввод как изображение вместо MLMultiArray.
  • И последнее, но не менее важное: для проблемы классификации нам нужно создать текстовый файл, содержащий метки всех выходных классов. Например, я создал файл labels.txt, содержащий 2 строки:
cat
dog

После этого шага мы получим файл с именем «dog_vs_cat_image.onnx.mlmodel» для импорта в Xcode.

Остальные описания ниже будут просто автоматически отображаться в Xcode, когда мы импортируем модель Core ML.

›Импорт mlmodel в Xcode:

Это довольно простой шаг.

  • Скачайте и откройте пример с сайта Apple.
  • Перетащите файл «dog_vs_cat_image.onnx.mlmodel» в Xcode. Возможно, нам стоит переименовать его в соглашение об именах классов CamelCase, например DogvsCatModel.mlmodel.
  • В файле ImageClassificationViewController.swift замените класс модели по умолчанию (MobileNet) нашей новой моделью (DogvsCatModel).
  • Запустите Xcode и поехали.

Полный код обучающей и конвертирующей модели можно найти здесь: