Обучение ESRGAN

Материал из wolfram
Перейти к навигации Перейти к поиску

Обучения силами BasicSR от Xintao.

За основу взята версия релиз 1.2

Интересно то, что все будет запускаться нативно в Windows. Без каких либо прослоек. С использование аппаратного ускорения CUDA.

Подготовка

Скрин скачивания с сайта python.org

Python

Устанавливаем Python, в моем случае 3.9.5 с официального сайта.

При установке обязательно поставить галочку на против Add Python 3.9.5 to Path - это нужно чтобы он прописался как команды в Windows, что позволит выполнять команды Python из любого терминала.

После инсталляции открыть PowerShell и ввести:

Python

Получим ответ по типу:

Python 3.8.5 (default, Sep  3 2020, 21:29:08)

Значит все Ок, все установлено верно и будет работать.

Скрин скачивания с сайта PyTorch

PyTorch

фреймворк машинного обучения для языка Python с открытым исходным кодом.

Без него не будет работать BasicSR.

Берем опять же от официалов

В моем случае это версия 1.8.1, для Windows, устанавливаться будет через pip3, Работать будет с CUDA11.1.

Будет сгенерирован код.

Выполняем через PowerShell от администратора:

pip3 install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio===0.8.1 -f https://download.pytorch.org/whl/torch_stable.html

Начнется небыстрая установка компонентов.

Результатов в процессе будет очень много, сложно сказать какие могут быть проблемы...

NVDIA драйвер

Ставим самый последний драйвер, как обычно, наверняка это все умеют, с официального сайта конечно.

Скрин скачивания CUDA Toolkit

CUDA Toolkit

Такое обычный пользователь ставить не будет, но в данном случае придется, ведь наша нейросеть основана на cuda, точнее она исполняет код с помощью CUDA Toolkit.

Конечно же брать с официального сайта. Выбрать Windows, архитектуру x86_64, версия Windows конечно же 10, ну и тип установщика: автономный или локальный, в челом без разницы.

Устанавливает как обычно, практически также как драйвер.

Так что ждем установки и радуемся успешному окончанию.

Git

Тоже мало кто будет ставить это на Windows, но разработчики это делают по умолчанию. Потому что, а как еще взаимодействовать с GitHab. Интересно, что MS давно уже приобрели GitHab, но какого мелкомягкого человека Git не встроен в Windows до сих пор!?

Ладно... Скачиваем с официального сайта. Естественно под x64, в каком веке мы живем?

Ничего сложного, далее, далее, далее, готово.

Теперь мы можем получать с Githab и подобных файлы напрямую, через PowerShell.

Пункт для установки Microsoft C++ Build Tools

Microsoft C++ Build Tools

Не понимаю зачем но придется поставить и вот это. Да понятно что это, но на всего то нужно пара как их то модулей, но придется ставить монструозный софт, весом под 4 гигабайта.

Конечно скачать с официального сайта.

При установке, отметить галкой C++ Build Tools. Как показано на картинке.

Как получить нужную версию BasicSR

BasicSR

При скачивании последней версии, обучение модели работает, но при создании Валидных изображений процесс крашится. На момент 22.05.20.

Поэтому беру релизную версию и не мучаюсь. В ней все работает, но инструкция не соответствует. Поэтому по ссылке приложена именно страница на момент выпуска релиза.

Важно!

В инструкции написано:

git clone https://github.com/xinntao/BasicSR.git

Но так как мы берем не последнюю версию, то нужно просто получить архив, на картинке:

Скачиваем архив, помещаем содержимое куда надо. Вообще не важно куда.


Теперь запускаем PowerShell от админа.

Переходим в папку BasicSR - у меня это выглядит так:

cd D:\test\AI\BasicSR

Выполняем команды:

pip install -r requirements.txt
python setup.py develop

Произойдет не мало всего, и очень надеюсь что без ошибок.


Настройка

Под настройкой подразумевается прописывание в конфигах нужных путей, настроек.

Мы хотим обучать сеть, алгоритм будем брать ESRGAN.

Открываем текстовым редактором файл:

.\BasicSR\options\train\ESRGAN\train_ESRGAN_x4.yml

name: указываем имя паки в которую будут складываться результаты.

name: Manga_set2

Далее по документу:

datasets:
 train:
  name: DIV2K
  type: PairedImageDataset
  dataroot_gt: datasets/Manga_set2/GT   # тут папка в корой лежат файлы к которым сеть будет стремиться.
  dataroot_lq: datasets/Manga_set2/LQ   # тут файлы которые сеть будет пытаться превратить в то к чему нужно стремится.

Следующий блок:

val:
 name: Set14
 type: PairedImageDataset
 dataroot_gt: datasets/Manga_set2/GT_V # это файлы валидности, чрез некий промежуток времени будет делаться создание среза в виде результата обработки, то что как бы должно быть.
 dataroot_lq: datasets/Manga_set2/LQ_V # из этого она попытается сделать конечный результат, который мы увидим, своего рода срезы обучения.

Следующий блок отвечает за местоположение файла предварительно обученной модели.

path:
 pretrain_network_g: experiments/pretrained_models/ESRGAN_PSNR_SRx4_DF2K_official-150ff491.pth # путь до файла модели, обучение запускается именно отсюда
 strict_load_g: true
 resume_state: ~ # в начале обучения тут ничего не должно быть, но в какой то момент, захочется остановить обучение, и продолжить позже, для этого ниже создаются срезы модели. Вот этими срезами и можно будет воспользоваться для возобновления обучения. Просто будет указан путь до среза.

Данный блок отвечает за то как часто будет создаваться изображения валидности, из срезов.

val:
 val_freq: !!float 1e2 # может указываться как в научном виде, так и простом, например 200. Каждые 200 итераций, будет выполнено создание изображения с использованием текущего состояния модели.
 save_img: true

Данные блоки отвечают за частоту отображения состоянии итераций и сохранении срезов модели.

logger:
  print_freq: 10 # частота отображения результатов в командной строке.
  save_checkpoint_freq: !!float 1e3 # частота создания срезов модели. В данном случае раз в 1000 итераций. Не забываем что каждый такой срез занимает 256 мегабайт, и таких срезом будет порядка 400, в итоге это будет занимать очень много места.

В общем с настройками train_ESRGAN_x4.yml можно закончить.

Следующим этапом будет подготовка датасетов.

Датасет

Для начала нам нужно понять что мы хотим получать на выходе.

Пример того что нужно получить Зерно в Полутона

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

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

Результат работы уже обученной модели не учитывающей превращение зерна в градиенты

Но есть еще причины, в сети изображение в 99 процентах случаем уменьшают в разрешении, Происходит интерполяция, и каждая точка уже не способна уместится в один пиксель, происходит сглаживание, но самое не приятное, меняется общая гамма, из за изменения плотности. Получается изображение теряет свои оригинальные оттенки.

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

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

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

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


Посмотрим что получится. На момент написания статьи я сам не знаю результата, получится у меня или нет.

Пример Градиент и текстура

Первое что я предполагаю еще до обучения, это то как объяснить модели, где реально зерно для создания градиента, а еде например вот такая вот текстура как на картинке.

Сверху отчётливо видно, что есть объект стилизованный под текстуру. А внизу закрашенный градиент.

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


А это все означает следующее:

Нам нужно найти пару десятков, изображений низком качестве с зерном на переходах и эти же изображения но в отличном качестве, с градиентами вместо зерна.

Совсем не простая задача, как кажется.


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