BasicSR: различия между версиями

Материал из wolfram
Перейти к навигации Перейти к поиску
мНет описания правки
 
(не показано 15 промежуточных версий этого же участника)
Строка 1: Строка 1:
BasicSR - средство для обучения моделей.
BasicSR - средство для обучения моделей.


На момент написания статьи автор обновил его до версии 1.0. Но нет возможности применить обученную сеть. ESRGAN не готов к данной версии. Поэтому берем ветку сентября 2019 года. Как только заработает актуальная ветка поправлю статью.
В данной (даже не знаю как назвать - нужен термин, как называются страницы на гитхабе?) находится множество методов обучения моделей, как и самих предварительно натренированных моделей. Получается, что модель не тренируется с нуля. Тренировка идет уже обученной модели. Как я понял это обусловлено тем, что модель не одна, а состоит из нескольких, и эти несколько состязаются между собой. Все совсем не просто, на момент написания я не настолько хорошо понял как это работает.




Строка 10: Строка 10:
На момент актуальной версии железа nvidia 10, 16 и 20 серии все работает из коробки. Но если нужно завести все на более старом железе, то есть много нюансов.
На момент актуальной версии железа nvidia 10, 16 и 20 серии все работает из коробки. Но если нужно завести все на более старом железе, то есть много нюансов.


На данный момент это Kepler, Maxwell, Pascal, Volta, все упирается в CUDA, минимальная версия которого 9.2. А это обусловлено PyTorch 1.3 и выше.


NVIDIA CUDA
===NVIDIA CUDA===
 
Следуем инструкции установки на реальное '''железо linux''' или '''[[WSL2 и CUDA|WSL2]]'''.  
Следуем инструкции установки на реальное '''железо linux''' или [[MMEditing#.D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0 WSL 2|'''WSL2''']]. Пока в статье [[MMEditing]], но потом перенесу в отдельную статью.
 
 
Python 3


===Python 3===
Смотрим версию:
Смотрим версию:
  python3 --version
  python3 --version
Строка 26: Строка 24:
  sudo apt -y upgrade
  sudo apt -y upgrade


 
===pip3===
pip3
 
Менеджер пакетов для Python 3
Менеджер пакетов для Python 3
  sudo apt install -y python3-pip
  sudo apt install -y python3-pip


 
===PyTorch===
PyTorch
 
С PyTorch все интереснее, для актуального железа ставиться последняя [https://pytorch.org/get-started/locally/ доступная версия]:
С PyTorch все интереснее, для актуального железа ставиться последняя [https://pytorch.org/get-started/locally/ доступная версия]:


Строка 48: Строка 42:


cuda 10.2
cuda 10.2
  pip install torch torchvision
  pip3 install torch torchvision
Но если железо старое то нужно устанавливать последнюю поддерживаемую версию железо. Везде по своему. В моем случае это tesla m2070:
Но если железо старое то нужно устанавливать последнюю поддерживаемую версию железо. Везде по своему.
sudo chown -R vova:vova  /usr/local/bin/


....
sudo chmod 755 /usr/local/bin/


sudo chown -R vova:vova  /usr/local/lib/python3.8/


BasicSR
sudo chmod 755 /usr/local/lib/python3.8/


Пакеты для Python
==BasicSR==
  pip install numpy opencv-python lmdb pyyaml
Переходим в папку в которой будет располагаться BasicSR. Почему я об этом говорю? В конечном счете обучение занимает много времени, генерируется много данных. Гигабайты данных - это результаты валидных изображений, точки сохранения, и сами обученные модели. В среднем если модель обучается до 100 тысяч итераций, при этом сохранение моделей каждые 1000 и валидных изображений каждые 5000, зависит от количества валиндных изображений, размеры могут быть 50 - 100 гигабайт. Поэтому рекомендуется располагать папку на накопителе с объемом не менее '''одного терабайта''' свободного пространства, чтобы можно было легко оперировать данными. У меня это HDD на 3 терабайта, WSL. Все локальные диски windos автоматически примонтированы в WSL, в каталоге '''mnt.''' Не путаем с Датасетом, его требуется располагать на скоростном накопителе.
TensorBoard
  cd /mnt/d/test/AI/
  pip install tensorboardX
Забираем последнюю версию с github
git clone <nowiki>https://github.com/xinntao/BasicSR.git</nowiki>
После копирования необходимо провести установку.
  cd /mnt/d/test/AI/BasicSR/


pip3 install -r requirements.txt


 
python3 setup.py develop
 
<br />
git clone -n <nowiki>https://github.com/xinntao/BasicSR.git</nowiki>
 
cd /tmp/BasicSR
 
git checkout -b test  00bbaf87163956fd00c22db73d051b9e27bcd563
 
 
Идем конфигурировать файл тренировки модели.
 
==Подготовка набора данных==
==Подготовка набора данных==
Задача состоит в том, чтобы обучить сеть на восстановление видео снятых на miniDV камеру. Видео хранилось на кассетах, после чего было перенесено на пека, методом захвата с DV камеры. Захват осуществлялся через [https://ru.wikipedia.org/wiki/IEEE_1394 Firewire]. На данный момент это самый максимально возможный с точки зрения качества захват. Нет способов получить качество выше.
Задача состоит в том, чтобы обучить модель на восстановление видео снятых на miniDV камеру. Видео хранилось на кассетах, после чего было перенесено на накопитель компьютера, методом захвата с DV камеры. Захват осуществлялся через [https://ru.wikipedia.org/wiki/IEEE_1394 Firewire]. На данный момент это самый максимально возможный с точки зрения качества захват. Нет способов получить качество выше.


В итого имеется 50 гигабайт видео в разрешении 720x576 с соотношением сторон 4:3. Но есть много но. Камера не профессиональная, качество записи не идеальное. Оному производителю известно как получается картинка. Тут будут приложены оригиналы.<gallery mode="packed-hover" caption="'''Исходные изображения захваченные с DV'''">
В итоге имеется 50 гигабайт видео в разрешении 720x576 с соотношением сторон 4:3. Но есть много но. Камера не профессиональная, качество записи не идеальное. Оному производителю известно как получается картинка. Тут будут приложены оригиналы.<gallery mode="packed-hover" caption="'''Исходные изображения захваченные с DV'''">
Файл:DV пример 001.jpeg
Файл:DV пример 001.jpeg
Файл:DV пример 002.jpeg
Файл:DV пример 002.jpeg
</gallery>Первое, что заметно на кадрах, это последствия черезстрочной записи. Подавление черезстрочности выполнено было на этапе подготовки видео для раскадровки. Более качественного подавления черезстрочной развертки я не нашел. Следующая заметная особенность представленных кадров это некое утолщение любых границ объектов, это следствие интерполяции, которая скорее всего выполнялась на самой камере при записи. Интерполяция совсем не простая, но имеет артефакты. Так же присуще любой непрофессиональной записи, небольшой расфокус. Очень большое количество смазанных кадров в различном направлении из за низкой статичности камеры. Слабые "смазы" еще допустимы, но в большинстве случаев они ужасающе сильные, на таких кадрах попросту не за что зацепится.
</gallery>Первое, что заметно на кадрах, это последствия черезстрочности кадров. Подавление черезстрочности выполнено было на этапе подготовки видео для раскадровки. Более качественного подавления черезстрочной развертки я не нашел. Следующая заметная особенность представленных кадров это некое утолщение любых границ объектов, это следствие интерполяции, которая скорее всего выполнялась на самой камере при записи. Интерполяция совсем не простая, но имеет артефакты. Так же присуще любой непрофессиональной записи, небольшой расфокус. Очень большое количество смазанных кадров в различном направлении из за низкой статичности камеры. Слабые "смазы" еще допустимы, но в большинстве случаев они ужасающе сильные, на таких кадрах попросту не за что зацепится.
[[Файл:DV пример 003.png|мини|Пример сжатия, видимые границы блоков 16х16 пикселей]]
[[Файл:DV пример 003.png|мини|Пример сжатия, видимые границы блоков 16х16 пикселей]]
Говорить о приведении изображения в студийное качество конечно же нельзя, чудес не бывает, но все кадры с более менее сохранившимися деталями сохранить можно.
Говорить о приведении изображения в студийное качество конечно же нельзя, чудес не бывает, но все кадры с более менее сохранившимися деталями сохранить можно.
Строка 97: Строка 88:
Здесь перечислены те проблемы которые можно смоделировать искусственно. Черестрочную развертку смоделировать очень не просто, Так же не просто смоделировать смазывания во всех направлениях и с разной длинной.  
Здесь перечислены те проблемы которые можно смоделировать искусственно. Черестрочную развертку смоделировать очень не просто, Так же не просто смоделировать смазывания во всех направлениях и с разной длинной.  


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


'''Сделаю акцент на обучении сети. Самая большая проблема восстановления даже не в алгоритме. А во входных данных. Нужно каким то образом показать сети, что "вот из этого" должно получаться "вот это". И сделать это по меньшей мере 100 тысяч раз, в различных вариациях.'''  
'''Сделаю акцент на обучении сети. Самая большая проблема "дополнения" даже не в алгоритме, а во входных данных. Нужно каким то образом показать модели, что "вот из этого" должно получаться "вот это". И сделать это по меньшей мере 100 тысяч раз, в различных вариациях.'''  


О наборе данных, их много, очень много. Популярны [https://data.vision.ee.ethz.ch/cvl/DIV2K/ DIV2K], Flickr2K, технически это набор рандомных фото, тысячи фото всего вокруг. Так же я собрал свой сет из библиотеки, из 500 фото. У google есть тоже открытый набор данных в виде 9 миллионов фото. Но такими объемами данных оперировать на обычном ПК невозможно.
О наборе данных, их много, очень много. Популярны [https://data.vision.ee.ethz.ch/cvl/DIV2K/ DIV2K], Flickr2K, технически это набор рандомных фото, тысячи фото всего вокруг. Так же я собрал свой сет из библиотеки, из 500 фото. У google есть тоже открытый набор данных в виде 9 миллионов фото. Но такими объемами данных оперировать на обычном ПК невозможно.
Строка 105: Строка 96:
После получения наборов данных, лучше всего переименовать все по порядку. Есть 1000 изображений каждое назвать от 0001 до 1000. В именах не должно быть пробелов и спецсимволов, лучше оставить только цифры. Потом попросту будет легче ориентироваться в данных.  
После получения наборов данных, лучше всего переименовать все по порядку. Есть 1000 изображений каждое назвать от 0001 до 1000. В именах не должно быть пробелов и спецсимволов, лучше оставить только цифры. Потом попросту будет легче ориентироваться в данных.  


В моем случае в наборе DIV2K есть 800 изображений и 200 сравнительных изображений. Этот набор уже заранее так собран, так как подразумевается для машинного обучения. Сравнительные данные нужны для отчета системы нам. Чтобы было понятно в правильном ли направлении двигается сеть. И например каждые 5 тысяч итераций будет преобразовано с помощью обученной сети 200 изображений. Где будет наглядно виден прогресс.
В моем случае в наборе DIV2K есть 800 изображений и 100 сравнительных изображений. Этот набор уже заранее так собран, так как подразумевается для машинного обучения. Сравнительные данные нужны для отчета системы нам. Чтобы было понятно в правильном ли направлении двигается сеть. И например каждые 5 тысяч итераций будет преобразовано с помощью обученной сети 100 изображений. Где будет наглядно виден прогресс. Но я объединяю валидные данные с общими. Как данные для контроля качества обучения буду использовать кадры и различных видео, требующие восстановления.  


<br />
<br />


===Кратность===
===Кратность===
Если набор данных предусмотрен для машинного обучения, то размеры изображений будут иметь размеры в пикселях кратные определенному числу, например четырем. Не каждый набор данных будет таким. Так как не все сети нужны для повышения разрешения. В нашем же случае с набором данных нам придется выполнять изменение размеров, как минимум в 4 раза, иногда даже и 16. Из чего выходит необходимость иметь набор данных разрешение которого по обеим сторонам кратен 16. Какого было моё удивление когда я задал вопрос, как преобразовать массивы изображений так чтобы их разрешение обрезалось до кратных 16 по ширине и высоте. При том что все изображения имеют не фиксированное соотношение сторон. Есть фото вертикальные, есть горизонтальные, а есть квадратные.
Если набор данных предусмотрен для машинного обучения, то размеры изображений будут иметь размеры в пикселях кратные определенному числу, например четырем. Не каждый набор данных будет таким. Так как не все модели нужны для повышения разрешения. В нашем же случае с набором данных нам придется выполнять изменение размеров, как минимум в 4 раза, иногда даже и 16. Из чего выходит необходимость иметь набор данных разрешение которого по обеим сторонам кратен 16. Какого было моё удивление когда я задал вопрос, как преобразовать массивы изображений так чтобы их разрешение обрезалось до кратных 16 по ширине и высоте. При том что все изображения имеют не фиксированное соотношение сторон. Есть фото вертикальные, есть горизонтальные, а есть квадратные.


Программ с таким функционалом не нашлось. Может плохо искал.
Программ с таким функционалом не нашлось. Может плохо искал.
Строка 146: Строка 137:
Ура у нас есть наборы данных нужной нам кратностью.
Ура у нас есть наборы данных нужной нам кратностью.


<br />


Теперь на примере DIV2K попробуем разложить его на несколько видов обработки .
===Теперь на примере DIV2K попробуем разложить его на несколько видов обработки .===
 
Всего 900 изображений. Разложим их по 50. И к каждой сотне применим различные эффекты, при это уменьшим разрешение в 4 раза, так как наша сеть именно во столько раз увеличивает изображения.
Всего 800 изображений. Разложим их по 100. И к каждой сотне применим различные эффекты, при это уменьшим разрешение в 4 раза, так как наша сеть именно во столько раз увеличивает изображения.


Все манипуляции с понижением качества будем делать в '''Adobe Photoshop.'''  
Все манипуляции с понижением качества будем делать в '''Adobe Photoshop.'''  
Строка 157: Строка 148:
Начинаем с создания "экшенов" для разных сценариев "плохих" кадров.
Начинаем с создания "экшенов" для разных сценариев "плохих" кадров.


====Первый сценарий====
<br />
<gallery mode="slideshow">
 
====01_Медиана====
<gallery mode="packed-hover">
Файл:BasicSR Первый сценарий 001.png|Настройки для уменьшения размера в 2 раза
Файл:BasicSR Первый сценарий 001.png|Настройки для уменьшения размера в 2 раза
Файл:BasicSR Первый сценарий 002.png|Настройки для применения фильтра - Медиана
Файл:BasicSR Первый сценарий 002.png|Настройки для применения фильтра - Медиана
Строка 167: Строка 160:
</gallery>
</gallery>


#Изменяем размер изображения (50) процентов, нужно это делать в процентах, так как у всех изображений разное разрешение.
#Изменяем размер изображения (50) процентов, нужно это делать в процентах, так как у всех изображений разное разрешение. Размер изображения Ширина: 50%; Включить: Масштабировать стиль; Включить: Сохранить пропорции; Интерполяция: автоматически
#Применяем фильтр Медиана с радиусом 1. Этот фильтр помимо размытия сильно усложняет изображение, с точки зрения математики. Сжимаемость становиться плохой.
#Применяем фильтр Медиана с радиусом 1. Этот фильтр помимо размытия сильно усложняет изображение, с точки зрения математики. Сжимаемость становиться плохой. Медиана  Радиус: 1 пикс.
#Затем снова снижаем размер изображения на (50) процентов. Это уже будет окончательное разрешение, из которого модель будет стремится получить оригинал.
#Затем снова снижаем размер изображения на (50) процентов. Это уже будет окончательное разрешение, из которого модель будет стремится получить оригинал. Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сохраняем в выделенную папку. Зачем? Нам еще осталось выполнить важный пункт ухудшения кадра - Сжатие. Поэтому вовремя записи "Экшена" выполняем сохранение в папку, формат выбираем jpg и сжатие ставим на 4.
#Затем подкинем немного шума, чтобы сеть смерилась к подавлению шумов.  Сделать слои  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 3%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,2 пикс.
#Чтобы при сохранении adobe photoshop не пытался сохранять изображение как pds, нужно выполнить сведение слоёв.  Выполнить сведение
#Сохраняем в выделенную папку. Зачем? Нам еще осталось выполнить важный пункт ухудшения кадра - Сжатие. Поэтому вовремя записи "Экшена" выполняем сохранение в папку, формат выбираем jpg и сжатие ставим на 5.


Открываем изображение, заканчиваем запись "экшена", и удаляем последнее действие "открыть изображение".
Открываем изображение, заканчиваем запись "экшена", и удаляем последнее действие "открыть изображение".
Строка 180: Строка 177:
Начинаем обработку.
Начинаем обработку.


В заранее созданной и указанной в "Экшне" папке будут появляться уменьшенные в 4 раза и обработанные согласно "Экшену" изображения, да еще и "пришакаленые" сжатием JPEG.  
В заранее созданной и указанной в "Экшне" папке будут появляться уменьшенные в 4 раза и обработанные согласно "Экшену" изображения, да еще и "пришакаленые" сжатием JPEG.
 
====02_Гаус====
Данным сценарием просто делаем небольшой расфокус. И также кидаем немного шума.<gallery mode="packed-hover">
Файл:BasicSR Второй сценарий 001.png|Настройка размытия по Гауссу
Файл:BasicSR Второй сценарий 002.jpg|Сравнение результатов
Файл:BasicSR Второй сценарий 003.png|Оригинал
Файл:BasicSR Второй сценарий 004.jpg|Пост обработка
</gallery>
 
#Изменяем размер изображения (50) процентов Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Применяем размытие по Гауссу с радиусом 1 Размытие по Гауссу  Радиус: 1 пикс.
#Снова снижаем разрешение на 50 Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сделать слои  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 3%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,3 пикс.
#Выполнить сведение
#Сохраняем по принципу первого сценария. Только степень сжатия выставляем уже на 4 пункта.
 
Данным сценарием просто делаем небольшой расфокус.
 
<br />
 
====03_Простой_скеил====
Простое уменьшение в 4 раза. Ну и про шум не забываем.
 
#Изменяем размер изображения (25) процентов Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сделать слои  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 3%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,3 пикс.
#Выполнить сведение
#Сохраняем по принципу второго сценария
 
====04_Контурная_резкость====
 
#Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Контурная резкость  Эффект: 135%  Радиус: 4,5 пике.  Порог: 6
#Размер изображения  Ширина: 50%  Включить: Масштабировать стили  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сохраняем по принципу первого сценария, но сжатие ставим 3.
 
<br />
 
====05_realgrain====
Данный фильтр является плагином для adobe photoshop. Требуется установить. Входит в состав Imagenomic Professional Plugin.
 
#Размер изображения  Ширина: 25%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#В данном фильтре примеряю присет KODAK KODACHROME 200
#Сохраняем по принципу первого сценария, но сжатие ставим 3.
 
<br />
 
====06_абскеил_повышение_резкости====
Тут применяется сначала уменьшение изображения до 25 процентов, затем разрешение снижается еще на 1/4 и снова увеличивается до 25 процентов от оригинала. К изображению применяются фильтры повышения резкости, контурная резкость, и умная резкость.
 
#Размер изображения  Ширина: 25%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Размер изображения  Ширина: 75%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Размер изображения  Ширина: 133,33%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Контурная резкость  Эффект: 63% Радиус: 3 пике.  Порог: 9
#"Умная* резкость  Вид предустановленного набора: Заказная  Выключить: Использовать прежние  Эффект: 162% Радиус: 0,6 пике.  Уменьшить шум: 0%  Удалить: Размытие объектива
#Яркость/Кон траста ость  Яркость: 0  Контрастность: -20  Выключить: Использовать прежние
#Сохраняем по принципу первого сценария, но сжатие ставим 4.
 
<br />
 
====07_размытие_в_движении====
Размытие в движении по четырем направлениям, также добавляем небольшой шум. Чтобы наша модель в целом стремилась к подавлению шума.
 
#Изменяем размер изображения (25) процентов Размер изображения  Ширина: 25%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Применяем фильтр размытие в движении -45. Размытие в движении  Угловой: -45  Величина смещения: 4 пикс.
#Сделать слои  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 3%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,1 пике.
#Выполнить сведение
#Сохраняем по принципу первого сценария, но сжатие ставим 4.
 
<br />
 
====08_имитация_интерполяции====
<gallery mode="packed-hover">
Файл:BasicSR Третий сценарий 001.jpg|Сравнение
Файл:BasicSR Третий сценарий 002.png|Оригинал
Файл:BasicSR Третий сценарий 003.jpg|Пост обработка
</gallery>В данном сценарии попробуем с имитировать интерполяцию камеры. Так же подкинем совсем немного шума.
 
#Изменяем размер изображение (25) процентов, в 4 раза Размер изображения  Ширина: 25%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Затем снова изменяем размеры до 75 процентов Размер изображения  Ширина: 75%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#После чего из меняем размер уже на 133.33 процента. Размер изображения  Ширина: 133,33%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сделать слои  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 3%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,1 пикс.
#Выполнить сведение
#Сохраняем по принципу первого сценария, но сжатие ставим 4.
 
Тут мы сначала уменьшили изображение в 4 раза, затем уменьши еще раз на одну четвертую, затем интерполировали обратно до уменьшенного в 4 раза.
 
Тут и пригодилась кратность 16, так как мы уменьшили в 4 раза, а заем еще на одну четвертую, в итоге если бы кратность была 8 то обратный процесс преобразования мог бы вызвать различия в кратности. И для сети изображение бы не было кратным, выдавалась бы ошибка.
 
<br />
 
====09_экстримальное_размытие====
<gallery mode="packed-hover">
Файл:BasicSR Четвёрый сценарий 001.jpg|Сравнение
Файл:BasicSR Четвёрый сценарий 002.png|Оригинал
Файл:BasicSR Четвёрый сценарий 003.jpg|Пост обработка
</gallery>Экстремальное размытие и шум
 
#Изменяем размер изображения (50) процентов Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Применяем размытие по Гауссу с радиусом 2 Размытие по Гауссу  Радиус: 2 пикс.
#Применяем фильтр Медиана с радиусом 2 Медиана  Радиус: 2 пикс.
#Изменяем размер изображения (50) процентов Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сделать слой  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 3%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,1 пикс.
#Выполнить сведение
#Сохраняем по принципу первого сценария, но сжатие ставим 4.
 
<br />
 
====10_Медиана_шум2====
Это повтор первого метода, оличие в способе абскейлинга, повышенном шуме и более высокой степени сжатия.
 
#Размер изображения  Ширина: 50%  Включить: Масштабировать стили  Включить: Сохранить пропорции  Интерполяция: сохранение деталей 2.0  Шум: 13
#Медиана  Радиус: 1 пикс.
#Размер изображения  Ширина: 50%  Включить: Масштабировать стили  Включить: Сохранить пропорции  Интерполяция: сохранение деталей 2.0  Шум: 13
#Сделать слой  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 5%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,3 пикс.
#Выполнить сведение
#Сохраняем по принципу первого сценария, но сжатие ставим 3.
 
<br />
 
====11_Гаус_шум2====
 
#Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Размытие по Гауссу  Радиус: 1 пикс.
#Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сделать слой  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 5%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,3 пикс.
#Выполнить сведение
#Сохраняем по принципу первого сценария, но сжатие ставим 3.
 
<br />
 
====12_Простой_скеил_шум2====
 
#Размер изображения  Ширина: 25%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сделать слой  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 5%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,3 пикс.
#Выполнить сведение
#Сохраняем по принципу первого сценария, но сжатие ставим 3.
 
<br />
 
====13_медиана_без_шума====
 
#Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Медиана  Радиус: 1 пикс.
#Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сохраняем по принципу первого сценария, но сжатие ставим 3.
 
<br />
 
====14_Гаус_без_шума====
 
#Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Размытие по Гауссу  Радиус: 1 пикс.
#Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сохраняем по принципу первого сценария, но сжатие ставим 3.
 
<br />


====15_Простой_скеил_без_шума====
#Размер изображения  Ширина: 25%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сохраняем по принципу первого сценария, но сжатие ставим 3.
<br />


====16_имитация_интерполяции_без_шума====


#Изменяем размер изображение (25) процентов, в 4 раза  Размер изображения  Ширина: 25%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Затем снова изменяем размеры до 75 процентов Размер изображения  Ширина: 75%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#После чего из меняем размер уже на 133.33 процента. Размер изображения  Ширина: 133,33%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сохраняем по принципу первого сценария, но сжатие ставим 3.


<br />


====17_имитация_интерполяции_шум2====


#Изменяем размер изображение (25) процентов, в 4 раза  Размер изображения  Ширина: 25%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Затем снова изменяем размеры до 75 процентов Размер изображения  Ширина: 75%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#После чего из меняем размер уже на 133.33 процента. Размер изображения  Ширина: 133,33%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сделать слой  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 5%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,3 пикс.
#Выполнить сведение
#Сохраняем по принципу первого сценария, но сжатие ставим 3.


<br />
<br />
====18_экстримальное_размытие_шум2====
#Изменяем размер изображения (50) процентов  Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Применяем размытие по Гауссу с радиусом 2 Размытие по Гауссу  Радиус: 2 пикс.
#Применяем фильтр Медиана с радиусом 2 Медиана  Радиус: 2 пикс.
#Изменяем размер изображения (50) процентов Размер изображения  Ширина: 50%  Включить: Масштабировать стиль  Включить: Сохранить пропорции  Интерполяция: автоматически
#Сделать слой  Вычесть: слои Режим: перекрытие  Включить: Выполнить заливку нейтральным
#Добавить шум  Распределение: по Гауссу  Проценты: 4%  Включить: Монохромный
#Размытие по Гауссу  Радиус: 0,3 пикс.
#Выполнить сведение
#Сохраняем по принципу первого сценария, но сжатие ставим 3.
<br />
====Рабивка набора данных====
Для того чтобы уложиться в небесконечные размеры оперативной памяти видеоускорителя, нужно разбить изображения на мелкие кусочки, это повысить также и обучаемость модели, так как набор данных станет больше.
Для этого применяется скрипт, находящийся в папке с проектом.
На данный момент все по дурацкому, хорошо работает только скрипт из активной ветки.
BasicSR/scripts/extract_subimages.py
в нем нужно указать пути<syntaxhighlight lang="python">
...
opt = {}
    opt['n_thread'] = 20
    opt['compression_level'] = 3
    # HR images
    opt['input_folder'] = '/mnt/d/test/AI/DIV2K_02/DIV2K_HR/'
    opt['save_folder'] = '/mnt/d/test/AI/DIV2K_02/DIV2K_HR_sub/'
    opt['crop_size'] = 480
    opt['step'] = 240
    opt['thresh_size'] = 0
    extract_subimages(opt)
    # LRx2 images
    #opt['input_folder'] = 'datasets/DIV2K/DIV2K_train_LR_bicubic/X2'
    #opt['save_folder'] = 'datasets/DIV2K/DIV2K_train_LR_bicubic/X2_sub'
    #opt['crop_size'] = 240
    #opt['step'] = 120
    #opt['thresh_size'] = 0
    #extract_subimages(opt)
    # LRx3 images
    #opt['input_folder'] = 'datasets/DIV2K/DIV2K_train_LR_bicubic/X3'
    #opt['save_folder'] = 'datasets/DIV2K/DIV2K_train_LR_bicubic/X3_sub'
    #opt['crop_size'] = 160
    #opt['step'] = 80
    #opt['thresh_size'] = 0
    #extract_subimages(opt)
    # LRx4 images
    opt['input_folder'] = '/mnt/d/test/AI/DIV2K_02/DIV2K_HR4/'
    opt['save_folder'] = '/mnt/d/test/AI/DIV2K_02/DIV2K_HR4_sub/'
    opt['crop_size'] = 120
    opt['step'] = 60
    opt['thresh_size'] = 0
    extract_subimages(opt)
...
</syntaxhighlight>
python ./scripts/extract_subimages.py
В итоге из 855 файлов получилось 34 832 файла.
Столько же должно получиться с уменьшенным разрешением.
На данном этапе можно закончить работу над этим.
==Приступаем к обучению==
из папки с BasicSR_old
ищем в папке '''codes/options/train/train_ESRGAN.yml'''<syntaxhighlight lang="python">
#### general settings
name: test12
use_tb_logger: true
model: srgan
distortion: sr
scale: 4
gpu_ids: [0]
#### datasets
datasets:
  train:
    name: DIV2K
    mode: LQGT
    dataroot_GT: /mnt/e/test/OUT_SET/HR
    dataroot_LQ: /mnt/e/test/OUT_SET/HR_4
    use_shuffle: true
    n_workers: 6  # per GPU
    batch_size: 16
    GT_size: 128
    use_flip: true
    use_rot: true
    color: RGB
  val:
    name: val_set14_part
    mode: LQGT
    dataroot_GT: /mnt/e/test/OUT_SET/VAL
    dataroot_LQ: /mnt/e/test/OUT_SET/VAL4
#### network structures
network_G:
  which_model_G: RRDBNet
  in_nc: 3
  out_nc: 3
  nf: 64
  nb: 23
network_D:
  which_model_D: discriminator_vgg_128
  in_nc: 3
  nf: 64
#### path
path:
  #pretrain_model_G: /home/vova/tmp/BasicSR/experiments/pretrained_models/RRDB_ESRGAN_x4.pth
  pretrain_model_G: /home/vova/BasicSR_old/experiments/pretrained_models/RRDB_ESRGAN_x4.pth
  strict_load: true
  #resume_state: ~
  resume_state: /home/vova/BasicSR_old/experiments/test12/training_state/23200.state
#### training settings: learning rate scheme, loss
train:
  lr_G: !!float 1e-4
  weight_decay_G: 0
  beta1_G: 0.9
  beta2_G: 0.99
  lr_D: !!float 1e-4
  weight_decay_D: 0
  beta1_D: 0.9
  beta2_D: 0.99
  lr_scheme: MultiStepLR
  niter: 400000
  warmup_iter: -1  # no warm up
  lr_steps: [50000, 100000, 200000, 300000]
  lr_gamma: 0.5
  pixel_criterion: l1
  pixel_weight: !!float 1e-2
  feature_criterion: l1
  feature_weight: 1
  gan_type: ragan  # gan | ragan
  gan_weight: !!float 5e-3
  D_update_ratio: 1
  D_init_iters: 0
  manual_seed: 10
  val_freq: !!float 5e3
#### logger
logger:
  print_freq: 50
  save_checkpoint_freq: !!float 2e2
</syntaxhighlight>Тут много всего
указать пути для все видов файлов
указать <br />
__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__

Текущая версия от 03:22, 26 августа 2020

BasicSR - средство для обучения моделей.

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


Базовая подготовка ОС

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

На момент актуальной версии железа nvidia 10, 16 и 20 серии все работает из коробки. Но если нужно завести все на более старом железе, то есть много нюансов.

На данный момент это Kepler, Maxwell, Pascal, Volta, все упирается в CUDA, минимальная версия которого 9.2. А это обусловлено PyTorch 1.3 и выше.

NVIDIA CUDA

Следуем инструкции установки на реальное железо linux или WSL2.

Python 3

Смотрим версию:

python3 --version

Если Python установлен то покажет версию, если нет то нужно установить.

На данный момент Python есть по умолчанию в ubuntu, если сделать:

sudo apt update
sudo apt -y upgrade

pip3

Менеджер пакетов для Python 3

sudo apt install -y python3-pip

PyTorch

С PyTorch все интереснее, для актуального железа ставиться последняя доступная версия:

Выбираем нужную нам конфигурацию

stable

linux

pip

python

cuda 10.2

pip3 install torch torchvision

Но если железо старое то нужно устанавливать последнюю поддерживаемую версию железо. Везде по своему.

sudo chown -R vova:vova  /usr/local/bin/
sudo chmod 755 /usr/local/bin/
sudo chown -R vova:vova  /usr/local/lib/python3.8/
sudo chmod 755 /usr/local/lib/python3.8/

BasicSR

Переходим в папку в которой будет располагаться BasicSR. Почему я об этом говорю? В конечном счете обучение занимает много времени, генерируется много данных. Гигабайты данных - это результаты валидных изображений, точки сохранения, и сами обученные модели. В среднем если модель обучается до 100 тысяч итераций, при этом сохранение моделей каждые 1000 и валидных изображений каждые 5000, зависит от количества валиндных изображений, размеры могут быть 50 - 100 гигабайт. Поэтому рекомендуется располагать папку на накопителе с объемом не менее одного терабайта свободного пространства, чтобы можно было легко оперировать данными. У меня это HDD на 3 терабайта, WSL. Все локальные диски windos автоматически примонтированы в WSL, в каталоге mnt. Не путаем с Датасетом, его требуется располагать на скоростном накопителе.

cd /mnt/d/test/AI/

Забираем последнюю версию с github

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

После копирования необходимо провести установку.

cd /mnt/d/test/AI/BasicSR/
pip3 install -r requirements.txt
python3 setup.py develop


Подготовка набора данных

Задача состоит в том, чтобы обучить модель на восстановление видео снятых на miniDV камеру. Видео хранилось на кассетах, после чего было перенесено на накопитель компьютера, методом захвата с DV камеры. Захват осуществлялся через Firewire. На данный момент это самый максимально возможный с точки зрения качества захват. Нет способов получить качество выше.

В итоге имеется 50 гигабайт видео в разрешении 720x576 с соотношением сторон 4:3. Но есть много но. Камера не профессиональная, качество записи не идеальное. Оному производителю известно как получается картинка. Тут будут приложены оригиналы.

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

Пример сжатия, видимые границы блоков 16х16 пикселей

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

Следующей проблемой видео является сжатие. При том, что видео захвачено с камеры в сумасшедших 35 мегабитах потока, для разрешения 720x576, не каждый 4к фильм может похвастаться таким потоком, есть множество артефактов, появляющихся при сжатии видео. Причиной тому является невысокая производительность самой камеры, в которой был встроен аппаратный кодек. У кассеты формата miniDV поток как раз примерно равен 35 мегабит. Настолько в те времена аппаратная реализация сжатия была примитивна, что не смогла в такой поток уместить изображение без видимых артефактов. Но в целом, это еще обусловлено сложностью самого изображения, у него высокая зернистость и "пёстрость", что сильно влияет на степень сжатия. Это проблема любых любительских записей.

Итак, выявлены следующие входные данные:

- Интерполяция

- Расфокусирование

- Смазанное изображение

- Артефакты сжатия

Здесь перечислены те проблемы которые можно смоделировать искусственно. Черестрочную развертку смоделировать очень не просто, Так же не просто смоделировать смазывания во всех направлениях и с разной длинной.

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

Сделаю акцент на обучении сети. Самая большая проблема "дополнения" даже не в алгоритме, а во входных данных. Нужно каким то образом показать модели, что "вот из этого" должно получаться "вот это". И сделать это по меньшей мере 100 тысяч раз, в различных вариациях.

О наборе данных, их много, очень много. Популярны DIV2K, Flickr2K, технически это набор рандомных фото, тысячи фото всего вокруг. Так же я собрал свой сет из библиотеки, из 500 фото. У google есть тоже открытый набор данных в виде 9 миллионов фото. Но такими объемами данных оперировать на обычном ПК невозможно.

После получения наборов данных, лучше всего переименовать все по порядку. Есть 1000 изображений каждое назвать от 0001 до 1000. В именах не должно быть пробелов и спецсимволов, лучше оставить только цифры. Потом попросту будет легче ориентироваться в данных.

В моем случае в наборе DIV2K есть 800 изображений и 100 сравнительных изображений. Этот набор уже заранее так собран, так как подразумевается для машинного обучения. Сравнительные данные нужны для отчета системы нам. Чтобы было понятно в правильном ли направлении двигается сеть. И например каждые 5 тысяч итераций будет преобразовано с помощью обученной сети 100 изображений. Где будет наглядно виден прогресс. Но я объединяю валидные данные с общими. Как данные для контроля качества обучения буду использовать кадры и различных видео, требующие восстановления.


Кратность

Если набор данных предусмотрен для машинного обучения, то размеры изображений будут иметь размеры в пикселях кратные определенному числу, например четырем. Не каждый набор данных будет таким. Так как не все модели нужны для повышения разрешения. В нашем же случае с набором данных нам придется выполнять изменение размеров, как минимум в 4 раза, иногда даже и 16. Из чего выходит необходимость иметь набор данных разрешение которого по обеим сторонам кратен 16. Какого было моё удивление когда я задал вопрос, как преобразовать массивы изображений так чтобы их разрешение обрезалось до кратных 16 по ширине и высоте. При том что все изображения имеют не фиксированное соотношение сторон. Есть фото вертикальные, есть горизонтальные, а есть квадратные.

Программ с таким функционалом не нашлось. Может плохо искал.

Смогла помочь только утилита для Linux, полностью консольная.

apt-get -y install imagemagick

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

%[fx:16*int((w+1)/16)]x%[fx:16*int((h+1)/16)]!

где 16 это кратность

в итоге получилось что то такое:

for pic in $(ls *.png); do echo "I:${pic}"; convert ${pic} -resize $(convert ${pic} -format '%[fx:16*int((w+1)/16)]x%[fx:16*int((h+1)/16)]!' info:) /mnt/d/test/AI/Flickr2K/001_V_LRx4/${pic}; echo " - ok"; done

Что тут нужно знать:

for pic in $(ls *.png); - это создание переменной на основе того что лежит в том месте где выполнена команда. То есть нужно перейти в папку с изображениями, и выполнить команду.

можно запустить команду из любой папки, но тогда нужно указывать путь:

for pic in $(ls /mnt/e/test/005/*.png);

pic - Это переменная

Далее цикл do

-resize - означает изменение размера, в оригинале было дополнение изображения.

В конце указан путь куда должны попасть кадры после обработки.

Дунаю команду можно выполнит и без цикла

for pic in $(ls *.png); do echo "I:${pic}"; _____ ; echo " - ok"; done - это цикл, все что в нем заключено, это обычная одноразовая команда.

Ура у нас есть наборы данных нужной нам кратностью.


Теперь на примере DIV2K попробуем разложить его на несколько видов обработки .

Всего 900 изображений. Разложим их по 50. И к каждой сотне применим различные эффекты, при это уменьшим разрешение в 4 раза, так как наша сеть именно во столько раз увеличивает изображения.

Все манипуляции с понижением качества будем делать в Adobe Photoshop.

Как это работает? В Photoshop создается "экшен" своего рода запись применяемых операций. После чего этот записанный скрип можно применить к любому изображению. Так же Photoshop был бы не он, если бы не мог в пакетную обработку. Для этого есть во вкладке Файл - Автоматизация.

Начинаем с создания "экшенов" для разных сценариев "плохих" кадров.


01_Медиана

  1. Изменяем размер изображения (50) процентов, нужно это делать в процентах, так как у всех изображений разное разрешение. Размер изображения Ширина: 50%; Включить: Масштабировать стиль; Включить: Сохранить пропорции; Интерполяция: автоматически
  2. Применяем фильтр Медиана с радиусом 1. Этот фильтр помимо размытия сильно усложняет изображение, с точки зрения математики. Сжимаемость становиться плохой. Медиана Радиус: 1 пикс.
  3. Затем снова снижаем размер изображения на (50) процентов. Это уже будет окончательное разрешение, из которого модель будет стремится получить оригинал. Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  4. Затем подкинем немного шума, чтобы сеть смерилась к подавлению шумов. Сделать слои Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  5. Добавить шум Распределение: по Гауссу Проценты: 3% Включить: Монохромный
  6. Размытие по Гауссу Радиус: 0,2 пикс.
  7. Чтобы при сохранении adobe photoshop не пытался сохранять изображение как pds, нужно выполнить сведение слоёв. Выполнить сведение
  8. Сохраняем в выделенную папку. Зачем? Нам еще осталось выполнить важный пункт ухудшения кадра - Сжатие. Поэтому вовремя записи "Экшена" выполняем сохранение в папку, формат выбираем jpg и сжатие ставим на 5.

Открываем изображение, заканчиваем запись "экшена", и удаляем последнее действие "открыть изображение".

Теперь запускам пакетную обработку. "Выходная папка" выпираем "Не обрабатывать"

"Источник" выбираем "Папка" и выбираем папку с первой сотней изображений.

Начинаем обработку.

В заранее созданной и указанной в "Экшне" папке будут появляться уменьшенные в 4 раза и обработанные согласно "Экшену" изображения, да еще и "пришакаленые" сжатием JPEG.

02_Гаус

Данным сценарием просто делаем небольшой расфокус. И также кидаем немного шума.

  1. Изменяем размер изображения (50) процентов Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Применяем размытие по Гауссу с радиусом 1 Размытие по Гауссу Радиус: 1 пикс.
  3. Снова снижаем разрешение на 50 Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  4. Сделать слои Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  5. Добавить шум Распределение: по Гауссу Проценты: 3% Включить: Монохромный
  6. Размытие по Гауссу Радиус: 0,3 пикс.
  7. Выполнить сведение
  8. Сохраняем по принципу первого сценария. Только степень сжатия выставляем уже на 4 пункта.

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


03_Простой_скеил

Простое уменьшение в 4 раза. Ну и про шум не забываем.

  1. Изменяем размер изображения (25) процентов Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Сделать слои Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  3. Добавить шум Распределение: по Гауссу Проценты: 3% Включить: Монохромный
  4. Размытие по Гауссу Радиус: 0,3 пикс.
  5. Выполнить сведение
  6. Сохраняем по принципу второго сценария

04_Контурная_резкость

  1. Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Контурная резкость Эффект: 135% Радиус: 4,5 пике. Порог: 6
  3. Размер изображения Ширина: 50% Включить: Масштабировать стили Включить: Сохранить пропорции Интерполяция: автоматически
  4. Сохраняем по принципу первого сценария, но сжатие ставим 3.


05_realgrain

Данный фильтр является плагином для adobe photoshop. Требуется установить. Входит в состав Imagenomic Professional Plugin.

  1. Размер изображения Ширина: 25% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. В данном фильтре примеряю присет KODAK KODACHROME 200
  3. Сохраняем по принципу первого сценария, но сжатие ставим 3.


06_абскеил_повышение_резкости

Тут применяется сначала уменьшение изображения до 25 процентов, затем разрешение снижается еще на 1/4 и снова увеличивается до 25 процентов от оригинала. К изображению применяются фильтры повышения резкости, контурная резкость, и умная резкость.

  1. Размер изображения Ширина: 25% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Размер изображения Ширина: 75% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  3. Размер изображения Ширина: 133,33% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  4. Контурная резкость Эффект: 63% Радиус: 3 пике. Порог: 9
  5. "Умная* резкость Вид предустановленного набора: Заказная Выключить: Использовать прежние Эффект: 162% Радиус: 0,6 пике. Уменьшить шум: 0% Удалить: Размытие объектива
  6. Яркость/Кон траста ость Яркость: 0 Контрастность: -20 Выключить: Использовать прежние
  7. Сохраняем по принципу первого сценария, но сжатие ставим 4.


07_размытие_в_движении

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

  1. Изменяем размер изображения (25) процентов Размер изображения Ширина: 25% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Применяем фильтр размытие в движении -45. Размытие в движении Угловой: -45 Величина смещения: 4 пикс.
  3. Сделать слои Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  4. Добавить шум Распределение: по Гауссу Проценты: 3% Включить: Монохромный
  5. Размытие по Гауссу Радиус: 0,1 пике.
  6. Выполнить сведение
  7. Сохраняем по принципу первого сценария, но сжатие ставим 4.


08_имитация_интерполяции

В данном сценарии попробуем с имитировать интерполяцию камеры. Так же подкинем совсем немного шума.

  1. Изменяем размер изображение (25) процентов, в 4 раза Размер изображения Ширина: 25% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Затем снова изменяем размеры до 75 процентов Размер изображения Ширина: 75% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  3. После чего из меняем размер уже на 133.33 процента. Размер изображения Ширина: 133,33% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  4. Сделать слои Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  5. Добавить шум Распределение: по Гауссу Проценты: 3% Включить: Монохромный
  6. Размытие по Гауссу Радиус: 0,1 пикс.
  7. Выполнить сведение
  8. Сохраняем по принципу первого сценария, но сжатие ставим 4.

Тут мы сначала уменьшили изображение в 4 раза, затем уменьши еще раз на одну четвертую, затем интерполировали обратно до уменьшенного в 4 раза.

Тут и пригодилась кратность 16, так как мы уменьшили в 4 раза, а заем еще на одну четвертую, в итоге если бы кратность была 8 то обратный процесс преобразования мог бы вызвать различия в кратности. И для сети изображение бы не было кратным, выдавалась бы ошибка.


09_экстримальное_размытие

Экстремальное размытие и шум

  1. Изменяем размер изображения (50) процентов Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Применяем размытие по Гауссу с радиусом 2 Размытие по Гауссу Радиус: 2 пикс.
  3. Применяем фильтр Медиана с радиусом 2 Медиана Радиус: 2 пикс.
  4. Изменяем размер изображения (50) процентов Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  5. Сделать слой Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  6. Добавить шум Распределение: по Гауссу Проценты: 3% Включить: Монохромный
  7. Размытие по Гауссу Радиус: 0,1 пикс.
  8. Выполнить сведение
  9. Сохраняем по принципу первого сценария, но сжатие ставим 4.


10_Медиана_шум2

Это повтор первого метода, оличие в способе абскейлинга, повышенном шуме и более высокой степени сжатия.

  1. Размер изображения Ширина: 50% Включить: Масштабировать стили Включить: Сохранить пропорции Интерполяция: сохранение деталей 2.0 Шум: 13
  2. Медиана Радиус: 1 пикс.
  3. Размер изображения Ширина: 50% Включить: Масштабировать стили Включить: Сохранить пропорции Интерполяция: сохранение деталей 2.0 Шум: 13
  4. Сделать слой Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  5. Добавить шум Распределение: по Гауссу Проценты: 5% Включить: Монохромный
  6. Размытие по Гауссу Радиус: 0,3 пикс.
  7. Выполнить сведение
  8. Сохраняем по принципу первого сценария, но сжатие ставим 3.


11_Гаус_шум2

  1. Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Размытие по Гауссу Радиус: 1 пикс.
  3. Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  4. Сделать слой Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  5. Добавить шум Распределение: по Гауссу Проценты: 5% Включить: Монохромный
  6. Размытие по Гауссу Радиус: 0,3 пикс.
  7. Выполнить сведение
  8. Сохраняем по принципу первого сценария, но сжатие ставим 3.


12_Простой_скеил_шум2

  1. Размер изображения Ширина: 25% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Сделать слой Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  3. Добавить шум Распределение: по Гауссу Проценты: 5% Включить: Монохромный
  4. Размытие по Гауссу Радиус: 0,3 пикс.
  5. Выполнить сведение
  6. Сохраняем по принципу первого сценария, но сжатие ставим 3.


13_медиана_без_шума

  1. Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Медиана Радиус: 1 пикс.
  3. Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  4. Сохраняем по принципу первого сценария, но сжатие ставим 3.


14_Гаус_без_шума

  1. Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Размытие по Гауссу Радиус: 1 пикс.
  3. Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  4. Сохраняем по принципу первого сценария, но сжатие ставим 3.


15_Простой_скеил_без_шума

  1. Размер изображения Ширина: 25% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Сохраняем по принципу первого сценария, но сжатие ставим 3.


16_имитация_интерполяции_без_шума

  1. Изменяем размер изображение (25) процентов, в 4 раза Размер изображения Ширина: 25% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Затем снова изменяем размеры до 75 процентов Размер изображения Ширина: 75% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  3. После чего из меняем размер уже на 133.33 процента. Размер изображения Ширина: 133,33% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  4. Сохраняем по принципу первого сценария, но сжатие ставим 3.


17_имитация_интерполяции_шум2

  1. Изменяем размер изображение (25) процентов, в 4 раза Размер изображения Ширина: 25% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Затем снова изменяем размеры до 75 процентов Размер изображения Ширина: 75% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  3. После чего из меняем размер уже на 133.33 процента. Размер изображения Ширина: 133,33% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  4. Сделать слой Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  5. Добавить шум Распределение: по Гауссу Проценты: 5% Включить: Монохромный
  6. Размытие по Гауссу Радиус: 0,3 пикс.
  7. Выполнить сведение
  8. Сохраняем по принципу первого сценария, но сжатие ставим 3.


18_экстримальное_размытие_шум2

  1. Изменяем размер изображения (50) процентов Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  2. Применяем размытие по Гауссу с радиусом 2 Размытие по Гауссу Радиус: 2 пикс.
  3. Применяем фильтр Медиана с радиусом 2 Медиана Радиус: 2 пикс.
  4. Изменяем размер изображения (50) процентов Размер изображения Ширина: 50% Включить: Масштабировать стиль Включить: Сохранить пропорции Интерполяция: автоматически
  5. Сделать слой Вычесть: слои Режим: перекрытие Включить: Выполнить заливку нейтральным
  6. Добавить шум Распределение: по Гауссу Проценты: 4% Включить: Монохромный
  7. Размытие по Гауссу Радиус: 0,3 пикс.
  8. Выполнить сведение
  9. Сохраняем по принципу первого сценария, но сжатие ставим 3.




Рабивка набора данных

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

Для этого применяется скрипт, находящийся в папке с проектом.

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

BasicSR/scripts/extract_subimages.py

в нем нужно указать пути

...
opt = {}
    opt['n_thread'] = 20
    opt['compression_level'] = 3

    # HR images
    opt['input_folder'] = '/mnt/d/test/AI/DIV2K_02/DIV2K_HR/'
    opt['save_folder'] = '/mnt/d/test/AI/DIV2K_02/DIV2K_HR_sub/'
    opt['crop_size'] = 480
    opt['step'] = 240
    opt['thresh_size'] = 0
    extract_subimages(opt)

    # LRx2 images
    #opt['input_folder'] = 'datasets/DIV2K/DIV2K_train_LR_bicubic/X2'
    #opt['save_folder'] = 'datasets/DIV2K/DIV2K_train_LR_bicubic/X2_sub'
    #opt['crop_size'] = 240
    #opt['step'] = 120
    #opt['thresh_size'] = 0
    #extract_subimages(opt)

    # LRx3 images
    #opt['input_folder'] = 'datasets/DIV2K/DIV2K_train_LR_bicubic/X3'
    #opt['save_folder'] = 'datasets/DIV2K/DIV2K_train_LR_bicubic/X3_sub'
    #opt['crop_size'] = 160
    #opt['step'] = 80
    #opt['thresh_size'] = 0
    #extract_subimages(opt)

    # LRx4 images
    opt['input_folder'] = '/mnt/d/test/AI/DIV2K_02/DIV2K_HR4/'
    opt['save_folder'] = '/mnt/d/test/AI/DIV2K_02/DIV2K_HR4_sub/'
    opt['crop_size'] = 120
    opt['step'] = 60
    opt['thresh_size'] = 0
    extract_subimages(opt)
...
python ./scripts/extract_subimages.py

В итоге из 855 файлов получилось 34 832 файла.

Столько же должно получиться с уменьшенным разрешением.


На данном этапе можно закончить работу над этим.

Приступаем к обучению

из папки с BasicSR_old

ищем в папке codes/options/train/train_ESRGAN.yml

#### general settings
name: test12
use_tb_logger: true
model: srgan
distortion: sr
scale: 4
gpu_ids: [0]

#### datasets
datasets:
  train:
    name: DIV2K
    mode: LQGT
    dataroot_GT: /mnt/e/test/OUT_SET/HR
    dataroot_LQ: /mnt/e/test/OUT_SET/HR_4

    use_shuffle: true
    n_workers: 6  # per GPU
    batch_size: 16
    GT_size: 128
    use_flip: true
    use_rot: true
    color: RGB
  val:
    name: val_set14_part
    mode: LQGT
    dataroot_GT: /mnt/e/test/OUT_SET/VAL
    dataroot_LQ: /mnt/e/test/OUT_SET/VAL4

#### network structures
network_G:
  which_model_G: RRDBNet
  in_nc: 3
  out_nc: 3
  nf: 64
  nb: 23
network_D:
  which_model_D: discriminator_vgg_128
  in_nc: 3
  nf: 64

#### path
path:
  #pretrain_model_G: /home/vova/tmp/BasicSR/experiments/pretrained_models/RRDB_ESRGAN_x4.pth
  pretrain_model_G: /home/vova/BasicSR_old/experiments/pretrained_models/RRDB_ESRGAN_x4.pth
  strict_load: true
  #resume_state: ~
  resume_state: /home/vova/BasicSR_old/experiments/test12/training_state/23200.state

#### training settings: learning rate scheme, loss
train:
  lr_G: !!float 1e-4
  weight_decay_G: 0
  beta1_G: 0.9
  beta2_G: 0.99
  lr_D: !!float 1e-4
  weight_decay_D: 0
  beta1_D: 0.9
  beta2_D: 0.99
  lr_scheme: MultiStepLR

  niter: 400000
  warmup_iter: -1  # no warm up
  lr_steps: [50000, 100000, 200000, 300000]
  lr_gamma: 0.5

  pixel_criterion: l1
  pixel_weight: !!float 1e-2
  feature_criterion: l1
  feature_weight: 1
  gan_type: ragan  # gan | ragan
  gan_weight: !!float 5e-3

  D_update_ratio: 1
  D_init_iters: 0

  manual_seed: 10
  val_freq: !!float 5e3

#### logger
logger:
  print_freq: 50
  save_checkpoint_freq: !!float 2e2

Тут много всего

указать пути для все видов файлов

указать