Увеличение и обработка изображений в два клика с помощью Real-ESRGAN (Vulkan) и Waifu2X (OpenCL)
реклама
Предисловие
Для чего я использую Waifu2X? В основном для чистки изображений от артефактов сжатия JPEG (и не только), именно для этого у меня целых 4 варианта DeNoise в контекстном меню, от самого "слабого", до самого агрессивного:
реклама
Чистка изображений от артефактов сжатия JPEG это хорошо, но Waifu2X уже не впечатляет в режиме увеличения, хотя при грамотном использовании делает работу гораздо лучше остальных сохраняя оригинал без искажений:
реклама
Так или иначе оба инструмента весьма полезны при условии грамотного использования.
Но есть важный нюанс, у Waifu2X и Real ESRGAN нет всего того, что у меня выделено на скриншотах, т.е. готовых "примеров" для работы с утилитами, чтобы пользователь взял и сразу же получил результат, нет, в исходном виде нужно через консоль вызвать справку, изучить всё досконально, и может быть что-то выйдет:
В итоге я решил сделать свои сборки на основе Waifu2X от DeadSix27 и Real ESRGAN ncnn Vulkan от xinntao, они в первую очередь мне самому нужны, ведь постоянно ковырять командную строку ради результата... Ну это такое себе занятие...
реклама
Впрочем, если бы разработчики доводили дело до логичного завершения, мне бы сейчас не приходилось их творения доводить до ума. Ещё я планировал сделать Waifu2X и Real ESRGAN простыми для использования не только в среде Windows, но и в среде Linux, но простите, может быть в другой раз, попросите у фанатиков Linux, может они осилят нечто аналогичное и исправно работающее независимо от дистрибутива...
Почему дистрибутивы Linux не способны конкурировать с Microsoft Windows
И да, обратите внимание, для Real ESRGAN и Waifu2X есть графические оболочки, обычно для Windows по очевидным причинам, просто если кто-то не знал:
-
--
---
Waifu2X (DeadSix27)
Внимание! Показанные в статье скрипты и код могут быть неактуальны! Я работаю не только над сборкой Waifu2X, но и над сборкой Real ESRGAN, актуальное состояние моей работы можно найти в репозитории Neuro, ссылки будут ближе к концу статьи. Если вам не интересны подробности работы над сборками, смело пропускайте статью почти до конца.
реклама
А теперь приступим, ведь нельзя просто взять, и сказать операционной системе "я хочу кнопку чтобы увеличивала"...
С чего же начать? Конечно с командной строки:
Эти же команды я использую и для управления инструментом Waifu2X, простая переменная %1 есть ничто иное как полный путь к файлу который нужно скормить инструменту.
А для вывода результата уже использую конструкцию %~d1%~p1, это означает букву диска (%~d1) и путь до файла без имени файла (%~p1), имя файла формировать нет необходимости, ибо это делает сама Waifu2X.
Таким образом есть BAT файл на который достаточно просто перетащить картинку, и она будет обработана, но это сойдет только для баловства, потому перейдем к контекстному меню проводника.
Изначально я просто добавлял пункты в контекстное меню проводника, для файлов и папок соответственно, но я крайне не советую такой подход, оно просто засоряет контекстное меню, так не следует делать:
Потом я переделал REG файл более адекватным образом, теперь команды расположены во вложенном контекстном меню:
Из чего же состоит команда для Waifu2X? Конечно же полный путь к исполняемому файлу waifu2x-converter, потом путь к моделям, далее "-c 2" задаёт уровень сжатия PNG, с более сильным уровнем сжатия много не выйдет сэкономить в размере файла, но времени будет потрачено много при сохранении изображения, потому использую быстрый уровень сжатия PNG.
@="C:\\_PORTABLE_\\waifu2x_533\\waifu2x-converter-cpp.exe
--model-dir C:\\_PORTABLE_\\waifu2x_533\\models_rgb -c 2 --block-size 768
--force-OpenCL -m noise --noise-level 0 -i \"%1\""
Аргумент "--block-size 768" задаёт размер блока для обработки, я выбрал значение которое эффективно работает как со слабыми видеокартами и процессорами, так и с производительными, чем производительнее видеокарта и больше памяти доступно, тем больше это значение можно задать для повышения эффективности работы.
Аргумент "--force-OpenCL" заставляет конвертер использовать только OpenCL, это помогает избежать проблем на платформах Intel, и проблем с CUDA на видеокартах от NVIDIA.
Всё равно CUDA работает едва быстрее OpenCL, всего на ~7%, а проблем бывает целый вагон и тележка рядом от использования CUDA, особенно при использовании "устаревших" по мнению NVIDIA видеокарт, потому форсирую OpenCL.
Далее "-m noise", это режим работы для подавления шума, команда "--noise-level 0" указывает силу подавления шума от 0 до 3, важно заметить, нулевой уровень практически никак не искажает оригинал, он максимально аккуратно подчищает артефакты сжатия JPEG, но если артефактов много, то "щадящий" режим может и не осилить это дело:
Потому уровень подавления шума следует использовать в зависимости от ситуации.
Так же можно задать параметр "-m scale" для увеличения размера изображения, и ещё увеличение с подавлением шума "-m noise-scale", но я не рекомендую использовать этот режим, гораздо лучше будет применять режимы noise и scale по отдельности в зависимости от того, какой нужен результат.
Ну и конечно же аргумент "-i" указывающий файл или папку для обработки.
В команде контекстного меню для одиночного файла я не применял параметр "-o" указывающий папку для размещения результата обработки, но в команде для обработки папки я данный параметр использую, ведь Waifu2X выдает результат туда же где находились исходные файлы предназначенные для обработки, потому при обработке одиночных файлов можно было забыть про аргумент "-o".
Но в случае обработки папки всё немного сложнее, ведь Waifu2X просто обработает папку, и все обработанные файлы будут в той же папке, которая была отправлена на обработку, а это очень неудобно, особенно если в папке тысячи файлов, они просто будут перемешаны между собой.
Потому для обработки папки следует указать исходный путь обрабатываемой папки, но при этом добавить дополнительный текст в имя папки.
@="cmd.exe /k \"C:\\_PORTABLE_\\waifu2x_533\\waifu2x-converter-cpp.exe
--model-dir C:\\_PORTABLE_\\waifu2x_533\\models_rgb
-r 1 -g 1 -f png -c 2 --block-size 768 --force-OpenCL -m noise --noise-level 0 -i \"%1\" -o \"%1 - result/\"\""
Думаю нет смысла продолжать расписывать про каждый нюанс и команду, иначе статья будет раздута примерами.
Перейдем сразу к практической стороне, в виде BAT файлов я сделал пригодные для проведения сравнительного тестирования шаблоны, в самом начале имени прописано CPU или GPU, далее идет режим работы, NOISE для подавления шума, и scale для увеличения.
Для видеокарт использование OpenCL форсировано, потому данные "заготовки" будут работать на любой видеокарте способной нормально работать с OpenCL, например GeForce 8500GT, GeForce GTX 570 и т.п., единственное оно не будет работать на Radeon HD 4870 и любых других картах серии HD 4000, ибо данным видеокартам от ATI не прикрутили нормально поддержку OpenCL, формально они вроде как умеют, а фактически не умеют.
В общем идём дальше.
Я тут сгенерировал небольшую картинку на скорую руку, она и выступит "примером", на скриншоте выше уже можно было заметить выделенный файл "EXAMPLE_3072x2048", но думаю для современных видеокарт нужно в более высоком разрешении сделать "пример".
Да, вот так гораздо лучше, набор образцов для тестирования собран, для слабых видеокарт и процессоров сойдет маленький размер, а для производительных видеокарт есть размеры побольше:
Осталось просто перетащить файл находящийся в папке с Waifu2X на подходящий "шаблон" в виде BAT, и можно смотреть на итоговую скорость обработки GFLOPS-Filter, конечно, рядом будет создан обработанный файл, но это обычно никак не мешает, а если мешает - придумайте сами как решить "проблему":
В любом случае BAT файлы непригодны для полноценного использования, они предназначены для тестирования производительности, а вот для обычной обработки файлов лучше использовать REG файл реестра Windows, чтобы добавить Waifu2X в контекстное меню, в моём случае это работает вот так:
Важно заметить, команды для контекстного меню в REG файле требуют чтобы Waifu2X находилась на системном диске в папке _PORTABLE_.
Это будет справедливо и для Real ESRGAN, просто у меня весь используемый портативный софт расположен именно на системном диске в папке _PORTABLE_, это удобно и практично для меня, если не по нраву такой подход - сделайте по своему, ничего против не имею.
На этом пожалуй закончу болтовню про нюансы.
-
--
---
Real-ESRGAN-ncnn-vulkan
Думаю не стоит расписывать каждый нюанс моей работы над сборкой Real ESRGAN, иначе выйдет ещё одна статья...
Принцип установки такой же как у Waifu2X, в корне системного диска есть папка _PORTABLE_, а в ней уже папка с Real ESRGAN.
Файл "_context_sub.reg" добавляет команды в контекстное меню Windows, файл "_context_sub_delete.reg" соответственно удаляет команды из контекстном меню.
Можно обработать не только один файл, но и папку с изображениями, главное чтобы в папке не было посторонних файлов кроме изображений.
И да, я специально не стал ограничивать контекстное меню файлами JPG, PNG и прочими указывающими на изображения, просто это усложнит работу с REG файлом, я и так прекрасно понимаю, что пихать BIN файл бессмысленно в Waifu2X или Real ESRGAN.
Но опять же, я никому не запрещаю сделать по своему, мне пока не мешает никак "лишний" пункт при вызове контекстного меню для TXT файлов, может быть в будущем и переделаю, но пока это не приоритет для меня.
Конечно BAT файлы для тестирования производительности тоже создал:
Так как Real ESRGAN не подсчитывает затраченное время на работу мне пришлось самому это дело реализовать...
Конечно, результат не очень точный, ведь сжатие файла в PNG тоже занимает некоторое время, потому формат вывода был впоследствии изменён на JPG, ибо он быстрее работает чем PNG, но даже так сжатие результата влияет на результаты тестирования, потому этот вариант бенчмарка не может показать абсолютно чистую производительность видеокарты.
А ещё Real ESRGAN не способен сам формировать имя обработанного файла, и не умеет сам создавать каталоги при пакетной обработке картинок в папке, потому и это мне пришлось самому реализовывать...
Waifu2X от DeadSix27 намного более развит в этом плане, но ничего, и Real ESRGAN NCNN теперь можно адекватно использовать без лишнего геморроя на голову.
-
--
---
Использование
Даже если я переустановлю Windows, или мне нужно будет на другой ПК перенести утилиты, я всегда могу одним кликом провести слияние REG файла и у меня будет контекстное меню для работы с изображениями:
Вот так собственно и выглядит работа через контекстное меню, ничего сложного, просто две кнопки мышью нажать, что может быть проще? Метод с терминалом из богатой фантазии фанатиков Linux?
Конечно и для тестирования производительности можно применить мои сборки, достаточно просто перетащить изображение на соответствующий BAT файл, напоминаю что точный результат (GFLOPS-Filter) может показать только Waifu2X, а Real ESRGAN не имеет встроенного бенчмарка, потому его результаты лишь приблизительные:
Собственно и всё, больше тут нечего добавить.
-
--
---
Тесты производительности
Думаю будет неплохо добавить немного своих результатов по скорости обработки изображений.
Для видеокарты я буду использовать пример с разрешением 3072x2048, а для процессора уже пример с разрешением 768x512, ибо производительность Ryzen 7 2700X значительно ниже, просто нет смысла кормить процессор изображением в большом разрешении, точность результатов от этого выше не станет, а времени будет потрачено много.
В итоге Ryzen 7 2700X достигает максимальной скорости при размере блока 1024, а скорость всего в районе ~268 ГФЛОПС, что довольно немного.
Конечно, чем больше размер блока, тем эффективнее идет обработка, но не стоит забывать, что это так же увеличивает количество занимаемой памяти во время обработки, да и рост производительности не будет бесконечен.
Для видеокарты я не буду тестировать noise режим, сразу перейду к более сложному scale и возьму в качестве исходных данных "EXAMPLE_3072x2048.jpeg".
Важно заметить, при размере блока в 2048 на видеокарте было занято около ~4 ГБ памяти для работы Waifu2X, потому увеличение размера блока порой может быть нецелесообразным по причине большого потребления памяти.
Так или иначе максимальная производительность с MSI GeForce GTX 1070 AERO OC была достигнута при размере блока 2048, хотя задавать размер блока больше 1024 смысла нет, рост производительности незначительный, а вот памяти сжирает весьма ощутимо.
В итоге моя GTX 1070 выполняет работу в ~10 раз быстрее чем Ryzen 7 2700X, хотя процессоры на архитектуре Zen2/Zen3 в разы быстрее чем старый R7 2700x, и над Ryzen 7 3700X у GTX 1070 не будет такого преимущества как над 2700X, потому если видеокарта из разряда "затычка в слоте", то использование процессора для обработки изображений может быть не такой уж и плохой идеей.
А теперь перейдем к Real ESRGAN ncnn vulkan, ясное дело проводить тесты буду только с видеокартой, ибо для работы использован Vulkan API.
Сначала использовал модель для увеличения изображений в стиле аниме, это лёгкая модель, и на увеличение файла "EXAMPLE_768x512.jpeg" потребовалось ~2.7 секунды.
С увеличением размера плоскости (Tile) возрастало количество занятой памяти, при размере 1024 у GTX 1070 едва хватило 8 ГБ памяти для обработки изображения... А ещё увеличение размера плоскости в данном случае может негативно повлиять на производительность.
При использовании реалистичной модели увеличения потребление памяти такое же безумное, но в отличие от аниме модели, здесь увеличение размера поверхности уже повышает скорость обработки, конечно пока хватает памяти на видеокарте... В итоге работа была сделана за ~6.4 секунды при "Tile 512", и за ~6.8 секунд при автоматическом выборе размера "поверхности".
-
--
---
Репозитории
Здесь я оставлю ссылку на репозиторий с готовыми для использования сборками.
Репозиторий Neuro: ( https://github.com/Shedou/Neuro ).
В репозитории Neuro расположены возможно полезные файлы для Real ESRGAN и Waifu2X, там же в разделе Releases есть и готовые для использования сборки, при этом время от времени могут выходить обновления с различными исправлениями и улучшениями, потому информация на скриншотах здесь может быть неактуальна:
Далее оставлю ссылки на репозитории Real ESRGAN и Waifu2X, на их основе были созданы мои сборки:
Waifu2X CPP: ( https://github.com/DeadSix27/waifu2x-converter-cpp ).
Real ESRGAN: ( https://github.com/xinntao/Real-ESRGAN ).
Real-ESRGAN-ncnn-vulkan: ( https://github.com/xinntao/Real-ESRGAN-ncnn-vulkan )
-
--
---
Заключение
Пожалуй пора заканчивать, теперь обработка изображения требует всего двух нажатий мышью, я уже не знаю как это можно сделать проще чем в 2 клика мышью:
Впрочем, кто сказал что комбинировать результаты работы Waifu2X и Real ESRGAN это плохая идея?
А если нужно обработать целую пачку изображений? Да ничего сложного! Главное чтобы в папке не было никаких посторонних файлов кроме изображений, иначе Waifu2X или Real ESRGAN могут подавиться.
И если нужно будет перенести эти инструменты на другой ПК с Windows... У меня точно с этим проблем не возникнет, ведь сборку достаточно распаковать в корень системного диска.
А для удобства работы через контекстное меню достаточно просто использовать заранее подготовленные REG файлы, а если нужно убрать, то всегда есть REG файл для удаления созданных разделов в реестре, чистота и порядок, простота и удобство, вот какими на самом деле должны быть UX/UI, чтобы пользователь при минимальных телодвижениях получал максимальный результат!
Вообще текущие мои сборки не идеальны, в будущем наверняка ещё выйдут исправления и доработки, но если не игнорировать наглухо актуальные инструкции в репозитории Neuro, то значительных проблем быть не должно при использовании.
Я бы хотел конечно и для Linux подобное сделать, но фанатики меня постоянно пытаются оскорбить и посылают на Windows, что я могу сказать, пусть мастурбируют на свой любимый терминал хоть до посинения...
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.
реклама
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила