Я создатель статьи про реставрацию Том и Джерри в 1440p. И вот, спустя более чем полгода, я снова горю желанием поделиться с вами моими новоприобретёнными знаниями. Статья разделена на две части: интересную для большинства и сугубо техническую, хоть и очень разжёванную, как раз по теме заголовка статьи.
На данный момент присутствуют всего 3 популярные утилиты с разнообразными моделями апскейлинга. Это продукты компании Topaz Labs — Topaz Video AI и Topaz Gigapixel. И отдельный проект с открытым кодом — ChaiNNer. С продуктами Topaz Labs, я уверен, знакомы многие. В них представлены самые популярные среди большинства пользователей и профессионалов инструменты. Это Artemis, который умеет работать с сильно повреждёнными видео, в области устранения артефактов кодирования и низкого разрешения. Iris, нацеленный на отличную работу по восстановлению лиц на видео. Gaia, которая работает в области повышения качества анимации. Proteus — общее повышение качества видео. Topaz Gigapixel же просто работает хорошо в общем понимании. Однако у всего этого есть значительные минусы, точнее, общий жирный минус — все они даже и близко не считаются ультимативными в вопросе реставрации видео, скорее отдельные инструменты, как я их ранее и назвал. У одного чёткость плашает, но деталей на картинке прибавляется, у другого образуются «лесенки» на неидеальном исходном видео, третий же хорошо работает с повышением чёткости людей, но задний фон — это отдельный вид пытки. Ну и в целом Topaz Video AI практически никак не подходит для 2D материала.
Переходим к слону в комнате — большинству неизвестный, ChaiNNer. Сам по себе это не самостоятельный продукт. Он не имеет встроенных нейросетей для апскейла, а только интерфейс для взаимодействия с ними. Это графический интерфейс обработки изображений на основе узлов (или плиток), предназначенный для упрощения и настройки цепочки задач обработки изображений, с полностью открытым исходным кодом программы. Все интересующие нас модели для апскейлинга находятся на сайте openmodeldb.info. Проще говоря, проект ChaiNNer взял на себя задачу уместить в одном интерфейсе без командной строки, весь зоопарк моделей апскейлинга из свободного доступа. А также имеет огромнейший функционал по изменению видео во всех аспектах. Но не будем углубляться в техническую часть того, как это работает, а сразу после примера связки перейдём к тому, что из себя представляют эти самые бесплатные модели апскейлинга.
BleedOut
Очевидно модель созданная на датасете VHS рипов в сравнении с Blu-ray изданиями. Она отлично справляется с очень больной темой — ореолы на изображении. Но также может с высокой точностью, предугадывать необходимую насыщенность отдельных участков изображения.
BroadcastToStudio Lite
«Непосредственно устраняет такие дефекты, как размытие цветности, эффект бегущих точек и радужные артефакты. Настоятельно рекомендуется предварительно удалить эффект ореола в вашем любимом видеоредакторе, так как модель не исправляет этот дефект и может сделать существующие ореолы более заметными.»
Как раз здесь уже видна прямая взаимосвязь с тем, чем является ChaiNNer. Можно ведь не заниматься ручным трудом, а использовать модель, которую я показал ранее, а затем передать информацию этому апскейлеру. Особенно актуально, если материала слишком много.
RealESR AnimeVideo v3
Есть и апскейлеры, предлагающие комплексное решение. Это одна из основных моделей для апскейла любого контента с разрешением 480–560p. Модель обеспечивает лучшую естественность, меньше артефактов, точное воспроизведение оригинальных цветов, восстановление текстур и фона и т.д. Однако она может быть использована только на контенте, который уже обладает относительно хорошим качеством, с минимальным количеством артефактов, особенно специфических. На выходе изображение сохраняет естественность оригинала, но при этом выглядит в разы лучше.
Существуют апскейлеры, которые больше предназначены для стилизации изображения, как, например, этот. Он был обучен на датасете, состоящем из Blu-ray изданий очень высокого качества. Помимо значительного повышения разрешения в два раза, добавляется характерный шум, который может многим понравится, так и нет.
Вы уже смекаете, к чему всё идёт? Действительно, ChaiNNer напрямую иллюстрирует свою основную задачу — лёгкое построение chain'ов (связок), на выходе из которых можно получить совершенно другой результат, иногда просто поразительный, благодаря этому огромному зоопарку моделей апскейлеров в openmodeldb.info, всего на ресурсе их больше 600. Нужно только время для экспериментов с вашим конкретным образцом видео. Вы можете просто обрезать 5-секундный отрывок видео и прогонять его через разные апскейлеры и их связки. Не знаю как, но я не нашел нужный мне апскейлер, что и побудило меня изучать эту тему и написать статью. В конце статьи я подробно описал мой первый апскейлер, который создал сам, и приложил таблицу, составленную специально для статьи. В этой таблице я собрал множество полезных апскейлеров для разных ситуаций, которыми сам регулярно пользуюсь. А если вы для себя что-то не найдёте, то можете попытать удачу в поисках на openmodeldb.info, предварительно выбрав только модели архитектур (скоро объясню, что значат эти обозначения) Compact, Real-ESRGAN(+) и SPAN. А когда захотите заняться апскейлом только изображений, то тут вам разгуляться место очень много, всякого специфичного просто валом, и вы не ограничены стандартным набором лёгковесных моделей, как в случае с видео.
Ещё необходимо отметить, что если вы решитесь заняться этим делом, у вас должна быть видеокарта от Nvidia с CUDA-ядрами, либо вы должны разбираться в том, как заставить вашу красную видеокарту работать с прослойкой ROCm. Наиболее просто это сделать на ОС Linux, но и на Windows тоже можно, хотя гайдов немного, и официальная поддержка начинается только с RX 6800 XT. Я настоятельно не рекомендую пытаться этим заниматься тем, кто не знаком с работой с GitHub и ранее не пытался это реализовать. Вы будете долго блуждать по Reddit, пытаясь понять, как это реализовать для вашей видеокарты, даже на Linux, где корни ROCm и поддержка есть даже для RX 400-й серии.
Real-ESRGAN: Enhanced Super-Resolution Generative Adversarial Network или 'Улучшенная сеть для сверхразрешения' — это архитектура нейросети. У неё несколько предков: SRGAN и GAN. Сама нейросеть может обучаться как на синтетических данных, так и на реальных. Real-ESRGAN Compact, который будет рассмотрен позже, не является полноценной новой архитектурой, а только облегченной версией Real-ESRGAN.
Ультимативным в своей скорости выполнения и эффекте на итоговые результаты является Real-ESRGAN Compact, хотя он не единственный в этой области. Помимо него, кроме прямых конкурентов, таких как SPAN и сам ESRGAN, есть и те, что больше нацелены на простые изображения, а не видео. Проблема состоит в том, что только обозначенные ранее архитектуры апскейлинга обладают высокой скоростью выполнения, около 0.15-0.4 секунд в среднем на кадр, в зависимости от разрешения видео, и очень редко около 1-2 секунды на кадр (цифры относительно скорости выполнения на RX 6600). Всё остальное же работает значительно медленнее: со стороны 3 секунды на апскейл одного изображения кажутся не таким уж большим промежутком времени, но это выливается в то, что на 1 минуту в 24 кадра в секунду вам понадобится больше часа. Здесь уж либо покупаем 3090, либо отказываемся от идеи.
Итак, основная тема. Из самого поражающего воображение и превосходящего, вероятно, любые апскейлеры изображений — DAT: Двойной агрегирующий преобразователь для получения изображений с высоким разрешением. С точки зрения схемы конвейера преобразования изображения это очень сложная архитектура. Но нам, как потребителям, важен результат. И это нечто космическое. На данном примере этот апскейлер можно сравнить с чем-то вроде рентгена.
Начать стоит с технических характеристик вашей видеокарты. Во-первых, на видеокартах AMD можно запустить обучение апскейлера, но это непросто — нужен ROCm. Вам также нужно исследовать Reddit, видео на YouTube и активно юзать Google, если у вас нет человека, который может помочь. На картах от NVIDIA таких проблем нет. Во-вторых, сколько у вас видеопамяти? 4 ГБ — это откровенно говоря, очень-очень скудно; апскейлер может получиться крайне неэффективным при сколь-либо комплексности. От 8 ГБ уже можно что-то делать, хотя этого всё равно немного. 12+ ГБ — это идеал. Я свой апскейлер обучал на своей RX 6600 8 ГБ, и это заняло около 3 дней работы видеокарты на половинной точности, что обычно встречается реже, но для меня этого хватило. Если вас увлечёт эта идея создать свой апскейлер, вполне можно арендовать мощности виртуального сервера с акцентом на GPU. Лично мне понадобилось около пяти попыток, прежде чем я смог создать наиболее эффективный датасет, и получить апскейлер с тем эффектом, который хотел изначально. Это заняло 15 дней непрерывной работы видеокарты, и это ещё при условии, что я обучал модель без масштабирования изображения. Кроме того, больший объем видеопамяти способствует не только увеличению скорости, но и косвенно улучшению качества обучения. Чем больше буфер, тем стабильнее будет градиент. Если изображений в буфере недостаточно, градиент может стать 'шумным', что усложнит обучение модели и может привести к 'плавующему' результату на выходе. Также стоит упомянуть увеличение количества признаков и свёрточных слоёв, что приводит к значительному улучшению качества модели, поскольку чем больше эти значения, тем лучше становится точность предсказаний за меньшее количество времени обучения.
Представление логики обучения апскейлера в очень простом виде: Нейросети показывают сначала одну картинку, как исходную, а затем говорят, чтобы они из неё сделали другую картинку — итоговую. Например, на первой картинке может быть огромная куча клякс, а вторая картинка — это точно такая же картинка, но без клякс. И так, если у вас будет достаточно большой набор таких картинок и времени для обучения нейросети с помощью видеокарты, то в итоге нейросеть научится настолько хорошо предугадывать пиксели и строить взаимосвязи, что вы даже не поймёте, что раньше на этом изображении были кляксы.
1. Сборка собственного датасета. В данном случае речь идет либо о парных картинках в низком и высоком разрешении, либо о наборе картинок в высоком разрешении. Сначала разберем второй вариант, так как он самый простой. Существует аугментация данных — процесс искусственного генерирования новых данных на основе существующих. В контексте создания апскейлера изображений это означает, что вы можете искусственно ухудшить исходное изображение: уменьшить разрешение в 2-4 раза, добавить шум, размытие и прочее. В итоге вы можете получить что-то вроде AnimeVideoV3. Но если подойти к этому комплексно, можно создать что-то особенное, как 2xken-v1-eva-01. Самый простой метод аугментации данных — это воспользоваться инструментами внутри ChaiNNer.
Перейдём к первому варианту. Для этого нам нужно иметь 2 одинаковых материала в разном качестве и с одинаковой геометрией, то есть абсолютно все объекты и их пропорции должны быть идентичны на обоих изображениях, а само качество изображений может быть разным. Соответственно, вы должны вручную их подогнать друг к другу. Чтобы этого достичь, вам либо нужно иметь, условно Blu-ray версию мультика/фильма/аниме и версию более худшего качества — это может быть VHS-запись, DVD-версия и т.п. И сразу хочу предостеречь вас от использования апскейлеров для ваших изображений в высоком качестве, как известно, если нейросеть обучается на данных, сгенерированных нейросетью — качество итогового результата стремительно падает, я это понял даже на собственном примере. Вместо этого лучше обойтись ручными методами и алгоритмами. По типу устранения шума Neat Video, или исправление контрастности изображения, цветов, чёткости... инструментов куча, главное — желание их искать.
Но можно обойтись и только плохой версией материала. Тогда от вас требуется вручную исправить каждый кадр разбитого видео, например, захотели вы сделать свой апскейлер, который будет стирать все царапины и точки со скана плёнки. Вы открываете Gimp или Photoshop и просто обводите каждую из них, и делаете умную заливку или лечение выделенной зоны. И да, при достаточном объёме датасета и итераций обучения, это реально будет работать и он почти не будет ошибаться, несмотря на, как кажется — почти не поддающееся логике расположение этих точек. Прямой тому пример — «Sudo Inpaint PartialConv2D». То из чего и с помощью чего вы будете делать свой апскейлер — сугубо зависит от поставленной перед вами задачи.
Обозначим основные правила:
Нельзя ни при каких условиях нарушать геометрию, иначе это повлечёт за собой ненужную нагрузку на апскейлер, а также в общем ухудшит качество.
Нельзя облегчать себе задачу использованием других нейросетей.
Нужно брать разные кадры. Если этого не делать, то апскейлер переобучится и будет хорошо апскейлить только материал, очень близкий к тому, что был в наборе данных, без минимальных отхождений от него.
Количество картинок в датасте.
Ответ весьма прост. Чем больше — тем лучше. Разнообразие кадров очень обязательно, в противном случае апскейлер будет сам создавать артефакты. Если у вас стоит задача сделать условно универсальный апскейлер, который и артефакты уберёт, и шум подавит, и прочее, то количество обучаемых данных может достигать 10.000+ изображений. Практически всегда это исключительно аугментация данных из-за столь большого желаемого объема данных. Если ваша задача устранять что-то специфичное, как «лесенки» на изображении, специфичный засвет всего изображения, или вы хотите преобразовать* изображение из носителя laser-disc в DVD качество (хотя бы), то ваш полёт — это около 2000-3000 изображений для апскейлера с множителем 1, хотя при исключительно ручной обработке можно обойтись и 200 изображениями, но тут никто гарантий не даёт, наиболее вероятно, что это не сработает в комплексном апскейлере. Я видел только 2 успешных примера подобного подхода с стабильным результатом. Dotzilla Compact и PixelSharpen.
Если вы хотите также повышать разрешение в 2 раза, то уже желательно хотя бы 4000 изображений, а лучше 5000-6000. Созданием же апскейлера с увеличением изображения в 4 раза, по разумным причинам, лучше не заниматься, вы вряд ли когда-то соберёте настолько большой набор данных специфичных изображений.
Как разбить видео на кучу изображений.
Вы можете воспользоваться FFmpeg. Пример такой команды: ffmpeg -i input.mp4 -vf "select='not(mod(n,375))',setpts=N/FRAME_RATE/TB" -vsync vfr output_%03d.png
Параметр "375" можно изменять в большую или меньшую сторону. Он означает, что кадр будет извлекаться каждые 375 кадров.ffmpeg -i input.mp4 -vf "select='eq(n,0)+eq(n,375)+eq(n,750)+eq(n,1125)+eq(n,1500)+eq(n,1875)+eq(n,2250)+eq(n,2625)+eq(n,3000)+eq(n,3375)+eq(n,3750)+eq(n,4125)+eq(n,4500)+eq(n,4875)+eq(n,5250)+eq(n,5625)+eq(n,6000)+eq(n,6375)+eq(n,6750)+eq(n,7125)+eq(n,7500)+eq(n,7875)+eq(n,8250)+eq(n,8625)',setpts=N/FRAME_RATE/TB" -vsync vfr output_%03d.png
Эта команда будет извлекать только определенные кадры из видео. Может пригодиться, если в видео встречаются переходы с чёрным фоном в определённые моменты или другие кадры, которые в большинстве случаев не подходят для обучения нейросети.
С большой вероятностью в интернете можно найти множество софта, который выполняет это без командной строки и автоматически для множества файлов. Ну а пользователи Linux могут просто воспользоваться циклом for для всех видео в текущей директории.
2. Настройка конфигурационного файла обучения модели. Здесь всё довольно просто. Мой пример конфигурационного файла находится здесь, но он, несомненно, нуждается в дополнительной настройке в зависимости от ваших задач и имеющихся мощностей. А тут всевозможные пояснения и в том числе все параметры аугментации данных. Аугментация данных полезна также в режиме парных изображений, но только если вы не переборщите с ней, что может наоборот навредить вашей модели. Как, например, добавление искусственного шума (около 40% по стандарту) поверх механического шума, который ваша модель как раз должна устранить. В таком случае высока вероятность, что модель научится не устранять механический шум, а его комбинацию с искусственным. Но его всё равно можно было бы добавить в таком сценарии, буквально немного (около 10%), и так держа баланс, модель наоборот, стала бы ещё лучше устранять механический шум. Точно такая же ситуация со всеми остальными параметрами аугментации данных. Какие-то целесообразно использовать в конкретном сценарии, а какие-то — нет. Разумно будет посовещаться по этому вопросу с каким-нибудь Chat GPT, дабы правильно подобрать методы именно для ваших входных данных и желаемого результата.
3. Установка Real-ESRGAN. В целом все основные шаги прописаны тут, нужно просто вбить их в Powershell или терминал и иметь установленными программы, которые были указаны по ссылке. Команда же для запуска обучения может выглядеть так: python /путь/до/вашего/установленного_репозитория_Real-ESRGAN/realesrgan/train.py -opt путь/до/вашего/конфигурационного_файла.yml --auto_resume
«--auto-resume» означает, что при повторном запуске скрипт сам найдет последнее сохранение, если оно есть. А оно будет лежать в папке experiments.
В ходе моего недавнего проекта я вручную обработал 124 серии из разных мультфильмов в качестве Blu-ray с помощью алгоритма устранения шума (Neat Video). В результате я создал датасет изображений до и после устранения механического шума с картинки в высоком качестве. После нескольких попыток обучения у меня получился рабочий вариант, и теперь вместо утомительной ручной работы процесс выполняется автоматически. Я выложил три версии апскейлера в своём GitHub-репозитории и на сайте openmodeldb.info.
Кроме того, я подготовил для вас таблицу с апскейлерами, которые отобрал из более сотни вариантов на самых быстрых архитектурах. Конечно, это не идеальный список, но здесь собрано всё самое достойное из того, что мне приходилось использовать.
У меня появился бусти, буду рад любой поддержке.
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud - в нашем Telegram-канале ↩