Короче говоря, цель этого проекта — раскрасить и восстановить старые фотографии.
Я расскажу немного подробнее, но сначала давайте посмотрим на фотографии! Кстати, большая часть оригинальных изображений взята с сабреддита r/TheWayWeWere, всем спасибо за такие качественные большие картинки.
Это всего лишь несколько примеров, и они вполне типичны! Мария Андерсон в роли Маленькой феи и ее паж Любовь Рябцова в балете «Спящая красавица» в Императорском театре, Санкт-Петербург, Россия, 1890 г.
Женщина отдыхает в гостиной (1920, Швеция)
Студенты-медики позируют рядом с трупом, около 1890 года.
Серфер на Гавайях, 1890 год.
Вращающаяся лошадь, 1898 г.
Интерьер бара Миллера и Шумейкера, 1899 год.
Париж в 1880-х годах
Вид на Динбург с высоты птичьего полета в 1920-е годы.
Женщина из Техаса, 1938 год.
Люди на вокзале Ватерлоо впервые смотрят телевизор, Лондон, 1936 год.
Урок географии 1850 года.
Китайские курильщики опиума в 1880 году.
Обратите внимание, что даже очень старые и/или некачественные фотографии по-прежнему выглядят довольно круто: Дедвуд, Южная Дакота, 1877 год.
Братья и сестры в 1877 году (Дедвуд)
Портсмут-сквер в Сан-Франциско, 1851 год.
Самурай, около 1860-х годов.
Конечно, модель не идеальна.
Эта красная рука сводит меня с ума, но в остальном она работает просто фантастически: Ирокезская девушка-сенека, 1908 год.
Она также умеет раскрашивать черно-белые рисунки:
Технические детали
Это модель, основанная на глубоком обучении.
В частности, я объединил следующие подходы:
- Самообслуживание ГАН .
Единственное, что используется в качестве генератора предварительно обученный Unet и я просто поменял его на спектральную нормализацию и, собственно, механизм Само-внимания.
Это достаточно простая модификация.
Позвольте мне сказать вам, разница потрясающая по сравнению с предыдущей версией Wasserstein GAN, которую я пытался заставить работать.
Мне понравилась теория GAN Вассерштейна, но на практике она не работает. Но я просто влюбился в ГАНы Self-Attention.
- Структура обучения, такая как прогрессивный рост ГАН (но не совсем так).
Разница в том, что количество слоев остается постоянным: я просто менял размер входных данных и настраивал скорость обучения так, чтобы переходы между размерами были успешными.
Кажется, что он дает тот же конечный результат, но он обучается быстрее, более стабилен и лучше обобщает.
- Правило ТТУР (Правило обновления двух временных масштабов).
Здесь все довольно ясно: всего лишь однозначные итерации генератора/дискриминатора (критика) и более высокая скорость обучения дискриминатора.
- Функция потерь генератора состоит из двух частей: одна из них — основная функция Perceptual Loss (или Feature Loss) на основе VGG16 — она просто подталкивает модель генератора к репликации входного изображения.
Вторая часть – оценка потерь со стороны дискриминатора (критика).
Для любопытных: одной только функции Perceptual Loss недостаточно для хорошего результата.
Обычно это просто поощряет кучу коричневых, зеленых и синих — вы знаете, обманывает тест, а в этом нейронные сети действительно хороши! Ключевой момент заключается в том, что GAN, по сути, изучает функцию потерь за вас, что на самом деле является одним большим шагом к идеалу, к которому мы стремимся в машинном обучении.
И, конечно же, результаты значительно улучшатся, когда машина сама научится тому, что вы ранее закодировали вручную.
Здесь это, безусловно, так.
То, что вы видите выше, — это результаты модели раскрашивания, но это всего лишь один компонент в процессе разработки, который я хочу разработать с использованием той же модели.
Далее я попробую улучшить старые изображения, и следующий пункт на повестке дня — модель улучшения насыщенности и насыщенности (дефейд).
Сейчас она находится на начальной стадии обучения.
По сути, это та же модель, но с некоторыми настройками контрастности/яркости для имитации выцветших фотографий и снимков, сделанных на старом/плохом оборудовании.
Я уже получил некоторые обнадеживающие результаты:
Подробнее о проекте
В чем суть этого проекта? Я просто хочу применить GAN, чтобы старые фотографии выглядели очень-очень хорошо.
И что еще более важно, это сделает проект полезный .
И да, мне определенно интересна работа с видео, но сначала надо разобраться, как эту модель контролировать в плане потребления памяти (это настоящий зверь).
Было бы неплохо, если бы модели не занимали два-три дня на обучение на 1080Ti (к сожалению, типичное для GAN).
Хотя это мое детище и я буду активно обновлять и улучшать код в обозримом будущем, постараюсь сделать программу максимально удобной для пользователя, хотя с ней наверняка возникнут некоторые трудности.
И я клянусь, что я правильно задокументирую код. когда-нибудь.
Признаюсь, я один из тех людей, которые верят в «самодокументируемый код» (LOL).
Запуск модели самостоятельно Проект построен на замечательной библиотеке Fast.AI. К сожалению, это старая версия, и ее еще предстоит обновить до новой (это определенно на повестке дня).
Итак, предпосылки, вкратце:
- Старый Библиотека Fast.AI .
Зарывшись в проекте на два месяца, я немного упустил, что с ним произошло, потому что тот, который сейчас помечен как "старый", на самом деле не похож на тот, что у меня есть.
Все изменилось за последние два месяца или около того.
Так что если с другими версиями ничего не работает, я развил это здесь .
Опять же на повестке дня обновление до последней версии, заранее извиняюсь.
- Все зависимости Fast.AI : Там есть удобные файлы «requirements.txt» и «environment.yml».
- Питон 0.4.1 (требуется Spectrum_norm, поэтому нужна последняя стабильная версия).
- ЮпитерЛаб .
- Тензорборд (т.е.
установка Tensorflow) и ТензорбордX .
Я не думаю, что это строго обязательно, но так гораздо проще.
Для вашего удобства я уже предоставил все необходимые хуки/обратные вызовы в Tensorboard! Есть примеры их использования.
Примечательно, что по умолчанию внутрипроцессные изображения записываются в Tensorboard каждые 200 итераций, поэтому вы получаете единообразное и легко читаемое представление о том, что делает модель.
- ImageNet : Отличный набор данных для обучения.
- Мощная видеокарта .
Мне бы очень хотелось иметь больше памяти, чем 11 ГБ в моей GeForce 1080Ti. Если у вас что-то послабее, будет сложно.
Unet и Critic абсурдно велики, но чем они больше, тем лучше результаты.
Затем откройте ColorizationVisualization.ipynb в JupyterLab. Убедитесь, что там есть строка со ссылкой на веса:
Затем вам нужно загрузить модель раскраски после инициализации netG:colorizer_path = Path('/path/to/colorizer_gen_192.h5')
load_model(netG, colorizer_path)
Затем просто поместите любые изображения в папку /test_images/, из которой вы запускаете программу.
Вы можете визуализировать результаты в Jupyter Notebook с помощью следующих строк: vis.plot_transformed_image("test_images/derp.jpg", netG, md.val_ds, tfms=x_tfms, sz=500)
Я бы оставил размер около 500 пикселей, плюс-минус, если вы запускаете программу на графическом процессоре с большим объемом памяти (например, GeForce 1080Ti 11 ГБ).
Если памяти меньше, то придется уменьшить размер изображений или попробовать запустить на процессоре.
На самом деле я пытался сделать последнее, но по какой-то причине модель работала очень, абсурдно медленно, и я не нашел времени исследовать проблему.
Эксперты рекомендовали собрать Pytorch из исходного кода, что приведет к значительному повышению производительности.
Хм.
В тот момент на это не было времени.
Дополнительная информация
Визуализация сгенерированных изображений по мере обучения Может выполнить в Jupyter: вам просто нужно установить значение истинный при создании экземпляра этого крючка рендеринга: GANVisualizationHook(TENSORBOARD_PATH, trainer, 'trainer', jupyter=True, visual_iters=100
Я предпочитаю уйти ЛОЖЬ и просто используйте Tensorboard. Поверьте, вам тоже захочется сделать именно это.
Кроме того, если вы оставите его включенным слишком долго, Jupyter съест много памяти такими изображениями.
Вес модели также автоматически сохраняется во время тренировок GANTrainer. По умолчанию они сохраняются каждые 1000 итераций (это дорогостоящая операция).
Они хранятся в корневой папке, указанной вами для обучения, а имя соответствует имени save_base_name, указанному в расписании обучения.
Веса сохраняются отдельно для каждого размера тренировки.
Я бы рекомендовал просмотреть ваш код сверху вниз, начиная с Jupyter Notebook. Я отношусь к этим заметкам просто как к удобному интерфейсу для прототипирования и визуализации, все остальное перейдет в файлы .
py, как только я найду для них место.
У меня уже есть примеры визуализации, которые можно удобно включить и просмотреть: достаточно открыть xVisualization в Notebook, там перечислены тестовые изображения, входящие в проект (они находятся в test_images).
Если вы видите GAN Schedules — это самая уродливая вещь в проекте, всего лишь моя версия реализации GAN с прогрессивным обучением, подходящая для генератора Unet. Предварительно обученные веса для генератора колоризатора.
Здесь .
Проект DeFade все еще в разработке, я постараюсь опубликовать хорошие веса в течение нескольких дней.
Обычно при обучении первые хорошие результаты вы увидите на полпути, то есть с размера 192px (если использовать предоставленные обучающие примеры).
Я уверен, что где-то что-то напутал, поэтому, пожалуйста, дайте мне знать, если это так.
Известные вопросы
- Это займет немного поиграйте с размером изображения чтобы получить лучший результат. Модель явно страдает от некоторой зависимости от соотношения сторон и размера при создании изображений.
Раньше было намного хуже, но ситуация значительно улучшилась с увеличением освещения/контраста и введением прогрессивного обучения.
Я хочу полностью устранить эту проблему и сосредоточусь на ней, но пока не отчаивайтесь, если изображение выглядит слишком насыщенным или имеет странные глюки.
Скорее всего, после небольшого изменения размера все будет хорошо.
Как правило, для перенасыщенных изображений нужно увеличить размер.
- В дополнение к вышесказанному: получение качественных изображений на самом деле сводится к следующему: искусство выбора оптимальных параметров .
Да, результаты выбираются вручную.
Качеством я очень доволен, модель работает достаточно надежно, но не идеально.
Проект все еще продолжается! Я думаю, что этот инструмент можно использовать в качестве «ИИ художника», но он еще не готов для широкой публики.
Просто еще не время.
- Ситуация усложняется: в настоящее время модель жестоко съедает память , поэтому на моей карте 1080Ti я могу обрабатывать изображения размером максимум 500-600 пикселей.
Могу поспорить, что здесь есть много вариантов оптимизации, но я еще этого не сделал.
- Я добавил в генератор Unet заполнение нулями для всего, что не соответствует ожидаемым размерам (именно так я могу загрузить изображение нестандартного размера).
Это был очень быстрый хак, который привел к появлению глупых правых и нижних границ при выводе тестовых изображений произвольного размера.
Я уверен, что есть лучший способ, но я его еще не нашел.
- Модель любит синяя одежда.
Не совсем понимаю почему, ищу решение!
Дополнение от переводчика.
Из последних новостей в Твиттере: Сами представители национальности у своей землянки, 1880 год.
( оригинальный ) Строительство лондонского метро, 1860 г.
( оригинальный ) Трущобы Балтимора, 1938 год.
Тренажерный зал на Титанике, 1912 год.
( оригинальный )
Теги: #Машинное обучение #Программное обеспечение #с открытым исходным кодом #Обработка изображений #pytorch #jupyterlab #fast.ai #Wasserstein GAN #Self-Attention GAN #раскрашивание #восстановление фотографий
-
Поповский Николай Никитич.
19 Oct, 24 -
Скевоморфизм И Повествование
19 Oct, 24 -
Эстетика Шума В Аналоговой Музыке
19 Oct, 24 -
Как Не Простудиться
19 Oct, 24 -
Усиленный Протез Руки Для Страйкбола
19 Oct, 24