Когда вы не можете поймать их всех, вы создаете их всех

Оглавление

  1. "Введение"
  2. "Источник данных"
  3. "Настраивать"
  4. Предварительная обработка данных
  5. Обучение модели
  6. "Результаты"
  7. "Вывод"
  8. "Использованная литература"

Введение

Что делать фанату Pokémon GO в разгар пандемии, когда выходить из дома, чтобы поймать покемонов, нельзя? Конечно же, создавать своих собственных покемонов!

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

GAN — это генеративные модели, которые создают новые данные на основе заданных обучающих данных. Они делают это, противопоставляя две модели друг другу: одну генеративную модель и одну модель дискриминатора. Цель генератора — создать новые данные, которые выглядят реальными, а цель дискриминатора — отличить реальные данные от сгенерированных данных.

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

Я основывал свой процесс на этом руководстве по глубокой сверточной генеративно-состязательной сети от TensorFlow:



Источник данных

Я буду использовать этот набор данных от Kaggle:



Он содержит по одному изображению для всех 809 покемонов от поколения 1 до 7. Он также содержит файл CSV с первичным и вторичным типом для каждого, но я не буду использовать его для этого проекта.

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



Настраивать

Прежде всего, я загружаю и импортирую все библиотеки Python, которые мне понадобятся для этого проекта:

# To generate GIFs
%pip install imageio
%pip install git+https://github.com/tensorflow/docs
import numpy as np

import zipfile
import os
from PIL import Image
import matplotlib.pyplot as plt
from matplotlib import gridspec
import tensorflow as tf
from tensorflow.keras import layers
import time
from IPython import display
# To generate GIFs
import glob
import imageio

Теперь я создаю список путей к файлам для каждого изображения покемонов. Если вы используете Google Colab, я рекомендую загрузить набор данных в виде zip-файла и извлечь его из блокнота.

train_dir = "/content/images/images/"
fnames = os.listdir(train_dir)
filepaths = [train_dir + fname for fname in fnames]

Предварительная обработка данных

Когда все настроено, давайте подготовим наш набор данных для нашей модели машинного обучения!

Во-первых, я настрою несколько констант:

IMG_SIZE = 120
BATCH_SIZE = 8
BUFFER_SIZE = 809       # number of pokemon in our dataset

Затем мы определим несколько функций для предварительной обработки.

В нашем наборе данных изображения различаются цветовым форматом и цветом фона. Нам нужны согласованные цветовые форматы для нашей модели машинного обучения, и мы хотим, чтобы у всех покемонов был одинаковый цвет фона, чтобы наши сгенерированные изображения не имели смешения цветов фона. Чтобы решить эту проблему, modify_background убирает прозрачность изображений, конвертируя их из RGBA в RGB, и добавляет черный фон. preprocess вызывает modify_background и масштабирует значения RGB так, чтобы они находились в диапазоне от -1 до 1.

Чтобы увидеть эти функции в действии, мы протестируем их на изображении Abomasnow. Здесь у нас исходное изображение вверху и модифицированное изображение внизу:

Примечание. В Google Colabim.show()из библиотеки PIL не работает. Вместо этого используйте имя экземпляра образа PIL (например,imвместоim.show()).

Наконец, мы создадим и настроим наш набор обучающих данных:

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

Теперь мы готовы построить и обучить нашу модель!

Мы начнем с создания нашей модели генератора, последовательной модели с 3 транспонированными сверточными слоями. При обучении и тестировании генератора передается шум. В ходе обучения генератор учится создавать новые данные, которые напоминают обучающие данные из этого шума.

Далее я создаю дискриминатор. Это последовательная модель с двумя сверточными слоями. Дискриминатор принимает изображения и посредством обучения учится отличать настоящие данные от поддельных. Для некоторого увеличения данных я также включил слой, который случайным образом переворачивает тренировочные изображения по горизонтали. Поскольку 800 изображений очень мало для обучения GAN, это помогает увеличить размер набора данных и добавляет некоторую вариативность.

Нам также необходимо определить функции потерь и оптимизаторы как для генератора, так и для дискриминатора:

Теперь мы определим тренировочный цикл! Поскольку обучение занимает много времени (даже с аппаратным ускорителем GPU), мы также создадим контрольные точки сохранения, чтобы нам не пришлось начинать с нуля, если что-то пойдет не так в середине.

В предыдущей ячейке кода мы также определили несколько констант. Я установил количество эпох на 500, размеры шума на 100 и количество генерируемых примеров на 16. Трудно быть уверенным, когда GAN закончил обучение, поэтому я решил остановиться, когда несколько основных происходили изменения, и тренировка, казалось, стабилизировалась, что, как я обнаружил, произошло примерно через 500 эпох после моих пробных прогонов.

Наконец, я обучаю модель. Если вы используете Google Colab, я рекомендую использовать аппаратный ускоритель графического процессора, чтобы ускорить процесс обучения.

train(train_dataset, EPOCHS)
checkpoint.restore(tf.train.latest_checkpoint(checkpoint_dir))

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

Результаты

Вот завораживающий тренировочный процесс:

И через 500 эпох вот 16 сгенерированных фальшивых покемонов:

Эти 16 поддельных изображений покемонов — мой результат после 500 эпох. Этими сгенерированными изображениями никого не обманешь, но, похоже, у них есть потенциал выглядеть как настоящие покемоны. Синее изображение во втором столбце третьего ряда напоминает покемонов водного и ледяного типов, в то время как изображение в четвертом столбце третьего ряда, похоже, имеет красные глаза и потенциально может быть новым типом призрака.

К сожалению (а в некоторых случаях и к счастью), некоторые мелкие детали, такие как глаза, присутствующие во второй половине тренировочного процесса, к концу исчезают. Вы можете поэкспериментировать с количеством периодов обучения, чтобы найти идеальный баланс между детализацией и стабильностью!

Вывод

Мы успешно обучили модель машинного обучения для создания поддельных изображений покемонов!

Но то, что мы создаем сейчас, далеко не готово к игре. Чтобы потенциально улучшить производительность модели, мы могли бы:

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


Вот несколько ресурсов, где можно найти дополнительные советы и рекомендации:





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

В дополнение к тем, на которые есть ссылки в этой статье, я бы не смог завершить этот проект без помощи этих замечательных примеров и руководств:

[1] Разработчики Google | Генеративно-состязательные сети

[2] ТензорФлоу | Увеличение данных

[3] Каггле | Генерация покемонов с помощью генеративно-состязательных сетей (GAN), Павел Гавриков

[4] Юпитер | PokeGAN: создание поддельных покемонов с помощью генеративно-состязательной сети, Джастин Кляйбер

[5] Мастерство машинного обучения | Джейсон Браунли Как начать работу с генеративно-состязательными сетями.

[6] На пути к науке о данных | Генеративно-состязательная сеть (GAN) для чайников — пошаговое руководство, Мишель Кана