Как обучить модель Pix2Pix и ее создание в сети с помощью ml5.js

В этом посте я рассмотрю процесс обучения модели генеративного изображения с помощью Spell, а затем перенесу модель в ml5.js. Так я поступил со своим проектом во время занятий в ITP Нью-Йоркского университета в этом семестре. Я сделал простое интерактивное веб-приложение, используя только что обученную мою собственную модель Pix2Pix.

Что такое Pix2Pix?

Pix2Pix, или преобразование изображения в изображение, может научиться преобразовывать изображения одного типа в новое изображение другого типа. Pix2Pix использует своего рода алгоритм генерации, называемый Conditional Adversarial Network (cGAN), где процесс генерации обусловлен входным изображением. Исходные статья и код, опубликованные Филипом Изола и др.

К счастью, я мог получить подробные объяснения модели и технических деталей на курсах Neural Aesthetic и Machine Learning for the Web, которые преподают Джин Коган и Инин Ши, соответственно. . Вот хорошие ресурсы из классов, которые содержат более подробное описание того, как работает Pix2Pix. [1] [2]

Кроме того, мы можем попробовать известную интерактивную демонстрацию и найти отличный пост с подробным объяснением того, как работает процесс кодирования-декодирования, на этой странице, сделанной Кристофером Гессе. Я использовал его реализацию Pix2Pix Tensorflow и запустил его внутри Spell run.

Что я построил

Сначала я создал интерактивный генератор человеческих изображений, основанный на примере ml5.js Pix2Pix. Вот моя демонстрационная ссылка:



Я обучил модель на парах фотографий людей и цветном сегментированном изображении этих исходных изображений. Из этого Pix2Pix узнал, как преобразовывать цветные сегментированные изображения в выходные изображения, которые показывают изображения, похожие на человеческие. Таким образом, вы можете использовать тот же подход для обучения модели любым связанным парам изображений, которые вам нравятся.

Я также сделал еще одно веб-приложение под названием #HUMANSOFNOWHERE. Вы можете использовать изображение потока веб-камеры в качестве входного источника для создания Pix2Pix. Он также генерирует текст с моделью LSTM, портированной ml5.js. Модель тренировалась со всеми изображениями и текстами, взятыми из существующей учетной записи Instagram Humans of New York. Таким образом, основная идея этого проекта заключалась в создании автономного бота для Instagram, который генерирует изображения и подписи, а затем публикует их, чтобы учетная запись могла быть как отражение peopleofny. культового нью-йоркского аккаунта IG.

На самом деле, этот еще не завершен, но я бы выпустил ссылку на его альфа-версию и учетную запись Instagram здесь.





Как я построил

Я расскажу только о первом примере Pix2Pix, а не о другом, который объединен с LSTM. Если вы хотите обучить и использовать LSTM с ml5.js, для начала есть видеоурок.

1) Подготовка данных

Мне потребовалась пара сотен парных изображений человеческой фотографии и ее сегментации, чтобы обучить мою собственную модель Pix2Pix. Поскольку эта модель, похоже, не требует безумно больших наборов данных изображений по сравнению с другими генеративными моделями, я решил очистить все изображения из аккаунта Humans of New York в Instagram. Для этого я использовал скрипт Python Instagram Scraper. В итоге из аккаунта мне пришло 4200 изображений.

Самым сложным в подготовке данных было уточнение изображений. Чтобы правильно обучить Pix2Pix, мне нужно было сначала получить квадратные изображения размером 256x256 пикселей, а затем мне пришлось преобразовать их в изображения 512x256 в паре с такими же размерами сегментированных изображений людей, как это:

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

Для сегментации людей я написал скрипт с использованием модели сегментации tenorflow.js (если возможно, я рекомендую вместо этого использовать модель body-pix). Приведенный ниже фрагмент кода особенно используется для обработки парных изображений. После обработки изображений я вручную загрузил 240 парных изображений.

Есть и другие варианты получения изображений, сегментированных по лицам. Например, в этом может помочь модель Mask-RCNN.

2) Обучение

После того, как пары изображений были собраны, мне нужно было обучить мою модель. Для этого я использовал вычисления с ускорением на графическом процессоре. Этот процесс выполняется с помощью Spell. Если вы не знакомы с Spell, посмотрите это вводное видео Дэниела Шиффмана * Choo Choo * или страницу" Learn with Spell . Кроме того, у Yinying есть репо, в котором выполняется точно такой же процесс, чтобы вы могли лучше понять Spell.

После того, как все настройки Spell выполнены на моем локальном компьютере, я открыл терминал и набрал spell login, чтобы войти в Spell. Затем я клонировал репозиторий реализации Pix2Pix Tensorflow и перешел в каталог.

git clone https://github.com/affinelayer/pix2pix-tensorflow.git
cd pix2pix-tensorflow

Перед началом обучения я загрузил подготовленный набор данных изображений в удаленную папку ресурсов Spell. В моем случае я установил имя папки загрузки как «данные».

spell upload DIRECTORY_PATH_WITH_DATASET [--name new-name]

Если загрузка прошла успешно, вы можете найти папку на панели управления Spell Resources с тем же именем, которое вы установили.

Все выглядело хорошо, поэтому я дал команду тренироваться.

spell run --machine-type V100 --mount uploads/data:/data/ --framework tensorflow 'python pix2pix.py --mode train --input_dir /data/ --output_dir ckpt --which_direction BtoA --max_epochs 200'

Это заняло около получаса, но время работы могло варьироваться в зависимости от установленных вами машин или гиперпараметров.

В корневой папке pix2pix-tensorflow , я мог экспортировать модель, чтобы использовать ее в Интернете с помощью ml5.js.

# create folder in pix2pix-tensorflow repo folder
mkdir ckpt
cd ckpt

# copy the result from spell run
spell cp runs/YOUR_RUN_NUMBER/ckpt

# export the model in pix2pix-tensorflow root folder
python pix2pix.py --mode export --output_dir export/ --checkpoint ckpt/ --which_direction BtoA

# port the model to tensorflow.js
cd server
cd static
mkdir models
cd ..
python3 tools/export-checkpoint.py --checkpoint ../export --output_file static/models/MY_MODEL_BtoA.pict

Эти команды дали экспортированный файл модели в формате .pict. Я использовал эту модель на ml5.js.

3) Используйте модель

В скрипте ml5.js я мог просто изменить путь, чтобы он указывал на мою новую модель.

pix2pix = ml5.pix2pix('model/MY_OWN_MODEL.pict', modelLoaded);

Если кто-то хочет поиграть с примером, который я сделал, вот источник. Этот подход и код для обучения Pix2Pix должны работать с любыми хорошо структурированными парами изображений, которые вы хотите использовать. Вы можете проверить некоторые интересные результаты, созданные этой моделью, в Instagram #HUMANSOFNOWHERE.