Генеративно-состязательные сети (GAN) — это тип архитектуры глубокого обучения, который становится все более популярным для создания новых и реалистичных данных, таких как изображения, видео и аудио.
Создание модели GAN — это одно, а развертывание ее в виде удобного веб-приложения — совсем другая задача. В этой статье, состоящей из двух частей, мы рассмотрим, как создать и развернуть веб-приложение GAN Streamlit на платформе Heroku.
В части 1 мы рассмотрим предысторию и постановку проблемы, настроим рабочую среду, загрузим предварительно обученную модель GAN и изображения, а также создадим веб-приложение Streamlit. Часть 2 будет посвящена развертыванию приложения на платформе Heroku и обеспечению его доступности для пользователей.
Содержание:
- Общие сведения и описание проблемы
- Настройка рабочей среды
- Загрузка предварительно обученной модели и изображений GAN
- Создание веб-приложения Streamlit
- Запуск веб-приложения
Если вы хотите бесплатно изучать науку о данных и машинное обучение, ознакомьтесь со следующими ресурсами:
- Бесплатные интерактивные дорожные карты для самостоятельного изучения науки о данных и машинного обучения. Начните здесь: https://aigents.co/learn/roadmaps/intro
- Поисковая система для учебных ресурсов Data Science (БЕСПЛАТНО). Добавляйте в закладки свои любимые ресурсы, отмечайте статьи как завершенные и добавляйте учебные заметки. https://aigents.co/learn
- Хотите изучить науку о данных с нуля при поддержке наставника и учебного сообщества? Присоединяйтесь к этому учебному кружку бесплатно: https://community.aigents.co/spaces/9010170/
Если вы хотите начать карьеру в области обработки данных и искусственного интеллекта и вам нужно знать, как это сделать. Я предлагаю сеансы наставничества по науке о данных и долгосрочное наставничество по карьере:
- Долгосрочное наставничество: https://lnkd.in/dtdUYBrM
- Менторские сессии: https://lnkd.in/dXeg3KPW
Присоединяйтесь к программе Среднее членство всего за 5 $, чтобы продолжать обучение без ограничений. Я получу небольшую часть вашего членского взноса, если вы бесплатно перейдете по следующей ссылке.
1. Предыстория и постановка проблемы
GAN расшифровывается как Generative Adversarial Network, тип архитектуры искусственной нейронной сети, используемый для генерации новых данных, обычно изображений, видео или аудио. GAN состоят из двух глубоких нейронных сетей: сети генератора и сети дискриминатора.
Сеть генератора принимает случайный вектор шума в качестве входных данных и генерирует новые выборки, которые имитируют распределение обучающих данных. Сеть дискриминатора, с другой стороны, берет входные образцы и пытается отличить реальные данные от сгенерированных. Во время обучения генератор пытается создать выборки, которые дискриминатор не может отличить от реальных выборок, в то время как дискриминатор пытается правильно классифицировать выборки как настоящие или поддельные.
GAN имеют множество применений в компьютерном зрении, таких как синтез изображений, преобразование изображения в изображение, перенос стиля и сверхвысокое разрешение. Некоторые популярные модели GAN включают DCGAN (глубокая сверточная GAN), CycleGAN (циклически согласованные состязательные сети) и StyleGAN (GAN на основе стилей).
В этом проекте мы будем использовать предварительно обученные модели GAN для создания изображений лошадей с учетом изображений зебры и наоборот.
2. Настройка рабочей среды
Во-первых, мы создадим виртуальную среду под названием gan_application, используя следующий код и запустив его в командной строке:
python -m venv gan_application
После этого вы можете активировать среду, используя код ниже:
.\gan_application\scripts\activate
После этого мы начнем загружать пакеты и библиотеки, которые будем использовать в этом проекте:
pip install -r requirements.txt
После того, как мы установили библиотеки, пришло время их импортировать:
import streamlit as st from PIL import Image from tensorflow.keras.models import load_model from keras_contrib.layers.normalization.instancenormalization import InstanceNormalization import numpy as np from numpy import vstack
Теперь мы готовы приступить к созданию проекта.
3. Загрузка предварительно обученной модели и изображений GAN
Давайте сначала загрузим две модели GAN, первая будет генерировать изображения зебры из изображений лошадей, а вторая будет делать обратное. Код этого показан ниже:
#loading pretrained GAN models cust = {'InstanceNormalization':InstanceNormalization} model_horse2zebra = load_model('./g_model_AtoB_023740.h5',cust) model_zebra2horse = load_model('./g_model_BtoA_023740.h5',cust)
Сначала мы определяем словарь с именем cast, который используется в качестве слоя нормализации экземпляра. InstanceNormalization
— это слой нормализации, который выполняет поканальную нормализацию входного тензора, аналогичную пакетной нормализации. Однако в отличие от пакетной нормализации, которая нормализует ввод на основе статистики пакета, нормализация экземпляра нормализует каждый входной экземпляр на основе его собственного среднего значения и дисперсии.
Это предотвращает сдвиг среднего значения и ковариации для конкретного экземпляра, что упрощает процесс обучения. Интуитивно процесс нормализации позволяет удалить информацию о контрасте конкретного экземпляра из изображения содержимого в такой задаче, как стилизация изображения, что упрощает создание.
После этого две модели загружаются с помощью функции load_model из пакета Keras.
Следующий шаг — создать функцию для загрузки изображения, указав путь к изображению. Функция показана ниже:
def load_image(image_path): """ Function to load image given image path :param image_path: image path :return: loaded image """ image = Image.open(image_path) newsize = (256, 256) image = image.resize(newsize) image = np.array(image) image = image[np.newaxis, ...] # convert the array into 3D array return image
Наконец, мы создадим функцию с именем generate_image, которая возьмет модель GAN и изображение, которое мы хотим использовать, и вернет сгенерированное изображение.
def generate_image(model, image): """ Function to load image given image path :param model: The GAN model :param image: The image to apply the GAN model on :return: generated images """ generated_image = model.predict(image) images = vstack(generated_image) images = (images+1)/2.0 return images
Теперь пришло время создать потоковое веб-приложение, так что давайте начнем.
4. Создание веб-приложения Streamlit
Прежде чем приступить к созданию веб-приложения Streamlit, давайте сначала рассмотрим, что такое Streamlit и для чего оно используется. Streamlit — это библиотека Python с открытым исходным кодом, которая позволяет ученым и разработчикам данных быстро и легко создавать и развертывать интерактивные веб-приложения для анализа данных и проектов машинного обучения.
С помощью Streamlit пользователи могут создавать собственные веб-приложения, которые позволяют просматривать данные в режиме реального времени, визуализировать и взаимодействовать, не требуя значительных знаний в области веб-разработки. Streamlit упрощает процесс разработки, предоставляя платформу на основе Python, которая позволяет пользователям создавать интерактивные информационные панели, графики, диаграммы и другие визуализации данных с помощью нескольких строк кода.
Он также включает в себя такие функции, как автоматическое создание виджетов, кэширование данных и горячая перезагрузка, что позволяет пользователям сразу видеть свои изменения без перезапуска приложения. Streamlit также поддерживает развертывание веб-приложений с помощью всего нескольких команд, что упрощает обмен приложениями с другими через общедоступный URL-адрес или частную сеть. Это делает Streamlit идеальным инструментом для создания приложений, управляемых данными, обмена знаниями и совместной работы с другими.
Давайте начнем с установки заголовка и основного изображения веб-приложения, используя приведенный ниже код:
# Building the streamlit application st.title("Horse Zebra GAN Web APP") # Set the title st.image('./horses_zebras.png') # set the featured image of the web application
Затем мы создадим виджет раскрывающегося меню, позволяющий пользователям выбрать модель Generative Adversarial Network (GAN) для использования.
pick = st.selectbox("Please select a GAN model to use:", ["Horse 2 Zebra GAN", "Zebra 2 Horse GAN"])
Код создает переменную с именем pick и присваивает ей значение, возвращенное функцией selectbox из библиотеки Streamlit. Функция selectbox принимает два аргумента: строку метки, отображаемую рядом с раскрывающимся меню, и список опций, из которых пользователь может выбирать.
Когда пользователь выбирает параметр из раскрывающегося меню, значение переменной «pick» будет обновлено до выбранного параметра, который затем можно будет использовать в остальной части кода приложения, чтобы определить, какую модель GAN использовать.
Затем мы будем использовать оператор условия для выбора подходящей модели, а также для выбора того, хочет ли пользователь загрузить новое изображение или использовать изображение по умолчанию:
if pick == "Horse 2 Zebra GAN": # if the selected case is to convert from horse to zebra st.write("This is a GAN model for Generating Zebra images from Horses") st.write("Try out the GAN model with a default images of a horse or simply upload an image") if st.button("Try with Default Image"): # if the user selected to use the default image image = load_image('./horse.jpg') st.subheader("Horse Image") st.image(image) st.subheader("Generated Zebra Image") st.image(generate_image(model_horse2zebra, image)) st.subheader("Upload an image file of a horse to convert it to a Zebra") # if the user selected to upload an image uploaded_file = st.file_uploader("Upload JPG image file of a horse only", type=["jpg","jpeg"]) # only "jpg" and "jpeg" is allaowed. if uploaded_file: image = load_image(uploaded_file) st.image(generate_image(model_horse2zebra, image)) # generate the new image else: # if the second case was selected st.write("This is a GAN model for Generating Horse images from Zebras") st.write("Try out the GAN model with a default images of a zebra or simply upload an image") if st.button("Try with Default Image"): image = load_image('./zebra.jpg') st.subheader("Horse Image") st.image(image) st.subheader("Generated Horse Image") st.image(generate_image(model_zebra2horse, image)) st.subheader("Upload an image file of a zebra to convert it to a horse") uploaded_file = st.file_uploader("Upload JPG image file of a zebra only", type=["jpg","jpeg"]) if uploaded_file: image = load_image(uploaded_file) st.image(generate_image(model_zebra2horse, image))
Этот код использует ранее выбранную модель GAN (либо «Horse 2 Zebra GAN», либо «Zebra 2 Horse GAN») для создания изображений. Если выбран «Horse 2 Zebra GAN», код загружает изображение лошади, генерирует соответствующее изображение зебры с использованием выбранной модели GAN и отображает исходное и сгенерированное изображения. Если выбрано «GAN Zebra 2 Horse», код загружает изображение зебры, создает соответствующее изображение лошади с использованием выбранной модели GAN и отображает исходное и сгенерированное изображения.
Код включает в себя кнопки, с помощью которых пользователи могут попробовать модели GAN с изображениями по умолчанию, а также возможность для пользователей загружать свои собственные изображения для преобразования. Загружаемое изображение должно быть в формате JPG, разрешены только типы файлов «jpg» и «jpeg».
5. Запуск веб-приложения
Чтобы запустить веб-приложение Streamlit, вы можете легко сделать это, выполнив приведенную ниже команду в командной строке, но убедитесь, что вы находитесь в каталоге проекта:
streamlit run app.py
Во-первых, давайте начнем с использования изображения лошади по умолчанию и преобразуем его в зебру. Это показано на рисунке ниже:
Затем давайте изменим его на Zebra 2 Horse GAN и также используем изображение по умолчанию, как показано на рисунке ниже:
Мы также можем попробовать загрузить изображение лошади и сгенерировать изображение зебры, используя его, и наоборот. Давайте сначала начнем с загрузки изображения лошади и создания изображения зебры, как показано на рисунке ниже:
Далее мы сделаем то же самое, но загрузим изображение зебры и преобразуем его в изображение лошади:
Теперь приложение работает, пришло время развернуть его в Heroku. Это будет сделано во второй части, так что следите за обновлениями.
Если вам понравилась статья и вы хотите меня поддержать, сделайте следующее:
- 👏 Похлопайте в ладоши (50 хлопков), чтобы эта статья попала в топ
- Подпишитесь на меня в Среднем
- 📰 Смотрите больше контента в моем среднем профиле
- 🔔 Подпишитесь на меня: LinkedIn|Youtube| Гитхаб | Твиттер
Присоединяйтесь к программе Среднее членство всего за 5 $, чтобы продолжать обучение без ограничений. Я получу небольшую часть вашего членского взноса, если вы бесплатно перейдете по следующей ссылке.
Хотите начать карьеру в области науки о данных и искусственного интеллекта, но не знаете, как это сделать. Я предлагаю сеансы наставничества по науке о данных и долгосрочное наставничество по карьере:
- Долгосрочное наставничество: https://lnkd.in/dtdUYBrM
- Менторские сессии: https://lnkd.in/dXeg3KPW