Генеративно-состязательные сети (GAN) — это тип архитектуры глубокого обучения, который становится все более популярным для создания новых и реалистичных данных, таких как изображения, видео и аудио.

Создание модели GAN — это одно, а развертывание ее в виде удобного веб-приложения — совсем другая задача. В этой статье, состоящей из двух частей, мы рассмотрим, как создать и развернуть веб-приложение GAN Streamlit на платформе Heroku.

В части 1 мы рассмотрим предысторию и постановку проблемы, настроим рабочую среду, загрузим предварительно обученную модель GAN и изображения, а также создадим веб-приложение Streamlit. Часть 2 будет посвящена развертыванию приложения на платформе Heroku и обеспечению его доступности для пользователей.

Содержание:

  1. Общие сведения и описание проблемы
  2. Настройка рабочей среды
  3. Загрузка предварительно обученной модели и изображений GAN
  4. Создание веб-приложения Streamlit
  5. Запуск веб-приложения

Если вы хотите бесплатно изучать науку о данных и машинное обучение, ознакомьтесь со следующими ресурсами:

  • Бесплатные интерактивные дорожные карты для самостоятельного изучения науки о данных и машинного обучения. Начните здесь: https://aigents.co/learn/roadmaps/intro
  • Поисковая система для учебных ресурсов Data Science (БЕСПЛАТНО). Добавляйте в закладки свои любимые ресурсы, отмечайте статьи как завершенные и добавляйте учебные заметки. https://aigents.co/learn
  • Хотите изучить науку о данных с нуля при поддержке наставника и учебного сообщества? Присоединяйтесь к этому учебному кружку бесплатно: https://community.aigents.co/spaces/9010170/

Если вы хотите начать карьеру в области обработки данных и искусственного интеллекта и вам нужно знать, как это сделать. Я предлагаю сеансы наставничества по науке о данных и долгосрочное наставничество по карьере:

Присоединяйтесь к программе Среднее членство всего за 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. Это будет сделано во второй части, так что следите за обновлениями.

Если вам понравилась статья и вы хотите меня поддержать, сделайте следующее:

Присоединяйтесь к программе Среднее членство всего за 5 $, чтобы продолжать обучение без ограничений. Я получу небольшую часть вашего членского взноса, если вы бесплатно перейдете по следующей ссылке.



Хотите начать карьеру в области науки о данных и искусственного интеллекта, но не знаете, как это сделать. Я предлагаю сеансы наставничества по науке о данных и долгосрочное наставничество по карьере: