Обучение ESRGAN: различия между версиями
Владимир (обсуждение | вклад) мНет описания правки |
Владимир (обсуждение | вклад) |
||
| (не показано 15 промежуточных версий этого же участника) | |||
| Строка 1: | Строка 1: | ||
Обучения силами BasicSR от Xintao. | Обучения силами '''BasicSR''' от '''Xintao'''. Речь пойдет о '''двух''' версиях данного проекта. | ||
Версия '''1.2''' и версия сразу '''до 1.0'''. Какую выбрать? На момент написания, для версии '''до 1.0''' (будем называть её '''B''' - beta) есть несколько оболочек, позволяющих обработать изображение в пару кликов, обходя при этом '''ограничения видеопамяти''' и многое другое. Об этом в разделе '''Использование'''. | |||
Интересно то, что все будет запускаться нативно в Windows. Без каких либо прослоек. С использование аппаратного ускорения CUDA. | Интересно то, что все будет запускаться нативно в Windows. Без каких либо прослоек. С использование аппаратного ускорения CUDA. | ||
| Строка 10: | Строка 10: | ||
=== '''Python''' === | === '''Python''' === | ||
Устанавливаем Python, в моем случае 3. | Устанавливаем Python, в моем случае 3.8.10 с [https://www.python.org/downloads/ официального сайта]. | ||
При установке обязательно поставить галочку на против '''Add Python 3. | При установке обязательно поставить галочку на против '''Add Python 3.8.10 to Path''' - это нужно чтобы он прописался как команды в Windows, что позволит выполнять команды Python из любого терминала. | ||
После инсталляции открыть PowerShell и ввести: | После инсталляции открыть PowerShell и ввести: | ||
'''Python''' | '''Python''' | ||
Получим ответ по типу: | Получим ответ по типу: | ||
Python 3.8. | Python 3.8.10 (default, Sep 3 2020, 21:29:08) | ||
Значит все Ок, все установлено верно и будет работать. | Значит все Ок, все установлено верно и будет работать. | ||
Я взял версию 3.8.10, но есть и более новые. Дело в том что в более новой версии не устанавливается как положено pip. На 3.8.10 все отлично работает. | |||
[[Файл:Скрин скачивания с сайта PyTorch.png|мини|Скрин скачивания с сайта PyTorch]] | [[Файл:Скрин скачивания с сайта PyTorch.png|мини|Скрин скачивания с сайта PyTorch]] | ||
| Строка 73: | Строка 75: | ||
[[Файл:Как получить нужную версию BasicSR.png|мини|Как получить нужную версию BasicSR]] | [[Файл:Как получить нужную версию BasicSR.png|мини|Как получить нужную версию BasicSR]] | ||
=== '''BasicSR''' === | === '''BasicSR v1.2''' === | ||
При скачивании последней версии, обучение модели работает, но при создании Валидных изображений процесс крашится. На момент 22.05.20. | При скачивании последней версии, обучение модели работает, но при создании Валидных изображений процесс крашится. На момент 22.05.20. | ||
| Строка 97: | Строка 99: | ||
Произойдет не мало всего, и очень надеюсь что без ошибок. | Произойдет не мало всего, и очень надеюсь что без ошибок. | ||
=== '''BasicSR v B''' === | |||
Получить данную версию можно посмотрев историю изменений, но я конечно же даю [https://github.com/xinntao/BasicSR/tree/2c59eb613d84513cf6ab6b354f255c4c422a5e3b '''ссылку.'''] | |||
Установка не требует выполнения специальных файлов. Но скорее всего не будет хватать некоторых компонентов. Смотрим название того, что не хватает и устанавливаем по средствам pip. | |||
'''Обращаю внимание,''' Версия B не так гибка и универсальна как более новые. Есть некоторые ограничения, например можно скармливать датасеты только в формате PNG. Так же имена файлом не должны содержать пробелов.'''<br />'''Установим только рекомендованные модули | |||
pip install numpy opencv-python lmdb pyyaml | |||
pip install tb-nightly future | |||
== '''Настройка''' == | == '''Настройка''' == | ||
Настройка для '''обоих''' версий выглядит практически одинаково, конфиги очень мало различаются. Пример будет '''на версии 1.2.''' | |||
Под настройкой подразумевается прописывание в конфигах нужных путей, настроек. | Под настройкой подразумевается прописывание в конфигах нужных путей, настроек. | ||
| Строка 105: | Строка 118: | ||
Открываем текстовым редактором файл: | Открываем текстовым редактором файл: | ||
.\BasicSR\options\train\ESRGAN\train_ESRGAN_x4.yml | .\BasicSR\options\train\ESRGAN\train_ESRGAN_x4.yml | ||
для версии '''B''' | |||
.\BasicSR_B\codes\options\train\train_ESRGAN.yml | |||
Не забудем указать номер ускорителя в версии конфига '''B''' он указан неверно. | |||
gpu_ids: [0] | |||
name: указываем имя паки в которую будут складываться результаты. | name: указываем имя паки в которую будут складываться результаты. | ||
name: Manga_set2 | name: Manga_set2 | ||
| Строка 112: | Строка 129: | ||
name: DIV2K | name: DIV2K | ||
type: PairedImageDataset | type: PairedImageDataset | ||
dataroot_gt: datasets/Manga_set2/GT # тут папка в корой лежат файлы к которым сеть будет стремиться. | dataroot_gt: datasets/Manga_set2/GT ''# тут папка в корой лежат файлы к которым сеть будет стремиться.'' | ||
dataroot_lq: datasets/Manga_set2/LQ # тут файлы которые сеть будет пытаться превратить в то к чему нужно стремится. | dataroot_lq: datasets/Manga_set2/LQ ''# тут файлы которые сеть будет пытаться превратить в то к чему нужно стремится.'' | ||
Следующий блок: | Следующий блок: | ||
val: | val: | ||
name: Set14 | name: Set14 | ||
type: PairedImageDataset | type: PairedImageDataset | ||
dataroot_gt: datasets/Manga_set2/GT_V # это файлы валидности, чрез некий промежуток времени будет делаться создание среза в виде результата обработки, то что как бы должно быть. | dataroot_gt: datasets/Manga_set2/GT_V ''# это файлы валидности, чрез некий промежуток времени будет делаться создание среза в виде результата обработки, то что как бы должно быть.'' | ||
dataroot_lq: datasets/Manga_set2/LQ_V # из этого она попытается сделать конечный результат, который мы увидим, своего рода срезы обучения. | dataroot_lq: datasets/Manga_set2/LQ_V ''# из этого она попытается сделать конечный результат, который мы увидим, своего рода срезы обучения.'' | ||
Следующий блок отвечает за местоположение файла предварительно обученной модели. | Следующий блок отвечает за местоположение файла предварительно обученной модели. | ||
path: | path: | ||
pretrain_network_g: experiments/pretrained_models/ESRGAN_PSNR_SRx4_DF2K_official-150ff491.pth # путь до файла модели, обучение запускается именно отсюда | pretrain_network_g: experiments/pretrained_models/ESRGAN_PSNR_SRx4_DF2K_official-150ff491.pth ''# путь до файла модели, обучение запускается именно отсюда'' | ||
strict_load_g: true | strict_load_g: true | ||
resume_state: ~ # в начале обучения тут ничего не должно быть, но в какой то момент, захочется остановить обучение, и продолжить позже, для этого ниже создаются срезы модели. Вот этими срезами и можно будет воспользоваться для возобновления обучения. Просто будет указан путь до среза. | resume_state: ~ ''# в начале обучения тут ничего не должно быть, но в какой то момент, захочется остановить обучение, и продолжить позже, для этого ниже создаются срезы модели. Вот этими срезами и можно будет воспользоваться для возобновления обучения. Просто будет указан путь до среза.'' | ||
Данный блок отвечает за то как часто будет создаваться изображения валидности, из срезов. | Данный блок отвечает за то как часто будет создаваться изображения валидности, из срезов. | ||
val: | val: | ||
val_freq: !!float 1e2 # может указываться как в научном виде, так и простом, например 200. Каждые 200 итераций, будет выполнено создание изображения с использованием текущего состояния модели. | val_freq::!!float 1e2 ''# может указываться как в научном виде, так и простом, например 200. Каждые 200 итераций, будет выполнено создание изображения с использованием текущего состояния модели.'' | ||
save_img: true | save_img: true | ||
Данные блоки отвечают за частоту отображения состоянии итераций и сохранении срезов модели. | Данные блоки отвечают за частоту отображения состоянии итераций и сохранении срезов модели. | ||
logger: | logger: | ||
print_freq: 10 # частота отображения результатов в командной строке. | print_freq: 10 # ''частота отображения результатов в командной строке.'' | ||
save_checkpoint_freq: !!float 1e3 # частота создания срезов модели. В данном случае раз в 1000 итераций. Не забываем что каждый такой срез занимает 256 мегабайт, и таких срезом будет порядка 400, в итоге это будет занимать очень много места. | save_checkpoint_freq:q!!float 1e3 ''# частота создания срезов модели. В данном случае раз в 1000 итераций. Не забываем что каждый такой срез занимает 256 мегабайт, и таких срезом будет порядка 400, в итоге это будет занимать очень много места.'' | ||
В общем с настройками '''train_ESRGAN_x4.yml''' можно закончить. | В общем с настройками '''train_ESRGAN_x4.yml''' можно закончить. | ||
Следующим этапом будет подготовка датасетов. | Следующим этапом будет подготовка датасетов. | ||
== Датасет == | == '''Датасет''' == | ||
Подготовка дата сета не зависит от версии, только как написал выше для '''B''', нужно работать только с PNG и не допускать пробелов в названиях. | |||
=== Введение === | |||
Для начала нам нужно понять что мы хотим получать на выходе. | Для начала нам нужно понять что мы хотим получать на выходе. | ||
[[Файл:Пример того что нужно получить Зерно в Полутона.png|мини|Пример того что нужно получить Зерно в Полутона]] | [[Файл:Пример того что нужно получить Зерно в Полутона.png|мини|Пример того что нужно получить Зерно в Полутона]] | ||
В моем случае, и случае который я буду описывать, мне нужно: | В моем случае, и случае который я буду описывать, мне нужно: | ||
Задача восстановление качества графических изображений, а именно манги. | Задача восстановление качества графических изображений, а именно манги. | ||
[[Файл:Результат работы уже обученной модели не учитывающей превращение зерна в градиенты.png|мини|Результат работы уже обученной модели не учитывающей превращение зерна в градиенты]] | |||
==== К чему стремимся ==== | |||
'''Первая''' и основанная '''причина''', именно, обучения модели и не применении классических методов, является превращение зернистых полутонов в градиенты. Пример на картинке. Так как все эти графические рисунки издают на бумаге, все полутона и градиенты делают в виде множества точек. После чего именно в таком виде это утекает в сеть. Минусы такого изображения в том, что зачастую программная интерполяция, при просмотре не в масштабе, создает артефакты, ореолы и в целом лично мне не нравится. | |||
[[Файл:Результат работы уже обученной модели не учитывающей превращение зерна в градиенты.png|мини|Изображение 02. Результат работы уже обученной модели не учитывающей превращение зерна в градиенты|альт=]] | |||
Но есть еще причины, в сети изображение в 99 процентах случаем уменьшают в разрешении, Происходит интерполяция, и каждая точка уже не способна уместится в один пиксель, происходит сглаживание, но самое не приятное, меняется общая гамма, из за изменения плотности. Получается изображение теряет свои оригинальные оттенки. | Но есть еще причины, в сети изображение в 99 процентах случаем уменьшают в разрешении, Происходит интерполяция, и каждая точка уже не способна уместится в один пиксель, происходит сглаживание, но самое не приятное, меняется общая гамма, из за изменения плотности. Получается изображение теряет свои оригинальные оттенки. | ||
Но и это не самая большая проблема. Хуже всего то что хорошо обученная прошлая моя модель, специально настроена на вычленение каждой детали из исходника, и она с лёгкостью выделяет каждую такую точку в отдельный объект. Что влечёт | Но и это не самая большая проблема. Хуже всего то что хорошо обученная прошлая моя модель, специально настроена на вычленение каждой детали из исходника, и она с лёгкостью выделяет каждую такую точку в отдельный объект. Что влечёт к очень большим искажениям тона. Это уже выглядит не совсем приятно, и при программной интерполяции возникают еще более резкие артефакты, из за очень высокой четкости. | ||
На "Изображении 02" пример, видно что модель закрасила тени, потому что на исходнике не было четкого контраста, такое бывает редко, в большинстве случав фон будет белым, а точки мелкие и черные. Это сильно бьёт по глазам, и в итоговой отрисовке, кажется менее темным чем должно быть, также исчезает эффект перехода от светлого к темному. | |||
В теории можно выполнить такую операцию в графическом редакторе, подобрав тон градиента, и и с помощью маски нанести в нужных места изображений. Но просто представим трудозатраты на эту работу. Это огромное количество ручной работы. | |||
'''Второе''' что я бы хотел получать - это конечно же качественный абскеил. Такого же уровня как я обучил ранее. Попробую убить 2х зайцев одним выстрелом. | |||
Посмотрим что получится. На момент написания статьи я сам не знаю результата, получится у меня или нет. | |||
==== О чем нужно позаботится ==== | |||
[[Файл:Пример Градиент и текстура.png|мини|Пример Градиент и текстура]] | |||
Я предполагаю еще до обучения, это то как объяснить модели, где реально зерно для создания градиента, а еде например вот такая вот текстура как на картинке. | |||
Сверху отчётливо видно, что есть объект стилизованный под текстуру. А внизу закрашенный градиент. | |||
Данное изображение получено обработкой моей моделью. Но место которое стилизовано под текстуру было обработано отдельно, другой моделью, а потом наложено в графическом редакторе. Немало ручной работы, но и таких мест не очень много в манге. Но все же хотелось бы добиться результата из коробки. | |||
=== '''Тип модели''' === | |||
Нужно определиться с моделью. Я использую модели от самого '''Xintao''', они находятся в описании и на них [https://github.com/xinntao/BasicSR/blob/v1.3.2/docs/ModelZoo.md есть ссылка]. | |||
Самыми эффективными являются '''ESRGAN''', их два вида у '''Xintao''': '''ESRGAN_SRx4''' и '''ESRGAN_PSNR_SRx4''', Если честно я не знаю чем они отличаются, слишком мало я разобрался в этой теме. Но одно известно точно, '''ESRGAN_PSNR_SRx4''' обучается в двое быстрее. Почему мне не известно. | |||
Также из их названия можно увидеть, то что присудcвует '''x4'''. Это уровень масштабирования. Вообще все конфиги по умолчанию настроены на абскеил в четыре раза. И к сожалению просто поменять 4 на 2 или 1 не получится. Нужна специальная модель имеющая матрицу под этот масштаб. Опять же я пока не знаю как сделать самостоятельно модель, а не использовать уже переобученную. | |||
Также нужно рассказать о том, что '''Xintao''' раньше выпускал '''BasicSR''' версии до '''1.0'''. Эти версии используют другие несовместимые модели. | |||
Если взять с гитхаба версию до 1.0 то можно использовать старые модели. Есть конвертор, но я так же не смог с ним разобраться. Это все работает на '''Python'''. | |||
Для старых версий существует немало готовых моделей, всех масштабов и свойств. | |||
После скачивания модель разместить в Папке: '''\BasicSR\experiments\pretrained_models''' | |||
=== '''Особенности разрешения датасета''' === | |||
Так как модель работает с масштабом то ей нужны соответствующие исходные данные. То есть, изображения к которым стремятся, должны иметь разрешение кратное четырем. Иначе при уменьшении их до тех из которых будем восстанавливать, кратность в пикселях не будет соблюдена. И скрипт выдаст ошибку, совсем не рассказывающую того, что в чем, дело. И не будет понятно какой из кадров вот так вот нам усложнил жизнь. | |||
Теперь определился с типами данных. | |||
'''GT''' - это данные к которым модель будет стремиться - наши идеальные изображения. | |||
'''LQ''' - это то что мы бы хотели улучшать до GT | |||
Так вот обязательная и максимально важная характеристика '''GT''' - это кратность 4 по обоим сторонам разрешения. Это конечно при условии, того что мы получаем '''LQ''' из '''GT''' по средствам обработки. | |||
Соответственно тоже будет при других масштабах. | |||
=== '''Размер изображений''' === | |||
Нет смысла скармливать модели изображения в большом разрешении. Лучше все изображения разбить на множество кусков. Что сильно увеличит итоговое количество изображений. | |||
Лучший вариант использования это файлы с разрешением 480х480 пикселей, и соответственно их пары 120x120 пикселей. | |||
Так что нарезаем наши изображения на такие фрагменты. В целом метод не важен, но '''Xintao''' предусмотрел скрипт для облегчения задачи. | |||
Нужно положить в папку '''GT_F''', например изображения в высоком разрешении. В папку '''LQ_F''' изображения в низком разрешении. С соблюдением кратности как я описывал выше. | |||
Такой скрипт есть только в версии '''1.2.''' | |||
После чего запустить скрипт: '''extract_subimages.py''' | |||
Находится он по пути: | |||
BasicSR\scripts\data_preparation | |||
Давайте его настроим, откроем текстовым редактором: | |||
# HR images | |||
opt['input_folder'] = 'datasets/Manga_set2/GT_full' ''# прописано расположение наших '''GT_F''' файлов.'' | |||
opt['save_folder'] = 'datasets/Manga_set2/GT' ''# Положение файлов в нарезанном виде.'' | |||
opt['crop_size'] = 480 ''# Разрешение по двум сторонам, то которое будет в итоге'' | |||
opt['step'] = 240 ''# Шаг смещения. Этот скрипт, идет по исходнику с лева на право, смещаясь на 240 писклей, и сохраняя фрагмент.'' | |||
Дальше идут блоки: | |||
# LRx2 images | |||
# LRx3 images | |||
На против строк к этим блоков ставим '''"#"''', чтобы закомментировать их. | |||
Приходим к блоку: | |||
# LRx4 images | |||
opt['input_folder'] = 'datasets/Manga_set2/LQ_full' ''# прописано расположение наших '''LQ_F''' файлов.'' | |||
opt['save_folder'] = 'datasets/Manga_set2/LQ' ''# Положение файлов в нарезанном виде.'' | |||
opt['crop_size'] = 120 ''# Разрешение по двум сторонам, то которое будет в итоге'' | |||
opt['step'] = 60 ''# Шаг смещения. Этот скрипт, идет по исходнику с лева на право, смещаясь на 60 писклей, и сохраняя фрагмент.'' | |||
Как видно пути прописываются не полностью, так как подразумевается что файлы с которыми будем работать находиться внутри директории BasicSR. Если это не так то, нужно указывать полный путь. | |||
Так же папки в которых будут находится '''GT''' и '''LQ''' не должны быть созданы, иначе скрипт выдаст ошибку. | |||
Теперь его запустим: | |||
Переходим в каталог BasicSR, у меня это: | |||
cd C:\Users\vova\Documents\BasicSR | |||
И выполняем скрипт: | |||
py .\scripts\data_preparation\extract_subimages.py | |||
Прогресс должен пройти без ошибок. На версии '''PyTorch 1.8.1''' у меня процесс нормально не проходит, причем, не зависимо от ОС, на linux такая же картина. Скорее всего с обновлением '''PyTorch''' эти проблему уйдут. | |||
Теперь у нас готовый изображения к обучению на них модели. | |||
=== '''Валидные данные''' === | |||
В папке, к примеру '''GT_V и LQ_V''' разместим данные для проверки правильности обучения. | |||
Разрешение изображений не имеет значения, сколько есть видеопамяти. | |||
Кладем в '''LQ_V''' картинки у которых нет идеальной пары, в общем то что хотим восстанавливать в итоге. | |||
Из '''LQ_V''' по средствам любого редактора делаем в 4 раза большее изображение, и кладем в '''GT_V.''' | |||
Теперь модель при обучении будет делать срезы именно из этих изображений. | |||
=== '''Послесловие о датасете''' === | |||
==== Что все это значит ==== | |||
Нам нужно найти пару десятков, изображений низком качестве с зерном на переходах и эти же изображения но в отличном качестве, с градиентами вместо зерна. | |||
Совсем не простая задача. | |||
Так де не реально получить изображение в 4 раза больше чем стандартное размещаемое на ресурсах с мангой. Так же зачастую изображения с зерном - это сканы. А изображения с градиентами это цифровые версии. Скан отличается от цифровой версии, размером страницы, иногда искажен. Так же отличаются языки, размеры диалоговых облаков. Тут остается надеется на "сообразительность" модели, она должна понять что это совершенно не те места на которые нужно обращаться внимание и пытаться что то сделать. | |||
Первое это найти исходники в двух исполнениях. Мне удалось найти RAW версию и цифровую с переводом. | |||
==== '''Пример несоответствия''' ==== | |||
Как пример приведу картинки. Но хочу сказать что создание датасета это самое сложное во всем этом процессе. Потому что если нет точного "плохого" и "идеального" исполнения одного и того, же то, придется каким то образом из "идеального" получить "плохой". Покажу на примере скана страницы, слитого откуда-то. <gallery> | |||
Файл:Скан в сильном зерне и неоднородностями.jpg|Изображение 01. Скан в сильном зерне и неоднородностями - используется как валидное | |||
Файл:Скан в зерне имеющий аналог в идеальном виде.png|Изображение 02. Скан в зерне имеющий аналог в идеальном виде - используется для датасета | |||
Файл:Версия с очень высоким качеством и градиентами.png|Изображение 03. Версия с очень высоким качеством и градиентами - используется как то к чему стремится | |||
Файл:Скан в сильном зерне - увеличение.png|Изображение 04. Скан в сильном зерне - увеличение | |||
Файл:Скан имеющий аналог уменьшенный ровно в 2 раза.png|Изображение 05. Скан имеющий аналог уменьшенный ровно в 2 раза | |||
</gallery> | |||
На приведенных картинках показано то, что если использовать "Изображение 02" мы отлично будем чистить только зерно как на этом скане. | |||
В общем то первый, второй, и десятый запуск обучения это и показывал. Модель наотрез не хочет видеть в Изображении 01 зерна, и пытается вытянуть каждую точку в отдельный объект. | |||
После чего я начал экспериментировать с "порчей" второго изображения. Сначала фильтры размытия перепробовал много. Остановился на том, что уменьшил Изображение 02 ровно в два раза. И внезапно увидел очень похожую картину с Изображением 01. На Изображении 04 и 05 с большим масштабом это показано. И только этот паттерн который я создал, начал давать результаты по превращению зерна в градиенты, на подобных сканах. | |||
Это касается всего. Идеальный датасет, тот который имеет реально испорченное изображение и оригинал, и ты точно знаешь как оригинал привести к испорченному. | |||
Поэтому все результаты, у создателей таких моделей, невероятно крутые, просто из каши получаем четкий объект, но секрет именно в том, что создатель имея исходные кадры, портил их самостоятельно. | |||
В реальности этого нет, и с 90 процентным шансом воспользовавшись моделью, мы получим очень слабый результат. | |||
=== '''Количество изображений''' === | |||
Чем больше тем лучше, но как показала практика, лучше озаботиться примерами испорчености, как можно большим чимлом примеров, чтобы модель могла понимать что перед ней и что с этим делать. | |||
от 10000 до 200000. | |||
== '''Обучение''' == | |||
=== Первый запуск обучения === | |||
Запустить обучение после всех выполненных выше манипуляций очень просто. | |||
Процес запуска обучения для обоих версий одинаковый. | |||
Переходим в powershell в каталок BasicSR. в моем случае это так: | |||
cd C:\Users\vova\Documents\BasicSR | |||
Выполняем команду для обучения для '''версии 1.2''' | |||
py basicsr/train.py -opt options/train/ESRGAN/train_ESRGAN_x4.yml | |||
для '''версии B''' | |||
py codes/train.py -opt codes/options/train/train_ESRGAN.yml | |||
Как видно запускаем '''train.py''' с опцией '''train_ESRGAN_x4.yml''' | |||
Процесс обучения будет запущен, продут первые подготовительные этапы, возможно что то загрузится. | |||
И каждые 10 - 20 итераций мы будем видеть статус, в зависимости от того какой интервал поставили в '''train_ESRGAN_x4.yml.''' | |||
Дожидаемся первых результатов срезов, анализируем и смотрим их, для оценки правильности подобранного датасета. | |||
Вносим корректировки в датасет. | |||
'''Количество итераций для одной модели 400 тысяч.''' | |||
=== Послесловие === | |||
Про это и речь, что самое сложное разобраться с процессом настройки и запуск всего этого дела. | |||
Все эти модели и алгоритмы находятся в зачаточном состоянии, не претендуют на какой то безотказный метод. Только одному '''Xintao''' известно то что может его модель, самое плохое то, что нет никакой информации по поводу всего этого. Это все преподносится как само собой разумеющееся. Причина тому, сильный отрыв таких людей как '''Xintao''', от обычного рядового пользователя. В какой том момент перестает понимать, как все люди не могут понимать то, что понимает он. | |||
=== Требования к железу === | |||
Нужно было написать раньше, но в начале и так много воды. | |||
Все процессы работы с моделями имеют высокие требования к Железу. | |||
'''Первое требование''' | |||
Выполняются все модели на '''CUDA''', а значит это видеокарта от '''NVIDIA''', мне не понятно почему это не делают на других языках. | |||
Также можно заметить что это CUDA 11. Что уже показывает планку по графическим ускорителям? Грань поддержки CUDA 11, линейка 900х серии. | |||
'''Второе требование''' | |||
Объем видеопамяти, для обучения модели требуется не меньше 7,2 гигабайт. Можно попробовать на 6 гигабайтах, скорее всего модель будет обучаться. 4 гигабайта точно не сработает. | |||
'''Третье требование''' | |||
Число этих самых куда ядер и их поколение. на RTX2080ti обучение занимало 6 дней, на RTX3090 занимает 1.5 дня. От архитектуры CUDA зависит очень много. | |||
Теперь представим сколько времени будет обучаться модель на ускорителе слабее. Но в любом случае если не спешить, то это вполне возможно. | |||
== Результаты и разбор обучения == | |||
'''--- В процессе создания ---''' | |||
Такой результат получаю с дастасетом в 800 картинок уже после 2100 итераци. Модель моментально поняла что от неё требуется, заодно неплохо повышается резкость изображения, как и контрастность.<gallery> | |||
Файл:Валидный кадр с зерном 01.jpg|Валидный кадр с зерном 01 | |||
Файл:Результат после обучения 2100 итераций 01.png|Результат после обучения 2100 итераций 01 | |||
</gallery> | |||
Сесть обучалась в течении 10 минут, а результат уже изумительны. Есть некоторые флуктуации от среза к срезу, по части цвета фона. Причиной является то, что предварительно обученная модель которую мы обучаем нашим датасетом, работала с цветными изображениями. | |||
Результаты из '''примера несоответствия:''' | |||
Всего через 7000 итераций видно, что шум сильно подавился в сторону заливки.<gallery> | |||
Файл:Фрагмент скана с сильным шумом.png|Изображение 01. Фрагмент скана с сильным шумом | |||
Файл:Результат среза модели на 7000 итерациях.png|Изображение 02. Результат среза модели на 7000 итерациях | |||
Файл:Результат с неверно подобранным датасетом.png|Изображение 03. Результат с неверно подобранным датасетом | |||
</gallery> | |||
Можно отчетливо увидеть, что моль пытается из зерна вытащить детали, вместо того чтобы заполнить фон. | |||
Нужно пройти пару десятков тысяч итераций чтобы модель стала пренебрегать цветом. | |||
== Применение == | |||
К сожалению создатель, как и все остальные подобные товарищи, совершенно не позаботился о применении модели. Для того чтобы просто закинуть картинку и получить на выходе результат нужно заморочится. | |||
То что предусмотрено в BasicSR в обоих версиях, спасибо и на этом. | |||
=== BasicSR 1.2 === | |||
Отредактируем файл | |||
.\BasicSR\options\test\ESRGAN\test_ESRGAN_x4.yml | |||
В блоке | |||
datasets: | |||
test_1: # the 1st test dataset | |||
name: Set5 ''# имя датасета, будет создана папка с таким именем'' | |||
type: PairedImageDataset | |||
dataroot_gt: datasets/Set5/GTmod12 ''# место с файлами увеличенными'' | |||
dataroot_lq: datasets/Set5/LRbicx4 ''# место с тем что нужно увеличить'' | |||
io_backend: | |||
type: disk | |||
... | |||
path: | |||
pretrain_network_g: experiments/pretrained_models/ESRGAN/ESRGAN_SRx4_DF2KOST_official-ff704c30.pth ''# указание обученной модели'' | |||
=== BasicSR B === | |||
Отредактируем файл | |||
.\BasicSR_B\codes\options\test\test_ESRGAN.yml | |||
В блоке | |||
datasets: | |||
test_1: # the 1st test dataset | |||
name: set5 ''# имя датасета, будет создана папка с таким именем'' | |||
mode: LQGT | |||
dataroot_GT: /mnt/SSD/xtwang/BasicSR_datasets/val_set5/Set5 ''# место с файлами увеличенными'' | |||
dataroot_LQ: /mnt/SSD/xtwang/BasicSR_datasets/val_set5/Set5_bicLRx4 ''# место с тем что нужно увеличить'' | |||
... | |||
path: | |||
pretrain_model_G: ../experiments/pretrained_models/RRDB_ESRGAN_x4.pth ''# указание обученной модели'' | |||
Как видно для тестов нам нужно иметь уже увеличение изображение. Звучит странно, чтобы улучшить картинку, нужно найти улучшенную картину). Я не понимаю зачем так было делать. Оно понятно, создатели таких штук вообще не пытаются ничего восстанавливать своими моделями. Только обучают. | |||
Чтобы воспользоваться хотя бы этим, нужно положить в паку с тем что нужно увеличить, нужные файлы, а в папку с "референсом" закинуть просто увеличение в четыре раза, без разницы в каком это будет качестве, лиш бы разрешение соответствовало. Да все это звучит глупо, но для того, кто ни разу не трогал программирование, сложновато покопаться в скриптах питона, и сделать свой модуль для тестирования. | |||
Поэтому нативный способ такой неудобный. | |||
=== '''IEU - Image Enhancing Utility''' === | |||
Кто то уже позаботился обо всем. И запилил такой вот представитель обработчик. | |||
Получить можно со страницы [https://github.com/ptrsuder/IEU.Winforms/releases github по ссылке]. Версия 0.11.0 забагована, но работает. '''Важно отметить работает только с моделями BasicSR B.''' | |||
Как пользоваться я думаю разберётесь, интерфейс всё-таки, да язык родной английский). ''Возможно сделаю гайд обзор.'' | |||
=== '''Cupscale''' === | |||
Еще один похожий представитель, все в одном. Может даже видео вашей моделью обработать. [https://github.com/n00mkrad/cupscale/releases Ссылочка] прилагается. | |||
Замудреный интерфейс непонятная настройка, стандарт для самопльных гуёв. Но даже это спасение. | |||
Может все тоже что и предыдущая. Но сама поставит модули Python и все что с этим связано. | |||
Также несовместима с моделями BasicSR B. | |||
Не понимаю я, почему так невзлюбили версии после 1.0. Вроде все улучшили, но нет ничего для них. | |||
--- | |||
--- | |||
--- | |||
Пока все, буду дополнять статью по мере возможности. | |||
Текущая версия от 16:24, 23 мая 2021
Обучения силами BasicSR от Xintao. Речь пойдет о двух версиях данного проекта.
Версия 1.2 и версия сразу до 1.0. Какую выбрать? На момент написания, для версии до 1.0 (будем называть её B - beta) есть несколько оболочек, позволяющих обработать изображение в пару кликов, обходя при этом ограничения видеопамяти и многое другое. Об этом в разделе Использование.
Интересно то, что все будет запускаться нативно в Windows. Без каких либо прослоек. С использование аппаратного ускорения CUDA.
Подготовка

Python
Устанавливаем Python, в моем случае 3.8.10 с официального сайта.
При установке обязательно поставить галочку на против Add Python 3.8.10 to Path - это нужно чтобы он прописался как команды в Windows, что позволит выполнять команды Python из любого терминала.
После инсталляции открыть PowerShell и ввести:
Python
Получим ответ по типу:
Python 3.8.10 (default, Sep 3 2020, 21:29:08)
Значит все Ок, все установлено верно и будет работать.
Я взял версию 3.8.10, но есть и более новые. Дело в том что в более новой версии не устанавливается как положено pip. На 3.8.10 все отлично работает.

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, точнее она исполняет код с помощью CUDA Toolkit.
Конечно же брать с официального сайта. Выбрать Windows, архитектуру x86_64, версия Windows конечно же 10, ну и тип установщика: автономный или локальный, в челом без разницы.
Устанавливает как обычно, практически также как драйвер.
Так что ждем установки и радуемся успешному окончанию.
Git
Тоже мало кто будет ставить это на Windows, но разработчики это делают по умолчанию. Потому что, а как еще взаимодействовать с GitHab. Интересно, что MS давно уже приобрели GitHab, но какого мелкомягкого человека Git не встроен в Windows до сих пор!?
Ладно... Скачиваем с официального сайта. Естественно под x64, в каком веке мы живем?
Ничего сложного, далее, далее, далее, готово.
Теперь мы можем получать с Githab и подобных файлы напрямую, через PowerShell.

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

BasicSR v1.2
При скачивании последней версии, обучение модели работает, но при создании Валидных изображений процесс крашится. На момент 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
Произойдет не мало всего, и очень надеюсь что без ошибок.
BasicSR v B
Получить данную версию можно посмотрев историю изменений, но я конечно же даю ссылку.
Установка не требует выполнения специальных файлов. Но скорее всего не будет хватать некоторых компонентов. Смотрим название того, что не хватает и устанавливаем по средствам pip.
Обращаю внимание, Версия B не так гибка и универсальна как более новые. Есть некоторые ограничения, например можно скармливать датасеты только в формате PNG. Так же имена файлом не должны содержать пробелов.
Установим только рекомендованные модули
pip install numpy opencv-python lmdb pyyaml
pip install tb-nightly future
Настройка
Настройка для обоих версий выглядит практически одинаково, конфиги очень мало различаются. Пример будет на версии 1.2.
Под настройкой подразумевается прописывание в конфигах нужных путей, настроек.
Мы хотим обучать сеть, алгоритм будем брать ESRGAN.
Открываем текстовым редактором файл:
.\BasicSR\options\train\ESRGAN\train_ESRGAN_x4.yml
для версии B
.\BasicSR_B\codes\options\train\train_ESRGAN.yml
Не забудем указать номер ускорителя в версии конфига B он указан неверно.
gpu_ids: [0]
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:q!!float 1e3 # частота создания срезов модели. В данном случае раз в 1000 итераций. Не забываем что каждый такой срез занимает 256 мегабайт, и таких срезом будет порядка 400, в итоге это будет занимать очень много места.
В общем с настройками train_ESRGAN_x4.yml можно закончить.
Следующим этапом будет подготовка датасетов.
Датасет
Подготовка дата сета не зависит от версии, только как написал выше для B, нужно работать только с PNG и не допускать пробелов в названиях.
Введение
Для начала нам нужно понять что мы хотим получать на выходе.

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

Но есть еще причины, в сети изображение в 99 процентах случаем уменьшают в разрешении, Происходит интерполяция, и каждая точка уже не способна уместится в один пиксель, происходит сглаживание, но самое не приятное, меняется общая гамма, из за изменения плотности. Получается изображение теряет свои оригинальные оттенки.
Но и это не самая большая проблема. Хуже всего то что хорошо обученная прошлая моя модель, специально настроена на вычленение каждой детали из исходника, и она с лёгкостью выделяет каждую такую точку в отдельный объект. Что влечёт к очень большим искажениям тона. Это уже выглядит не совсем приятно, и при программной интерполяции возникают еще более резкие артефакты, из за очень высокой четкости.
На "Изображении 02" пример, видно что модель закрасила тени, потому что на исходнике не было четкого контраста, такое бывает редко, в большинстве случав фон будет белым, а точки мелкие и черные. Это сильно бьёт по глазам, и в итоговой отрисовке, кажется менее темным чем должно быть, также исчезает эффект перехода от светлого к темному.
В теории можно выполнить такую операцию в графическом редакторе, подобрав тон градиента, и и с помощью маски нанести в нужных места изображений. Но просто представим трудозатраты на эту работу. Это огромное количество ручной работы.
Второе что я бы хотел получать - это конечно же качественный абскеил. Такого же уровня как я обучил ранее. Попробую убить 2х зайцев одним выстрелом.
Посмотрим что получится. На момент написания статьи я сам не знаю результата, получится у меня или нет.
О чем нужно позаботится

Я предполагаю еще до обучения, это то как объяснить модели, где реально зерно для создания градиента, а еде например вот такая вот текстура как на картинке.
Сверху отчётливо видно, что есть объект стилизованный под текстуру. А внизу закрашенный градиент.
Данное изображение получено обработкой моей моделью. Но место которое стилизовано под текстуру было обработано отдельно, другой моделью, а потом наложено в графическом редакторе. Немало ручной работы, но и таких мест не очень много в манге. Но все же хотелось бы добиться результата из коробки.
Тип модели
Нужно определиться с моделью. Я использую модели от самого Xintao, они находятся в описании и на них есть ссылка.
Самыми эффективными являются ESRGAN, их два вида у Xintao: ESRGAN_SRx4 и ESRGAN_PSNR_SRx4, Если честно я не знаю чем они отличаются, слишком мало я разобрался в этой теме. Но одно известно точно, ESRGAN_PSNR_SRx4 обучается в двое быстрее. Почему мне не известно.
Также из их названия можно увидеть, то что присудcвует x4. Это уровень масштабирования. Вообще все конфиги по умолчанию настроены на абскеил в четыре раза. И к сожалению просто поменять 4 на 2 или 1 не получится. Нужна специальная модель имеющая матрицу под этот масштаб. Опять же я пока не знаю как сделать самостоятельно модель, а не использовать уже переобученную.
Также нужно рассказать о том, что Xintao раньше выпускал BasicSR версии до 1.0. Эти версии используют другие несовместимые модели.
Если взять с гитхаба версию до 1.0 то можно использовать старые модели. Есть конвертор, но я так же не смог с ним разобраться. Это все работает на Python.
Для старых версий существует немало готовых моделей, всех масштабов и свойств.
После скачивания модель разместить в Папке: \BasicSR\experiments\pretrained_models
Особенности разрешения датасета
Так как модель работает с масштабом то ей нужны соответствующие исходные данные. То есть, изображения к которым стремятся, должны иметь разрешение кратное четырем. Иначе при уменьшении их до тех из которых будем восстанавливать, кратность в пикселях не будет соблюдена. И скрипт выдаст ошибку, совсем не рассказывающую того, что в чем, дело. И не будет понятно какой из кадров вот так вот нам усложнил жизнь.
Теперь определился с типами данных.
GT - это данные к которым модель будет стремиться - наши идеальные изображения.
LQ - это то что мы бы хотели улучшать до GT
Так вот обязательная и максимально важная характеристика GT - это кратность 4 по обоим сторонам разрешения. Это конечно при условии, того что мы получаем LQ из GT по средствам обработки.
Соответственно тоже будет при других масштабах.
Размер изображений
Нет смысла скармливать модели изображения в большом разрешении. Лучше все изображения разбить на множество кусков. Что сильно увеличит итоговое количество изображений.
Лучший вариант использования это файлы с разрешением 480х480 пикселей, и соответственно их пары 120x120 пикселей.
Так что нарезаем наши изображения на такие фрагменты. В целом метод не важен, но Xintao предусмотрел скрипт для облегчения задачи.
Нужно положить в папку GT_F, например изображения в высоком разрешении. В папку LQ_F изображения в низком разрешении. С соблюдением кратности как я описывал выше.
Такой скрипт есть только в версии 1.2.
После чего запустить скрипт: extract_subimages.py
Находится он по пути:
BasicSR\scripts\data_preparation
Давайте его настроим, откроем текстовым редактором:
# HR images opt['input_folder'] = 'datasets/Manga_set2/GT_full' # прописано расположение наших GT_F файлов. opt['save_folder'] = 'datasets/Manga_set2/GT' # Положение файлов в нарезанном виде. opt['crop_size'] = 480 # Разрешение по двум сторонам, то которое будет в итоге opt['step'] = 240 # Шаг смещения. Этот скрипт, идет по исходнику с лева на право, смещаясь на 240 писклей, и сохраняя фрагмент.
Дальше идут блоки:
# LRx2 images
# LRx3 images
На против строк к этим блоков ставим "#", чтобы закомментировать их.
Приходим к блоку:
# LRx4 images opt['input_folder'] = 'datasets/Manga_set2/LQ_full' # прописано расположение наших LQ_F файлов. opt['save_folder'] = 'datasets/Manga_set2/LQ' # Положение файлов в нарезанном виде. opt['crop_size'] = 120 # Разрешение по двум сторонам, то которое будет в итоге opt['step'] = 60 # Шаг смещения. Этот скрипт, идет по исходнику с лева на право, смещаясь на 60 писклей, и сохраняя фрагмент.
Как видно пути прописываются не полностью, так как подразумевается что файлы с которыми будем работать находиться внутри директории BasicSR. Если это не так то, нужно указывать полный путь.
Так же папки в которых будут находится GT и LQ не должны быть созданы, иначе скрипт выдаст ошибку.
Теперь его запустим:
Переходим в каталог BasicSR, у меня это:
cd C:\Users\vova\Documents\BasicSR
И выполняем скрипт:
py .\scripts\data_preparation\extract_subimages.py
Прогресс должен пройти без ошибок. На версии PyTorch 1.8.1 у меня процесс нормально не проходит, причем, не зависимо от ОС, на linux такая же картина. Скорее всего с обновлением PyTorch эти проблему уйдут.
Теперь у нас готовый изображения к обучению на них модели.
Валидные данные
В папке, к примеру GT_V и LQ_V разместим данные для проверки правильности обучения.
Разрешение изображений не имеет значения, сколько есть видеопамяти.
Кладем в LQ_V картинки у которых нет идеальной пары, в общем то что хотим восстанавливать в итоге.
Из LQ_V по средствам любого редактора делаем в 4 раза большее изображение, и кладем в GT_V.
Теперь модель при обучении будет делать срезы именно из этих изображений.
Послесловие о датасете
Что все это значит
Нам нужно найти пару десятков, изображений низком качестве с зерном на переходах и эти же изображения но в отличном качестве, с градиентами вместо зерна.
Совсем не простая задача.
Так де не реально получить изображение в 4 раза больше чем стандартное размещаемое на ресурсах с мангой. Так же зачастую изображения с зерном - это сканы. А изображения с градиентами это цифровые версии. Скан отличается от цифровой версии, размером страницы, иногда искажен. Так же отличаются языки, размеры диалоговых облаков. Тут остается надеется на "сообразительность" модели, она должна понять что это совершенно не те места на которые нужно обращаться внимание и пытаться что то сделать.
Первое это найти исходники в двух исполнениях. Мне удалось найти RAW версию и цифровую с переводом.
Пример несоответствия
Как пример приведу картинки. Но хочу сказать что создание датасета это самое сложное во всем этом процессе. Потому что если нет точного "плохого" и "идеального" исполнения одного и того, же то, придется каким то образом из "идеального" получить "плохой". Покажу на примере скана страницы, слитого откуда-то.
-
Изображение 01. Скан в сильном зерне и неоднородностями - используется как валидное
-
Изображение 02. Скан в зерне имеющий аналог в идеальном виде - используется для датасета
-
Изображение 03. Версия с очень высоким качеством и градиентами - используется как то к чему стремится
-
Изображение 04. Скан в сильном зерне - увеличение
-
Изображение 05. Скан имеющий аналог уменьшенный ровно в 2 раза
На приведенных картинках показано то, что если использовать "Изображение 02" мы отлично будем чистить только зерно как на этом скане.
В общем то первый, второй, и десятый запуск обучения это и показывал. Модель наотрез не хочет видеть в Изображении 01 зерна, и пытается вытянуть каждую точку в отдельный объект.
После чего я начал экспериментировать с "порчей" второго изображения. Сначала фильтры размытия перепробовал много. Остановился на том, что уменьшил Изображение 02 ровно в два раза. И внезапно увидел очень похожую картину с Изображением 01. На Изображении 04 и 05 с большим масштабом это показано. И только этот паттерн который я создал, начал давать результаты по превращению зерна в градиенты, на подобных сканах.
Это касается всего. Идеальный датасет, тот который имеет реально испорченное изображение и оригинал, и ты точно знаешь как оригинал привести к испорченному.
Поэтому все результаты, у создателей таких моделей, невероятно крутые, просто из каши получаем четкий объект, но секрет именно в том, что создатель имея исходные кадры, портил их самостоятельно.
В реальности этого нет, и с 90 процентным шансом воспользовавшись моделью, мы получим очень слабый результат.
Количество изображений
Чем больше тем лучше, но как показала практика, лучше озаботиться примерами испорчености, как можно большим чимлом примеров, чтобы модель могла понимать что перед ней и что с этим делать.
от 10000 до 200000.
Обучение
Первый запуск обучения
Запустить обучение после всех выполненных выше манипуляций очень просто.
Процес запуска обучения для обоих версий одинаковый.
Переходим в powershell в каталок BasicSR. в моем случае это так:
cd C:\Users\vova\Documents\BasicSR
Выполняем команду для обучения для версии 1.2
py basicsr/train.py -opt options/train/ESRGAN/train_ESRGAN_x4.yml
для версии B
py codes/train.py -opt codes/options/train/train_ESRGAN.yml
Как видно запускаем train.py с опцией train_ESRGAN_x4.yml
Процесс обучения будет запущен, продут первые подготовительные этапы, возможно что то загрузится.
И каждые 10 - 20 итераций мы будем видеть статус, в зависимости от того какой интервал поставили в train_ESRGAN_x4.yml.
Дожидаемся первых результатов срезов, анализируем и смотрим их, для оценки правильности подобранного датасета.
Вносим корректировки в датасет.
Количество итераций для одной модели 400 тысяч.
Послесловие
Про это и речь, что самое сложное разобраться с процессом настройки и запуск всего этого дела.
Все эти модели и алгоритмы находятся в зачаточном состоянии, не претендуют на какой то безотказный метод. Только одному Xintao известно то что может его модель, самое плохое то, что нет никакой информации по поводу всего этого. Это все преподносится как само собой разумеющееся. Причина тому, сильный отрыв таких людей как Xintao, от обычного рядового пользователя. В какой том момент перестает понимать, как все люди не могут понимать то, что понимает он.
Требования к железу
Нужно было написать раньше, но в начале и так много воды.
Все процессы работы с моделями имеют высокие требования к Железу.
Первое требование
Выполняются все модели на CUDA, а значит это видеокарта от NVIDIA, мне не понятно почему это не делают на других языках.
Также можно заметить что это CUDA 11. Что уже показывает планку по графическим ускорителям? Грань поддержки CUDA 11, линейка 900х серии.
Второе требование
Объем видеопамяти, для обучения модели требуется не меньше 7,2 гигабайт. Можно попробовать на 6 гигабайтах, скорее всего модель будет обучаться. 4 гигабайта точно не сработает.
Третье требование
Число этих самых куда ядер и их поколение. на RTX2080ti обучение занимало 6 дней, на RTX3090 занимает 1.5 дня. От архитектуры CUDA зависит очень много.
Теперь представим сколько времени будет обучаться модель на ускорителе слабее. Но в любом случае если не спешить, то это вполне возможно.
Результаты и разбор обучения
--- В процессе создания ---
Такой результат получаю с дастасетом в 800 картинок уже после 2100 итераци. Модель моментально поняла что от неё требуется, заодно неплохо повышается резкость изображения, как и контрастность.
-
Валидный кадр с зерном 01
-
Результат после обучения 2100 итераций 01
Сесть обучалась в течении 10 минут, а результат уже изумительны. Есть некоторые флуктуации от среза к срезу, по части цвета фона. Причиной является то, что предварительно обученная модель которую мы обучаем нашим датасетом, работала с цветными изображениями.
Результаты из примера несоответствия:
Всего через 7000 итераций видно, что шум сильно подавился в сторону заливки.
-
Изображение 01. Фрагмент скана с сильным шумом
-
Изображение 02. Результат среза модели на 7000 итерациях
-
Изображение 03. Результат с неверно подобранным датасетом
Можно отчетливо увидеть, что моль пытается из зерна вытащить детали, вместо того чтобы заполнить фон.
Нужно пройти пару десятков тысяч итераций чтобы модель стала пренебрегать цветом.
Применение
К сожалению создатель, как и все остальные подобные товарищи, совершенно не позаботился о применении модели. Для того чтобы просто закинуть картинку и получить на выходе результат нужно заморочится.
То что предусмотрено в BasicSR в обоих версиях, спасибо и на этом.
BasicSR 1.2
Отредактируем файл
.\BasicSR\options\test\ESRGAN\test_ESRGAN_x4.yml
В блоке
datasets: test_1: # the 1st test dataset name: Set5 # имя датасета, будет создана папка с таким именем type: PairedImageDataset dataroot_gt: datasets/Set5/GTmod12 # место с файлами увеличенными dataroot_lq: datasets/Set5/LRbicx4 # место с тем что нужно увеличить io_backend: type: disk ... path: pretrain_network_g: experiments/pretrained_models/ESRGAN/ESRGAN_SRx4_DF2KOST_official-ff704c30.pth # указание обученной модели
BasicSR B
Отредактируем файл
.\BasicSR_B\codes\options\test\test_ESRGAN.yml
В блоке
datasets: test_1: # the 1st test dataset name: set5 # имя датасета, будет создана папка с таким именем mode: LQGT dataroot_GT: /mnt/SSD/xtwang/BasicSR_datasets/val_set5/Set5 # место с файлами увеличенными dataroot_LQ: /mnt/SSD/xtwang/BasicSR_datasets/val_set5/Set5_bicLRx4 # место с тем что нужно увеличить ... path: pretrain_model_G: ../experiments/pretrained_models/RRDB_ESRGAN_x4.pth # указание обученной модели
Как видно для тестов нам нужно иметь уже увеличение изображение. Звучит странно, чтобы улучшить картинку, нужно найти улучшенную картину). Я не понимаю зачем так было делать. Оно понятно, создатели таких штук вообще не пытаются ничего восстанавливать своими моделями. Только обучают.
Чтобы воспользоваться хотя бы этим, нужно положить в паку с тем что нужно увеличить, нужные файлы, а в папку с "референсом" закинуть просто увеличение в четыре раза, без разницы в каком это будет качестве, лиш бы разрешение соответствовало. Да все это звучит глупо, но для того, кто ни разу не трогал программирование, сложновато покопаться в скриптах питона, и сделать свой модуль для тестирования.
Поэтому нативный способ такой неудобный.
IEU - Image Enhancing Utility
Кто то уже позаботился обо всем. И запилил такой вот представитель обработчик.
Получить можно со страницы github по ссылке. Версия 0.11.0 забагована, но работает. Важно отметить работает только с моделями BasicSR B.
Как пользоваться я думаю разберётесь, интерфейс всё-таки, да язык родной английский). Возможно сделаю гайд обзор.
Cupscale
Еще один похожий представитель, все в одном. Может даже видео вашей моделью обработать. Ссылочка прилагается.
Замудреный интерфейс непонятная настройка, стандарт для самопльных гуёв. Но даже это спасение.
Может все тоже что и предыдущая. Но сама поставит модули Python и все что с этим связано.
Также несовместима с моделями BasicSR B.
Не понимаю я, почему так невзлюбили версии после 1.0. Вроде все улучшили, но нет ничего для них.
---
---
---
Пока все, буду дополнять статью по мере возможности.