Пошаговое руководство по комплексной модели классификации изображений пород собак, развернутой на Heroku, поддерживаемой серверной частью Node JS и REST API, созданной на Flask.

Недавно наткнувшись на fastai, чрезвычайно универсальную среду глубокого обучения, которая находится поверх PyTorch, я был взволнован не только ее гибкостью в построении моделей глубокого обучения мирового уровня, но и акцентом, который придавали ее основатели Джерми Ховард и Доктор Рэйчел Томас о преобразовании этих моделей в полезные приложения. Только в первых двух главах fastbook fastai описывает структуру, необходимую для создания комплексного приложения для глубокого обучения. Здесь я использую концепции, представленные в этих главах, для построения модели классификации изображений, которая способна различать 50 пород собак с точностью примерно 80%. Позже модель была развернута на Heroku, работающем на бэкэнде Node JS, где прогнозы модели вызывались с использованием REST API, созданного на Flask.

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

Шаг 1: Построение модели в Jupyter Notebook

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

Установка и импорт зависимостей fastai

Загрузка набора данных

Определение схемы преобразования изображений, готовых для обучения модели глубокого обучения.

Обучение модели

  • Экспорт модели

Для набора данных я создал веб-скребок с помощью Beautiful Soup для загрузки изображений 50 лучших пород собак, как сообщается в Американском клубе собаководства. Всего было 5000 изображений, по 100 изображений на породу, что позволило нам поддерживать одинаковое распределение набора данных для обучения и проверки между классами. Я выбрал ResNet34 вместо ResNet101, ResNet50 и ResNet18 в качестве архитектуры модели из-за его оптимальных показателей производительности (скорость и точность). Чтобы облегчить обобщение модели, к набору обучающих данных было применено увеличение данных по умолчанию с использованием размера пакета 8. Здесь я использовал размер пакета 8 из-за ошибки недостаточно памяти, когда в экземпляре ноутбука AWS SageMaker использовалось 32 или 64. . Помимо этого, остальная часть кода в основном представляет собой стандартную практику и является хорошим местом для начала построения базовой модели. В дополнение к вышесказанному я также использовал класс ClassificationInterpretation из библиотеки fastai для изучения производительности модели. Сводка по обучению модели показана ниже.

Как показано в сводке по обучению, модели удалось достичь точности примерно 80% всего за 4 эпохи. Учитывая тенденцию к снижению как потерь при обучении, так и при проверке, вполне вероятно, что существует потенциал для дальнейшего улучшения модели за счет оптимизации гиперпараметров и предварительной обработки изображений. Однако для целей этой задачи я буду использовать это базовое состояние модели, содержащее архитектуру модели и обученные параметры, для построения приложения.

Шаг 2. Создание и развертывание REST API с использованием Flask и Render.

Создание моделей машинного обучения — это здорово, но только когда мы переносим эти модели на обслуживание приложений в производственной среде, мы по-настоящему раскрываем ценность идей машинного обучения. Для достижения этой цели я поместил модель за REST API с помощью Flask, который позже был представлен с помощью веб-страницы для прогнозирования на основе запроса пользователя. Вы также можете сделать то же самое с другими веб-фреймворками Python, такими как Django, Tornado и т. д. Ниже приведен код, используемый в Flask для создания API.

Это был мой первый раз, когда я использовал Flask, но документация и надежное сообщество переполнения стека определенно упростили этот процесс. На данный момент у нас есть REST API с конечной точкой /predict, на которую мы можем отправить POST-запрос (изображение собаки), чтобы получить прогноз породы в виде объекта JSON. В целях тестирования я загрузил изображение Чихуахуа из Google и использовал Почтальон для отправки запроса POST в только что созданный API. Как показано ниже, выходные данные точно предсказали породу с оценкой вероятности 0,83.

Затем для размещения API я использовал Render, быструю, масштабируемую и надежную облачную платформу. Я выбрал Render, а не Heroku из-за ограничения размера slug на Heroku, вероятно, из-за зависимостей fastai. Для создания веб-сервиса на Render требуется пакет gunicorn, файл requirement и git-репозиторий, сгенерированный с помощью приведенного ниже кода.

Настройки, используемые при развертывании API, показаны ниже.

Шаг 3: Настройка внешнего интерфейса с использованием HTML, CSS и Bootstrap

Учитывая, что это не упражнение по внешнему дизайну, я использовал комбинацию HTML, CSS и Bootstrap, чтобы собрать простой пользовательский интерфейс для классификатора изображений.

HTML

CSS

Вуаля! Конечный результат.

Шаг 4: Создание серверной части с использованием Node JS

Следующим шагом является создание внутреннего сервера, который находится между интерфейсом на стороне клиента и API для запуска модели прогнозирования. Учитывая масштаб этого проекта, нет никаких реальных преимуществ или недостатков в использовании бэкэнда в среде JS или Python. Я решил создать серверную часть с помощью Node JS, а не Python, в основном из-за моего личного знакомства с фреймворком.

Серверная часть предназначена для получения изображения от клиента, отправки запроса POST в API, а затем предоставления ответа от API клиенту во внешнем интерфейсе. Я использовал ejs для динамического изменения внешнего интерфейса на основе ответа API. Я никогда не устанавливал серверную часть для загрузки изображений, что потребовало некоторого исследования того, как использовать модуль multer и axios вместе. В конце концов, я вытащил и вот код.

Шаг 5: Развертывание приложения на Heroku

Последний шаг, развертывание приложения на Heroku аналогично развертыванию Render. Однако на этот раз нам нужен Procfile, документ со следующим текстом:

 web: node app.js

Нам также необходимо зафиксировать все добавления и изменения в репозиторий git перед развертыванием. Подробную инструкцию по развертыванию приложений Node JS на Heroku можно найти здесь.

Заключительные мысли

Таким образом, я создал и развернул простую модель классификации изображений, которая способна классифицировать 50 лучших пород собак с точностью 80%, используя ResNet34. Модель потенциально может быть улучшена, вероятно, за счет большей вычислительной мощности, путем добавления большего количества размеченных данных и/или использования более сложной архитектуры модели. Вторая половина проекта была посвящена развертыванию модели с использованием REST API, созданной на Flask и размещенной на Heroku с использованием Node JS. В целом результат был удовлетворительным, учитывая, что модель была построена менее чем за 10 минут с ограниченными усилиями по настройке гиперпараметров и/или предварительной обработке изображений, которые станут предметом будущих экспериментов.