
В прошлых статьях я разбирал основы апскейлинга дома и сходил с ума, вырезая закадровый смех из «Скуби-Ду». Тот опыт привёл меня к выводу: существующие инструменты, будь то плагины вроде NeatVideo или комбайны типа Topaz Video AI — это «чёрные ящики». У них ограниченный набор настроек, и они часто пасуют перед специфическими задачами старой анимации.
В этот раз я пошёл от обратного. Сразу снижу градус ожиданий: это любительский эксперимент. Мы сильно ограничены в мощности GPU (в наличии только RTX 4060 Ti), из-за чего натренировать реально точную, тяжелую нейросеть-универсала возможности нет.
Поэтому вместо гонки за идеальными метриками я сосредоточился на «неудобных» проблемах. Я написал симулятор уничтожения плёнки, чтобы научить легкую модель понимать физику конкретных дефектов: от сдвига эмульсии до химических ожогов и растяжения плёнки кинопроектором.
Спойлер: на это ушло 2 месяца и 2 миллиона итераций. Получилась не «волшебная кнопка», а набор узкоспециализированных инструментов.
Техническое вступление: Что под капотом?
Прежде чем переходить к истории обучения, давайте определимся с инструментом.

Архитектура: Real-ESRGAN Compact.
Если вы качали готовые модели для апскейла, вы могли видеть файлы с пометкой realesrgan-x4plus. Это тяжёлые модели на базе RRDBNet. Я же выбрал их младшего брата.

Почему Compact?
Скорость. Это легковесная архитектура. Она работает в разы быстрее стандартных трансформеров (SwinIR) или тяжёлых ResNet-ов.
Конфигурация
48nf16nc: Это означает, что у модели 48 фильтров и 16 свёрточных слоёв. Для сравнения: «большие» модели обычно имеют 64 фильтра и 23 блока. В моём случае я ограничен видеокартой RTX 4060 Ti 16 Гб.
В чём главный прикол?
Обычно ESRGAN используют для апскейла (увеличения разрешения в 2 или 4 раза). Нейросеть берёт 1 пиксель и придумывает вокруг него 3 новых.
Я использую «апскейл» 1 к 1.

Я не прошу модель увеличивать картинку. Я скармливаю ей кадр 1080p и прошу вернуть те же 1080p.
В чём суть: Вместо того, чтобы тратить ресурсы на придумывание новых пикселей для увеличения, вся мощь генеративной сети уходит на перерисовку текущих пикселей. В этот момент классический апскейлер превращается в продвинутый денойзер: он не «сглаживает» шум (как простые математические денойзеры), он заново генерирует участок изображения, опираясь на то, что имел на входе.
Важно сразу оговориться: это сугубо энтузиастский, «гаражный» эксперимент. Мы тут не тренируем конкурента SORA 3 на кластере из GB200. В моём распоряжении лишь домашняя RTX 4060 Ti.
Это накладывает жесточайшие ограничения. Натренировать на таком железе действительно глубокую, тяжелую и математически точную нейросеть (которая могла бы тягаться с топами по метрикам) физически невозможно — на это ушли бы годы. Поэтому я не гнался за идеальным восстановлением каждого пикселя, а сделал ставку на скорость и решение специфических проблем, которые игнорируют другие.
Зачем? Разве нет готовых решений?
Безусловно, они есть. Но существующие денойзеры (как классические математические, так и современные нейросетевые) имеют фундаментальные недостатки при работе с классическим целлулоидом (плёнкой).
1. NeatVideo — мощный комбайн, но требует от пользователя огромнейшего опыта. Не все дефекты убитой временем плёнки можно описать его алгоритмами. Чуть перекрутил настройки — получил «мыло» на фонах. Недокрутил — шум ушёл, но Джерри на заднем плане оброс шипами-артефактами по 20 пикселей во все стороны.

Так и сам интерфейс сложный. Я потратил на приобретение навыков уровня «полупрофессионал» больше 30 часов практики, без учёта времени обработки видео после.

2. DRUNet — отличная нейросеть, но она работает условно «математически», не понимая контекста. По моим наблюдениям, у неё есть только понятия «контур» и «фон».
Она может идеально вычистить мелкий цифровой шум, но оставить эффект «пыли». Это крупные артефакты в 5–10 пикселей — наследие «копий с копий» (позитивов и интерпозитивов). При каждом тиражировании фильма для кинотеатров зерно на плёнке неизбежно множилось.
Она не знает, что делать с горизонтальными линиями от растяжения плёнки.
На MPEG-артефактах она часто частично ломается.

Для справки: SCUNet
Это мощная гибридная архитектура (смесь трансформера и CNN), которая работает точнее DRUNet. Но это «тяжеловес»: SCUNet в два раза медленнее DRUNet, тогда как моя модель — в два раза быстрее. Из-за такой пропасти в скорости и слож��ости запуска он просто выпадает из нашей лиги.
3. Archivist (Мой проект)
Я не пытался создать «убийцу NeatVideo» или «убийцу DRUNet». Мой инструмент — это скорее «Mini-NeatVideo++».
Mini, потому что он проигрывает в точности на сложных паттернах. Из-за архитектуры
48nf16ncу модели ограниченное поле зрения. Условно, если персонаж носит рубашку в мелкую клетку «светло-тёмным на тёмном» с тонкими линиями (2–3 пикселя), она может принять узор за царапины или особый паттерн зерна и удалить их. NeatVideo работает по иным принципам и с такой проблемой вряд ли бы столкнулся.++, потому что он имеет встроенные «плагины» для того, с чем не справляются другие: удаление линий растяжения, High ISO зёрна от сканеров и крупного мусора.
Но в большинстве случаев он выигрывает за счёт обученного распознавания паттернов. Утрированно: там, где обычный математический денойзер видит «резкий контраст» (и либо размывает его, принимая за шум, либо оставляет, принимая за деталь), нейросеть «узнаёт» знакомый ей характер зерна или царапины и реконструирует этот участок, фактически перерисовывая его заново на основе выученных весов.
Акт 1: Ловушка «Идеального» Датасета
Моя первая попытка была в 2024 году, тогда обучение началось с классической ошибки. Я взял 1024 пары кадров, где в качестве эталона (GT) использовал результат прогона через NeatVideo.
Проблема «Гало» и цвета
NeatVideo часто немного меняет геометрию объектов и цветовую палитру картинки. А также я сам, не особенно вникая в процесс, пытался «улучшить» выходной результат, хотя даже не умел правильно вытащить кадры из видео, из-за чего зерно выглядит, как jpeg, и отличается от настоящего.

Модель, обучаясь на этом, внезапно начала рисовать ореолы. А настройки l1_gt_usm: true (повышение резкости) в конфиге, которые должны были «бесплатно» помогать, лишь усилили эту неочевидную тягу к созданию ореолов.

В итоге модель научилась делать изображение чрезмерно резким, добавляя светящиеся контуры и геометрические искажения. Принцип «мусор на входе — мусор на выходе» сработал безотказно.

Решение: Смена парадигмы (Ломать — не строить)
Я упёрся в тупик: найти идеальную пару «Грязный кадр — Чистый кадр» в реальности невозможно. Любая обработка NeatVideo или DRUNet оставляет следы, и нейросеть учится их повторять.
Я решил посмотреть проблему в профиль: вместо попыток очистить убитую плёнку для датасета, нужно брать качественные Blu-ray исходники и искусственно их состаривать.

Почему нам плевать на геометрию?
Чтобы получить «Эталон» (Ground Truth), я прогонял Blu-ray кадры через агрессивную связку DRUNet + Bandage Smooth + sudo-RealESRGAN. Это вычищает всё до блеска, но иногда немного «плавит» геометрию и контуры.

В контексте реставрации это был бы брак. Но для обучения нейросети — это не баг, а фича (в теории).
Мы берём этот «поплывший», но стерильный кадр как Эталон.
На него же накладываем зерно и грязь для Входа.
Нейросеть видит, что геометрия на Входе и Эталоне одинаково слегка кривая в деталях. Единственная разница между ними — шум. Поэтому сеть игнорирует искажения форм и фокусируется исключительно на задаче: «как превратить эту кашу из зёрен обратно в чистую картинку».
Так у меня появились идеальные «чистые» данные. Осталось самое сложное — научиться правдоподобно их портить.
Акт 2: Project Degrader — Симулятор износа
Главная проблема стандартных датасетов — использование простого Гауссова шума (утрированно). Но реальная плёнка стареет иначе.
Эволюция хаоса
Сначала я базово наложил самый обычный цветной шум. Модель научилась идеально чистить «цифру», но пасовала перед реальной плёнкой. Пришлось заняться анализом сканов:
На глубоком чёрном зерна почти нет (нужна маска по яркости).
Зерно — это не пиксели, а «хлопья» определённых оттенков.
Слабое звено (Синий): В нормальном состоянии на плёнке всегда больше всего шумит синий канал — так устроены светочувствительные слои.

С ИИ процесс пошёл ещё глубже: пытаясь заставить модель «понимать» дефекты, я сам узнавал, как именно деградирует старая плёнка. Например, выяснилось, что к естественному зерну синего канала со временем добавляется «химический шум» в красном. Это происходит из-за того, что голубой краситель — циановый слой, отвечающий за красный канал — в архивах выцветает и разрушается быстрее остальных.
В общем, тема очень и очень глубокая, а не банальный «шум из точек».
Так, скрипт усложнялся, количество параметров перевалило за 20. Стало слишком сложно настраивать это чисто в виде текста, и я написал Project Degrader — GUI-приложение на Python (PyQt6) для процедурной генерации устаревания плёнки.

P. S.: Свечку не держал, специалистом по плёнке не являюсь, так что в алгоритмах наверняка есть неверные выводы и предубеждения в какой-то степени. Я чистый энтузиаст.
Чему модель научилась благодаря этому софту:
Кризис: Геометрическая деформация изображения, имитирующая растяжение плёнки проектором.
Умные царапины: Кривые Безье и «волоски», а не прямые линии.
Химия: Пятна, выцветание, высокий ISO шум.
MPEG-деблокинг: Очистка от квадратов сжатия и цифрового «звона» вокруг линий.
Прочее...: Устранение Mpeg-блочности, поиск контуров под мусором...

# Фрагмент конвейера генерации
pipeline_steps = [
TextureTrapStep(...), # Ловушки текстур
CreaseStep(...), # Геометрические складки
EmulsionShiftStep(...), # Сдвиг каналов RGB
DebrisStep(...), # Мусор
ScratchesStep(...), # Царапины
EmulsionDegradationStep(...) # Хим. деградация
# ...
]Акт 3: Битва с «мылом» и нейросетевая «ипохондрия»
Имея качественные данные, я запустил обучение. И снова провал.
Попытка №1 (Мыло):
Произошёл сговор внутри нейросети. Генератор (рисующая часть) понял: «Если я просто размою картинку, математическая ошибка будет ниже, чем если я попытаюсь нарисовать деталь и промахнусь на пару пикселей». Дискриминатор (проверяющая часть) согласился. В итоге вместо реставрации я получил идеально размытые пятна.

Попытка №2 (Инвертированное мыло):
Я сменил Дискриминатор на VGGStyle и выкрутил GAN Loss. Контуры стали резкими, но текстуры внутри объектов исчезли. Плюс пошли галлюцинации (кирпичная кладка на траве). Более того, обучение шло в 2–3 раза дольше, чем при использовании стандартного UNetDiscriminatorSN.
Вывод: Откат обратно.
Попытка №104324 («Ипохондрия»):
В сгенерированном датасете было слишком много мелких пятен (вероятность 40–80%). Модель получила «профессиональную деформацию» и начала лечить всё, что «совпадало по паттерну».

Попытка №##### (Буллинг):
Дискриминатор забулил Генератор. Дискриминатор абсурдно легко отличал фальшивку от оригинала. В итоге Генератор перестал получать полезную информацию: любое его улучшение меняло уверенность «судьи» лишь на ничтожные 0,0001% и возвращалось обратно на следующем же шаге Дискриминатора. Чтобы такой казус не произошёл вновь, потребовалось снизить максимальное значение «уверенности» Дискриминатора до 90%, чтобы его штрафовали за «рубание топором».
Решение:
Перебалансировка датасета по принципу MoE (Mixture of Experts) — архитектуры с набором экспертов.
10% — простые случаи.
30% — средние.
60% — сложные.
Мы ограничили возможность нейросети «схитрить». Ей приходится одновременно решать задачу по очистке шума и по сохранению детализации. На простых примерах мы требуем идеальной точности, а на сложных — «хоть как-то найти детали, но постарайся без галлюцинаций». Ей предстоял сложный поиск золотой середины.
Акт 4: Финал и специализация моделей
К 450 000 итерации стало очевидно: из-за ограничений моей архитектуры (Compact) сделать одну «супер-модель», которая и детали сохранит, и мусор уберет — не получится. Ей просто не хватает «мозгов» (параметров), чтобы удержать в голове всё сразу.
Поэтому я перестал мучить нейросеть попытками стать универсальной и разбил её на узкие специальности:

И именно здесь кроется главная ценность проекта. Базовые «чистильщики» (Soft/Medium) работают неплохо, но в контексте других решений — просидают. Настоящая цель, ради которой всё затевалось — это модели AntiLines, RGB и отчасти Rough. Аналогов нейросетевых денойзеров или апскейлеров, которые бы в принципе решали именно эти специфические проблемы плёнки, в открытом доступе я не встречал.
1. AntiLines (457 тыс. итераций)
Специализация: Горизонтальные линии (растяжение плёнки), разрывы, царапины.
Это модель-уборщик. Я взял базовую обученную модель и провёл файн-тюнинг на специфическом датасете: вероятность появления геометрических дефектов (Creases) и разрывов была выкручена на 80%. Удивительно, но для достижения результата хватило буквально 6-7 тысяч итераций дообучения. Теперь она видит линии и удаляет их там, где другие денойзеры видят полезный сигнал, сохраняют их или (что хуже) превращают в «кирпичную кладку».

2. Rough (493 тыс. итераций)
Специализация: Убитые исходники, High ISO шум, «вязкая» грязь.
Обучалась преимущественно на профиле Heavy (самые сложные деградации), а также во всех остальных профилях были включены вероятности выпадения всевозможных пыли и мусора. Она агрессивна. Она ищет пыль и пятна, стараясь устранить их любыми способами.

3. Medium (478 тыс. итераций)
Специализация: Золотая середина.
Баланс между чисткой и сохранением оригинальной текстуры. Лучший вариант для первого прогона, чтобы понять, с чем мы имеем дело. Обучалась на сбалансированном миксе дефектов.

4. Soft (453 тыс. итераций)
Специализация: Минимальное вмешательство.
Модель для почти чистых исходников, где нужно убрать лишь лёгкое плёночное зерно. Она лучше справляется с многослойным шумом и не создаёт «эффект пыли», характерный для DRUNet.
Нюанс: Модель использует лёгкую архитектуру 48nf16nc (48 фильтров и 16 каналов). В совсем простых сценариях она может проигрывать чистому DRUNet, который математически точнее на микро-уровне и видит больше контекста, поэтому и меньше лажает.

5. RGB (193 тыс. итераций)
Специализация: Плёночный шум с высокой степенью разложения эмульсии всех слоёв.
Модель обучалась отдельно от остальных с нуля. Использовалась более «творчески свободная» конфигурация обучения (выше вес GAN loss), а в генераторе датасета был везде включён экстремальный режим цветовых искажений. Спасает картинку от шума, возникающего при плохом сканировании или сжатии. Фокусируется на цветовых каналах.

Главный инсайт (Гибридный пайплайн)
Мой денойзер — это структурный инструмент. Абстрактно говоря: он видит разницу между мусором и глазом персонажа, но математически он не идеален (может оставить микро-дрожание пикселей). DRUNet же, наоборот, отлично «вылизывает» плоские поверхности, убирая цифровой шум.
Лучший результат даёт комбинация:
Archivist (AntiLines или Medium) — убирает мусор, линии, крупные ошмётки, сдвиги эмульсии, чинит MPEG.
DRUNet — убирает остаточный микро-шум и стабилизирует картинку, чтобы она не тряслась.
Итоги
В сухом остатке: 2 месяца работы, 2 миллиона итераций обучения.
Получился инструмент, который занимает свою нишу между «умными» алгоритмами и чистой математикой. Он балансирует между ручной реставрационной деятельностью и арифметической точностью удаления шума. Это как писать чёрной гелевой ручкой, пытаясь имитировать карандаш: похоже, стильно, но не карандаш, он «другой». Зато он спасает то, что другие считают безнадёжным.
Всё выложено в Open Source. И модели, и код генератора датасетов.
Ссылки:
© 2025 ООО «МТ ФИНАНС»

