В прошлых статьях я разбирал основы апскейлинга дома и сходил с ума, вырезая закадровый смех из «Скуби-Ду». Тот опыт привёл меня к выводу: существующие инструмеВ прошлых статьях я разбирал основы апскейлинга дома и сходил с ума, вырезая закадровый смех из «Скуби-Ду». Тот опыт привёл меня к выводу: существующие инструме

Archivist: Как я учил нейросеть понимать физику плёнки, вместо того чтобы просто размывать шум

2f07b45daba716fa84d6045fd6206463.jpg

В прошлых статьях я разбирал основы апскейлинга дома и сходил с ума, вырезая закадровый смех из «Скуби-Ду». Тот опыт привёл меня к выводу: существующие инструменты, будь то плагины вроде NeatVideo или комбайны типа Topaz Video AI — это «чёрные ящики». У них ограниченный набор настроек, и они часто пасуют перед специфическими задачами старой анимации.

В этот раз я пошёл от обратного. Сразу снижу градус ожиданий: это любительский эксперимент. Мы сильно ограничены в мощности GPU (в наличии только RTX 4060 Ti), из-за чего натренировать реально точную, тяжелую нейросеть-универсала возможности нет.

Поэтому вместо гонки за идеальными метриками я сосредоточился на «неудобных» проблемах. Я написал симулятор уничтожения плёнки, чтобы научить легкую модель понимать физику конкретных дефектов: от сдвига эмульсии до химических ожогов и растяжения плёнки кинопроектором.

Спойлер: на это ушло 2 месяца и 2 миллиона итераций. Получилась не «волшебная кнопка», а набор узкоспециализированных инструментов.

Техническое вступление: Что под капотом?

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

hzfch0wyxjquymj8vr27ci6vt0k.jpeg

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

ueqblnkeucbu8yd2o0fvflmbup0.jpeg

Почему Compact?

  1. Скорость. Это легковесная архитектура. Она работает в разы быстрее стандартных трансформеров (SwinIR) или тяжёлых ResNet-ов.

  2. Конфигурация 48nf16nc: Это означает, что у модели 48 фильтров и 16 свёрточных слоёв. Для сравнения: «большие» модели обычно имеют 64 фильтра и 23 блока. В моём случае я ограничен видеокартой RTX 4060 Ti 16 Гб.

В чём главный прикол?

Обычно ESRGAN используют для апскейла (увеличения разрешения в 2 или 4 раза). Нейросеть берёт 1 пиксель и придумывает вокруг него 3 новых.

Я использую «апскейл» 1 к 1.

h-8zmpqmvwpxjgojyucseianqnu.jpeg

Я не прошу модель увеличивать картинку. Я скармливаю ей кадр 1080p и прошу вернуть те же 1080p.

В чём суть: Вместо того, чтобы тратить ресурсы на придумывание новых пикселей для увеличения, вся мощь генеративной сети уходит на перерисовку текущих пикселей. В этот момент классический апскейлер превращается в продвинутый денойзер: он не «сглаживает» шум (как простые математические денойзеры), он заново генерирует участок изображения, опираясь на то, что имел на входе.

Зачем? Разве нет готовых решений?

Безусловно, они есть. Но существующие денойзеры (как классические математические, так и современные нейросетевые) имеют фундаментальные недостатки при работе с классическим целлулоидом (плёнкой).

1. NeatVideo — мощный комбайн, но требует от пользователя огромнейшего опыта. Не все дефекты убитой временем плёнки можно описать его алгоритмами. Чуть перекрутил настройки — получил «мыло» на фонах. Недокрутил — шум ушёл, но Джерри на заднем плане оброс шипами-артефактами по 20 пикселей во все стороны.

Сравнение
Сравнение

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

8o78vwyhvjc8vgceevgg0al1rdc.jpeg

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 (повышение резкости) в конфиге, которые должны были «бесплатно» помогать, лишь усилили эту неочевидную тягу к созданию ореолов.

Сравнение. Персонаж начал буквально светиться на фоне, особенно в области ног. Здесь мы сравниваем эталон (к которому сеть стремилась) и реальный результат работы денойзера на шумном кадре.
Сравнение. Персонаж начал буквально светиться на фоне, особенно в области ног. Здесь мы сравниваем эталон (к которому сеть стремилась) и реальный результат работы денойзера на шумном кадре.

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

ulfhab4py0yvos_y4sselkgja3o.jpeg

Решение: Смена парадигмы (Ломать — не строить)

Я упёрся в тупик: найти идеальную пару «Грязный кадр — Чистый кадр» в реальности невозможно. Любая обработка NeatVideo или DRUNet оставляет следы, и нейросеть учится их повторять.

Я решил посмотреть проблему в профиль: вместо попыток очистить убитую плёнку для датасета, нужно брать качественные Blu-ray исходники и искусственно их состаривать.

irsafm7xb_magoimb3nwtnmjkv0.gif

Почему нам плевать на геометрию?

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

Сравнение (сервис жмёт изображения в jpeg, на деле там нет расслоения градиентов)
Сравнение (сервис жмёт изображения в jpeg, на деле там нет расслоения градиентов)

В контексте реставрации это был бы брак. Но для обучения нейросети — это не баг, а фича (в теории).

  1. Мы берём этот «поплывший», но стерильный кадр как Эталон.

  2. На него же накладываем зерно и грязь для Входа.

Нейросеть видит, что геометрия на Входе и Эталоне одинаково слегка кривая в деталях. Единственная разница между ними — шум. Поэтому сеть игнорирует искажения форм и фокусируется исключительно на задаче: «как превратить эту кашу из зёрен обратно в чистую картинку».

Так у меня появились идеальные «чистые» данные. Осталось самое сложное — научиться правдоподобно их портить.

Акт 2: Project Degrader — Симулятор износа

Главная проблема стандартных датасетов — использование простого Гауссова шума (утрированно). Но реальная плёнка стареет иначе.

Эволюция хаоса

Сначала я базово наложил самый обычный цветной шум. Модель научилась идеально чистить «цифру», но пасовала перед реальной плёнкой. Пришлось заняться анализом сканов:

  • На глубоком чёрном зерна почти нет (нужна маска по яркости).

  • Зерно — это не пиксели, а «хлопья» определённых оттенков.

  • Слабое звено (Синий): В нормальном состоянии на плёнке всегда больше всего шумит синий канал — так устроены светочувствительные слои.

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

С ИИ процесс пошёл ещё глубже: пытаясь заставить модель «понимать» дефекты, я сам узнавал, как именно деградирует старая плёнка. Например, выяснилось, что к естественному зерну синего канала со временем добавляется «химический шум» в красном. Это происходит из-за того, что голубой краситель — циановый слой, отвечающий за красный канал — в архивах выцветает и разрушается быстрее остальных.

В общем, тема очень и очень глубокая, а не банальный «шум из точек».

Так, скрипт усложнялся, количество параметров перевалило за 20. Стало слишком сложно настраивать это чисто в виде текста, и я написал Project Degrader — GUI-приложение на Python (PyQt6) для процедурной генерации устаревания плёнки.

nrchcn3lzqdxmx7dyu7tcpebttc.png

P. S.: Свечку не держал, специалистом по плёнке не являюсь, так что в алгоритмах наверняка есть неверные выводы и предубеждения в какой-то степени. Я чистый энтузиаст.

Чему модель научилась благодаря этому софту:

  1. Кризис: Геометрическая деформация изображения, имитирующая растяжение плёнки проектором.

  2. Умные царапины: Кривые Безье и «волоски», а не прямые линии.

  3. Химия: Пятна, выцветание, высокий ISO шум.

  4. MPEG-деблокинг: Очистка от квадратов сжатия и цифрового «звона» вокруг линий.

  5. Прочее...: Устранение Mpeg-блочности, поиск контуров под мусором...

-gtgkpysxfvy1qz_vmd5jbzu0ny.jpeg

# Фрагмент конвейера генерации 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) сделать одну «супер-модель», которая и детали сохранит, и мусор уберет — не получится. Ей просто не хватает «мозгов» (параметров), чтобы удержать в голове всё сразу.

Поэтому я перестал мучить нейросеть попытками стать универсальной и разбил её на узкие специальности:

db20c13af6aa6eba1917b450520b5d73.jpg

И именно здесь кроется главная ценность проекта. Базовые «чистильщики» (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 же, наоборот, отлично «вылизывает» плоские поверхности, убирая цифровой шум.

Лучший результат даёт комбинация:

  1. Archivist (AntiLines или Medium) — убирает мусор, линии, крупные ошмётки, сдвиги эмульсии, чинит MPEG.

  2. DRUNet — убирает остаточный микро-шум и стабилизирует картинку, чтобы она не тряслась.

Итоги

В сухом остатке: 2 месяца работы, 2 миллиона итераций обучения.

Получился инструмент, который занимает свою нишу между «умными» алгоритмами и чистой математикой. Он балансирует между ручной реставрационной деятельностью и арифметической точностью удаления шума. Это как писать чёрной гелевой ручкой, пытаясь имитировать карандаш: похоже, стильно, но не карандаш, он «другой». Зато он спасает то, что другие считают безнадёжным.

Всё выложено в Open Source. И модели, и код генератора датасетов.

Ссылки:

  • GitHub Репозиторий (Archivist Project Denoiser)

  • Скачать модели

© 2025 ООО «МТ ФИНАНС»

Источник

Возможности рынка
Логотип Sleepless AI
Sleepless AI Курс (AI)
$0.03895
$0.03895$0.03895
+0.33%
USD
График цены Sleepless AI (AI) в реальном времени
Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу [email protected] для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.

Вам также может быть интересно