Привет, любопытный человек, в этой серии под названием Deploy Deep Learning мы собираемся развернуть две модели глубокого обучения, одна будет классифицировать изображения между кошками и собаками, а другая будет определять тип карты, то есть король, королева, туз и т. Д. наши руки на Docker, Tensorflow Serving, Flask, Nginx, gunicorn. Итак, без дальнейших промедлений, приступим.

Мы будем развертывать наши модели через службу Tensorflow с использованием контейнеров Docker. Мы собираемся создать три сервиса с использованием трех контейнеров Docker, то есть 1. Web, 2. Tensorflow Serving, 3. Nginx.

Итак, без дальнейших задержек, давайте создадим нашу первую услугу,

  1. Интернет

Наше веб-приложение будет доступно пользователю через веб-браузер. Пользователь сможет создать учетную запись в нашем приложении, чтобы он мог войти в систему и использовать наше приложение.

Создайте папку с именем «web» и внутри этой «веб-папки» создайте другую папку с именем «flask».

Теперь создайте файл с именем «app.py» внутри папки «flask». Ниже приведен код для «app.py»

Теперь давайте разберемся с нашим «app.py» построчно,

из строк 1–6, мы импортируем библиотеки Python, которые будем использовать в нашем приложении фляги.

Строка 8–10. Мы импортируем другие вспомогательные сценарии Python, которые будут созданы нами. Я расскажу о них позже

Строка 12–20. Мы инициализируем наше приложение flask, в основном присоединяем его к базе данных sqlite, в которой будут храниться наши имя пользователя и пароль, и определяем диспетчер входа в систему для нашего приложения, который позаботится о процедурах входа в систему для наших пользователей. Примечание. «SECRET_KEY» должен быть чем-то сложным. Я привел здесь пример «SECRET_KEY».

Строка 24, функция create_tables () создает файл data2.db, в котором хранятся имя пользователя и пароль. Декоратор flask_app.before_first_request выполняет этот запрос перед любым другим запросом на флэш

Строка 27-82, Мы определяем функции, которые будут обрабатывать операции входа и выхода наших пользователей. В строке 58 мы используем функцию generate_password_hash () для хеширования пароля, поскольку сохранение пароля в виде простого текста является большой ошибкой безопасности.

Строка 86, функция predic () позволяет пользователю загрузить изображение в наше веб-приложение и возвращает результат прогноза, то есть, является ли загруженное изображение кошкой или собакой. Декоратор login_required делает функцию Forex () доступной только в том случае, если Пользователь вошел в систему.

Строка 106, функция object_detection () позволяет пользователю загружать изображение в наше веб-приложение и возвращает результат прогноза, то есть ограничивающие рамки для обнаруженных карточек в изображениях. Примечание: Пользователь не будет загружать изображение через веб-браузер для функции object_detection (), а через конечную точку API.

Строка 113, функция load_user () сообщает Flask-Login, как найти конкретного пользователя по идентификатору, который хранится в их cookie сеанса.

Мы закончили с нашим файлом «app.py». Теперь создадим файл «model.py» в папке «flask». Файл «model.py» содержит функции, которые будут отправлять загруженное пользователем изображение в наши обученные модели глубокого обучения, которые развертываются через службу Tensorflow.

Теперь давайте разберемся с нашим «model.py» построчно,

Строка 1-10, Мы импортируем необходимые библиотеки Python.

Строка 13-14, «MODEL_URI» определяет расположение URL-адреса для модели классификации изображений, которая развертывается с использованием обслуживания Tensorflow. «КЛАССЫ» определяют два класса, то есть кошку и собаку.

Строка 16, функция non_max_suppression () удаляет перекрывающиеся ограничивающие рамки, которые обнаруживаются нашей моделью обнаружения объектов в заданном входном изображении. Примечание: в Tensorflow также есть встроенный метод, т.е. tf.image.non_max_suppression.

Строка 66, функция get_prediction () принимает загруженное пользователем изображение и отправляет его в нашу модель классификации изображений, которая развертывается через службу Tensorflow. Он возвращает результат прогноза и интерпретирует результат в один из классов, то есть кошку или собаку. Обратите внимание, я предварительно обучил модель классифицировать изображения кошки и собаки.

Строка 85, функция get_objects () принимает загруженное пользователем изображение и отправляет его в нашу модель обнаружения объектов, которая также развертывается через ту же службу Tensorflow, что и выше. Он возвращает результат прогнозирования и интерпретирует результат в координаты ограничивающих прямоугольников и тип карты, обнаруженный для соответствующих ограничивающих прямоугольников. В этой функции из строки 90–97 я написал коды для отправки загруженного пользователем изображения в модель обнаружения объектов через запрос gRPC из строки 98–124. Я написал код для интерпретации результата прогнозирования. В строке 110 я вызываю функцию non_max_suppression () для удаления перекрывающихся ограничивающих рамок, обнаруженных нашей моделью обнаружения объектов. Обратите внимание, я предварительно обучил свою модель обнаружению следующих типов карт: девятка, десятка, валет, дама, король, туз. Набор данных, который я использовал для обучения своей модели, можно найти по этой ссылке.

Мы закончили с нашим файлом «model.py». Теперь создадим файл «dbmodels.py» в папке «flask». Файл «dbmodels.py» содержит пользователя класса, который создаст структуру для нашей базы данных, в которой будут храниться имя пользователя и пароль.

Теперь создадим файл «manage.py» в папке «flask». Файл manage.py позволяет нам добавить интерфейс командной строки для нашего флеш-приложения.

Теперь создадим файл «database.py» в папке «flask». Файл «database.py» инициализирует нашу базу данных SQL. Он создается в отдельном файле, так как импортируется в различные другие файлы, созданные нами.

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

А пока приятного дня :)

Если вы готовы продолжить, вот ссылка на Часть 2

Использованная литература-

  1. Https://www.digitalocean.com/community/tutorials/how-to-add-authentication-to-your-app-with-flask-login
  2. Https://www.pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/