Привет! Меня зовут Артем, я учусь на совместной кафедре анализа данных Яндекса и Физтеха.
Хочу поделиться с ML-сообществом Хабра темой, тесно связанной с моей научной работой: «Удаление отражений с помощью сверточной сети, обученной на синтетическом наборе данных».
А чтобы вы могли сами попробовать все описанное ниже, прилагаю код PyTorch для GitHub И в Яндекс ДатаСфера .
Источник: SIRR с использованием сети глубокого кодировщика-декодера
Что за удаление отражений?
Вы, наверное, знаете, что стекло никогда не бывает полностью прозрачным.
Это часто можно заметить при съемке через стекло – на фотографии видны отражения окружающих предметов (например, самой камеры).
Мы уже научились устранять подобные дефекты во время съемки, если они есть.
доступ к текущему видеопотоку камеры .
Но что, если фотография уже была сделана? В Интернете есть много руководств по удалению отражений с помощью графических редакторов, но это занимает много времени.
Хочется качественно подкорректировать фотографию «одним кликом».
Если вы знаете плагин или приложение, которое может это сделать, обязательно поделитесь им в комментариях.
И в этой статье мы построим собственное удаление отражений с помощью нейронных сетей.
Этот подход:
- позволит добиться хороших показателей качества и скорости,
- даст возможность контролировать соотношение качества и скорости, регулируя размер обучаемой модели,
- откроет путь к устранению других дефектов (например, бликов от глянцевых поверхностей) с использованием наборов данных, аналогичных тем, которые мы будем использовать для решения нашей задачи.
В статьях эта задача называется «Устранение одиночного отражения изображения» (SIRR, пример ) — «удаление отражений с одного изображения».
Если используется много изображений (скажем, один и тот же видеопоток), задача называется удалением множественных отражений изображений (MIRR, пример ).
MIRR имеет свои особенности, и ее рассмотрение, к сожалению, выходит за рамки нашей статьи.
В чем сложность SIRR? Дело в том, что решение проблемы неоднозначно – для одной фотографии с отражениями сложно выбрать наиболее правильный вариант без отражений, так как возможных вариантов много.
Большую роль здесь играет «сжатие диапазона»: при фотографировании через стекло сцена за стеклом обычно будет более тусклой, но немного отличающиеся сцены (в полном диапазоне яркости 0-255) после затемнения могут выглядеть почти одинаково.
Проблема построения правильного представления исходной сцены встает еще острее, когда отражения очень яркие — в этом случае то, что находится за бликами, восстановить невозможно.
Как же тогда решить проблему SIRR? И решаема ли она? Оказывается, это можно решить.
Ключом к решению являются особенности формирования отражений.
По своей природе отражения чаще всего бывают:
- тусклый – от стекла отражается лишь небольшая часть света,
- размытость – отраженные объекты обычно не в фокусе камеры,
- раздвоенный – происходит отражение как от ближней, так и от дальней границы стекла.
Источник: Сравнительный анализ алгоритмов SIRR
Мы пойдем другим путем — научим сверточную нейронную сеть удалять отражения.
Поскольку наша задача не имеет точного решения, достаточно просто найти правдоподобные ответы — сверточные сети хорошо справляются с подобными ситуациями при решении задач компьютерного зрения (например, в тех же задачах супер разрешение ).
Датасет, или Рубрика «Все не так просто» Прежде чем чему-либо учить, вам обязательно нужно что-то для обучения: набор данных.
Простейший набор данных для задачи SIRR выглядит как набор пар изображений (I, T), где I — изображение с отражением, T — изображение без отражения (в литературе это называется пропусканием).
Имея такой набор данных, вы можете обучить нейронную сеть прогнозировать T по I, что будет соответствовать удалению отражений.
Такие наборы данных очень удобны как для проверки, так и для обучения, но их невероятно сложно собрать вручную.
Пары (I, T) обычно получаются при съемке одной и той же сцены сначала со стеклом, а затем без стекла.
Основная сложность состоит в том, чтобы ни сцена, ни положение камеры не менялись существенно во время вынимания стекла из кадра.
Вот почему такие наборы данных обычно очень малы (10–100 пар) и на практике пригодны только для валидации.
Источник: SIRR с потерями восприятия
Что делать? Нам нужно чему-то обучить нейронную сеть.
На помощь приходит синтетика.
Получается, что вам не нужно беспокоиться о сборе реальных пар (I, T), а генерировать их! Для этого достаточно набора фотографий из Интернета и математических моделей, о которых мы говорили ранее.
Источник: Сравнительный анализ алгоритмов SIRR
Рецепт подготовки пары изображений (I, T) из набора данных:
- возьмем любую пару изображений, назовем их T и R (у нас сразу получилось T!),
- выберите произвольно: пропускание
(затухание), ядро Гаусса G (размытие), ядро бифуркации K (бифуркация), - применить ядра к R, получив R’,
- смешать с коэффициентом альфа изображений T и R’, получив I.
Стоит отметить, что в этой настройке можно применять аугментацию к изображениям T и R, тем самым получая еще большее разнообразие синтетики.
Мы будем извлекать изображения T и R из двух мест:
- датасет изображений различных комнат из статьи Распознавание сцен в помещении ,
- набор фотоданных уличной моды из статьи Совместный анализ одежды путем совместной сегментации изображений и маркировки .
Обучившись на синтетике, нейросетевая модель может научиться удалять даже самые сложные отражения.
Набор данных собран, осталось только построить модель.
Коллекция «Модель, или Все, что вам нужно…»
Источник: SIRR с использованием сети глубокого кодировщика-декодера
Оказывается, для удаления отражений достаточно небольшой сверточной сети, описанной в статье.
SIRR с использованием сети глубокого кодировщика-декодера .
Это сверточный автоэнкодер с дополнительным кодер-декодером ( UNet ) в середине.
Основная идея состоит в том, чтобы подсетка посередине изолировала отражение и при окончательном вычитании удалила его с фотографии.
К сожалению, авторы в своей статье не проверили, действительно ли подсеть посередине учится изолировать отражения и не делать что-то еще.
Тем не менее, эта архитектура хорошо решает проблему SIRR, поэтому мы будем использовать ее, но к идее изоляции отражений будем относиться с осторожностью.
Иллюстрация архитектуры видна на картинке выше.
Авторы оригинальной статьи не выложили код модели, но мы его воспроизвели — посмотреть можно по адресу GitHub или в ноутбук в Яндекс Датасфере .
Детальный анализ архитектуры Авторы архитектуры делят сеть на три смысловые части: подсеть извлечения признаков, подсеть удаления отражений и подсеть восстановления изображений.
Подсеть выделения признаков представляет собой шесть последовательных двумерных сверток с активациями и достаточно большими ядрами (размер первых двух — 9x9, остальных — 5x5).
Цель этой подсети — преобразовать исходное изображение в многомерный тензор с функциями, полезными для удаления отражений.
Большие ядра помогают увеличить восприимчивое поле, то есть сделать так, чтобы каждый признак на выходе подсети зависел от как можно большей части исходного изображения.
Подсеть удаления отражений представляет собой трехслойный кодер-декодер с двумя свертками 5x5 до и после пропуска соединения.
В отличие от стандартной сети UNet, в этой архитектуре нет нисходящих пулов, а пропускные соединения выполняются путем добавления, а не конкатенации, что делает эту подсеть чем-то более близким к РесНет .
Основная цель подсети — извлечь отражение из объектов.
На практике подсети необходимо найти тензор, вычитание которого из тензора с признаками устранило бы отражения.
Архитектуры кодировщика-декодера хорошо подходят для таких задач благодаря увеличению рецептивного поля и пересылке информации через пропускные соединения.
Подсеть восстановления изображений является зеркальным отражением подсети извлечения признаков: шесть последовательных сверток с большими ядрами, причем последние два еще больше.
Цель состоит в том, чтобы восстановить изображение из тензора признаков.
Входные данные подсети представляют собой тензор признаков, из которого были вычтены отражения, поэтому он должен не только полностью изменить подсеть выделения признаков, но и удалить все дефекты, связанные с вычитанием отражений.
Если отказаться от идеи, что подсеть посередине изолирует отражения, принцип работы всей сети можно объяснить проще: каждая свертка последовательно увеличивает рецептивное поле, а интересное расположение пропусков-соединений просто помогает в пересылке информации.
При этом отражения не удаляются в какой-то конкретный момент — они удаляются постепенно, свертка за сверткой.
Сеть состоит из типичных для компьютерного зрения слоев, которых неожиданно оказывается достаточно для решения проблемы SIRR (конечно, если у вас есть хороший набор данных).
Итак, архитектура модели придумана, осталось только обучить ее на датасете.
Как мы будем учить? Напомним, что набор данных состоит из пар (I, T), где I — изображение с отражением, а T — изображение той же сцены, но без отражений.
Построенная модель М является сквозной – на основе изображения I она сразу создает изображение M(I).
Для обучения модели нам нужно выбрать функцию потерь (потери L(T, M(I))), которую мы хотим минимизировать.
Главное, чтобы выбранная функция как-то отражала схожесть изображений.
Тогда при его минимизации изображение M(I) будет стремиться к T, и сеть научится выдавать изображения без отражений.
Примеры таких функций:
- MSE между изображениями как тензоры чисел в любом цветовом пространстве (RGB, LAB, YCbCr и другие).
- Потеря признаков — MSE между признаками, которые получены на определенном сверточном слое другой предварительно обученной сети (VGG, ResNet) при запуске изображений через эту сеть.
Так изображения сближаются по содержанию: учитывается наличие, размер и количество предметов разной формы и цвета (линий, углов, кругов.
).
- Состязательный проигрыш — тренируемся уже по схеме GAN, где генератором становится М и добавляется дискриминатор, что позволяет М генерировать более реалистичные изображения.
Особенно помогает улучшить генерацию текстур.
Пример использования такого сочетания функций можно найти в статье SIRR с потерями восприятия .
Но начинать всегда стоит с чего-то простого: например, с MSE на RGB-изображениях.
Оказывается, для первого приближения этого нам будет более чем достаточно.
ADAM применим как схема оптимизации параметров, как и для большинства подобных задач.
И чтобы найти лучшую скорость обучения, мы используем следующее процедура пересчета скорости обучения в логарифмической шкале :
- Фиксируем диапазон поиска скорости обучения [min_lr, max_lr] (например, от min_lr=10^{-7} до max_lr=10^2).
- Мы берем недавно инициализированную нейронную сеть и набор обучающих данных из n_batches пакетов.
- Мы делаем сеть одним проходом обучения на наборе обучающих данных, но по мере прохождения набора данных мы меняем скорость обучения в соответствии с логлинейным графиком.
Для номера партии m установите в оптимизаторе следующую скорость обучения:
Формула для номера пакета скорости обучения m - Строим график функции потерь в зависимости от скорости обучения (шага).
- Мы выбираем лучшую скорость обучения с помощью эвристики: там, где ошибка падает быстрее всего, находятся наиболее подходящие значения.
Это скорость обучения:
- гарантирует, что сеть не будет «сломана» и обучение произойдет максимально быстро,
- предназначен для обучения сети со свежей инициализацией (сеть, обученную на шаге 3, можно безопасно удалить).
На этом теоретическая часть заканчивается, остается только все запрограммировать.
Современные фреймворки TensorFlow и PyTorch мало чем отличаются в этом плане, вы можете выбрать любой — мы взяли PyTorch. На GitHub вы можете увидеть полностью реализованный конвейер, а в Яндекс ДатаСфера — попробуйте запустить и обучить модель на графическом процессоре.
В том числе бесплатно - в течение Пробный период Яндекс.
Облака .
Какой результат? Давайте попробуем обучить нашу модель на изображениях размером 128x128. В ходе процесса полезно смотреть на графики функции потерь, чтобы понять, обучается ли модель вообще.
Часто из MSE между изображениями переходят в ПСНР (минус логарифмическая MSE – чем выше PSNR, тем эффективнее).
Таким образом, вы сможете лучше увидеть последовательное улучшение модели.
На графике ниже показано, что модель фактически обучается, поскольку ее PSNR в наборе проверки растет.
И чтобы понять, действительно ли модель дает желаемый результат, нужно еще посмотреть примеры ее работы, особенно когда вы имеете дело с изображениями.
Это также очень хороший способ отладки модели — на изображениях будут очень хорошо видны крупные ошибки.
В примерах ниже, взятых из нашего набора данных, заметно, что модель действительно научилась удалять отражения.
Наконец, когда мы поняли, что модель все делает правильно на наших синтетических данных, стоит проверить ее на реальном изображении (которое мы взяли из статьи SIRR с потерями восприятия ).
Исходное изображение, передача: SIRR с потерями восприятия
В примере выше видно, что модель уже справляется с простыми отражениями (тусклыми, на однородном фоне), но сильные блики на фоне сложных текстур все равно остаются.
Некоторые из них наверняка совсем неустранимы – например, яркая подсветка посередине.
В остальном придется задуматься об усложнении функции потерь, архитектуры модели и, возможно, расширении границ генерируемой синтетики.
Итак, после долгого пути у нас есть рабочая базовая модель удаления отражений.
Что еще вы можете попробовать? Существует множество способов улучшить качество удаления отражений с помощью нейронных сетей.
Образование
Что, если мы изменим гиперпараметры обучения в текущей конфигурации — например, количество эпох, размер пакета, скорость обучения, параметры оптимизатора? Также можно попробовать другие функции потерь и их комбинации или вообще взять в качестве цели само отражение, а не передачу — изображение с удалённым отражением.
Модель
Опять же, можно действовать очень локально — менять гиперпараметры сверток: количество фильтров, размер ядер, тип заполнения.Изначально наша модель вообще не содержала отступов: пространственные размеры изображения были уменьшены до середины сети, а затем увеличены с помощью транспонированных сверток.
Эта архитектура ближе к философии кодера-декодера, поскольку имеет «шею» посередине вдоль пространственных направлений.
Но в наших экспериментах такая модель плохо восстанавливала края изображения — они получались очень размытыми.
Поэтому в итоге мы отказались от «шеи» и перешли на зеркальную набивку.
Можно развить предположения авторов статьи.
SIRR с использованием сети глубокого кодировщика-декодера что центральная подсеть изолирует отражения.
То есть добавить в текущую модель отдельную голову, которая научится выдавать отражения на выходе центральной подсети, улучшив тем самым «изолирующую способность» этой подсети.
К сожалению, такой идеи у нас не было, и новый руководитель не смог нормально предугадать отражения.
Если у вас получится, обязательно напишите в комментариях, как вам это удалось.
Кстати, если забыть о том, что сеть учится изолировать отражения, то вся модель сводится к использованию свёрток и пропусков соединений.
Тогда вместо «длинных» пропусков соединений в UNet можно поставить «короткие», как в ResNet. В наших экспериментах модель, упрощенная до простой последовательности блоков ResNet, по качеству очень близка к текущей модели UNet.
Ээксперимент: простая архитектура, подобная ResNet, тоже работает?
Что произойдет, если заменить UNet простой сетью ResNet? Давайте попробуем следующую архитектуру:- Свертка 1х1, раздувание 3 каналов до 64,
- 10 блоков ResNet (блок — это две свертки 3х3 и пропуск соединения),
- Свертка 1x1, сжимающая 64 канала обратно в 3.
Итоговая сеть будет иметь примерно в три раза меньше параметров и обучаться примерно в два раза быстрее! А как насчет качества? По PSNR и синтетическим результатам модели примерно одинаковы.
Но фактическое изображение показывает некоторые различия.
Реснет:
- удаляет размытие из отражений более агрессивно, чем UNet,
- но при этом несколько чаще не удается полностью убрать отражение.
Исходное изображение, передача: SIRR с потерями восприятия В целом упрощенная архитектура показала себя хорошо.
Поэтому с ним можно проводить эксперименты по улучшению модели.
Кроме того, как всегда с нейронными сетями, вы можете попробовать добавить в UNet больше слоев или те же слои.
Также было бы интересно посмотреть, как с этой задачей справятся другие сверточные (и не только!) архитектуры.
Хороший источник альтернативных архитектур можно найти в решениях проблем компьютерного зрения, таких как классификация, суперразрешение и других.
Набор данных
Самое простое — изменить размер изображений, находящихся в наборе данных.Вы можете смешивать изображения разных размеров, чтобы модель лучше обобщалась.
Или выберите еще более интересный маршрут и постепенно увеличивайте размер изображений в процессе обучения.
Таким образом, сеть сначала быстро научится удалять отражения при малых размерах, а затем постепенно улучшится при больших размерах.
Не следует забывать главное преимущество синтетического набора данных — мы можем контролировать гиперпараметры его генерации.
Вы можете научиться удалять более широкий диапазон отражений.
Для этого нужно всего лишь расширить диапазон возможных коэффициентов пропускания.
, ядра размытия по Гауссу G и ядра бифуркации K.
Еще один плюс этого синтетического набора данных — вы легко можете перейти к устранению любых дефектов: бликов от глянца, сетчатых ограждений и других.
Достаточно уметь генерировать такие дефекты.
То есть построенный нами трубопровод имеет много возможностей для расширения и совершенствования.
Заключение Задача удаления отражений изображения (SIRR) сложна, поскольку не имеет точного решения.
В таких случаях часто используются нейронные сети, способные генерировать правдоподобные ответы.
Основная трудность такого подхода — сбор данных для обучения.
Наборов данных с реальными изображениями для SIRR довольно много, но здесь помогают физические свойства отражений.
Благодаря им можно легко генерировать синтетику на основе обычных изображений.
Таких данных достаточно для обучения сверточной нейронной сети типа кодер-декодер — хорошая модель SIRR для первого запуска.
Код доступен по адресу GitHub , и вы можете попробовать запустить его Яндекс ДатаСфера .
Полезные ссылки
- Распознавание внутренних сцен — набор данных изображений различных помещений,
- Набор данных совместного анализа одежды (CCP) — датасет с фотографиями уличной моды,
- GitHub SIRR с потерями восприятия — код статьи и ссылки на датасет реальных изображений,
- Как найти хорошую скорость обучения — описание процедуры пересчета скорости обучения в логарифмической шкале,
- PSNR_RU , PSNR_EN — Статьи в Википедии о PSNR (пиковом отношении сигнал/шум),
- Пробный период на Яндекс.
Облаке
— для бесплатного использования Яндекс ДатаСфера, - Краткое руководство по работе с Яндекс DataSphere .
Кваттони и др.
, doi:10.1109/CVPR.2009.5206537
.[2] Надежное разделение отражения от нескольких изображений, X.Guo et al., CVPR 2014. .
[4] U-Net: сверточные сети для сегментации биомедицинских изображений, О.
Роннебергер и др.
, arXiv:1505.04597 .
[5] Удаление отражений с использованием ореолов, Y.C.Shih et al., CVPR 2015 .
[6] Вычислительный подход к фотографии без препятствий, Т.
Сюэ и др.
, doi:10.1145/2766940 .
[7] Глубокое остаточное обучение для распознавания изображений, К.
Хе и др.
, arXiv:1512.03385 .
[8] Сравнительный анализ алгоритмов удаления отражений одиночного изображения, Р.
Ван и др.
, doi:10.1109/ICCV.2017.423 .
[10] Разделение отражения одиночного изображения с потерями восприятия, X. Zhang et al., arXiv:1806.05376 .
Теги: #Машинное обучение #Алгоритмы #ИТ-исследования и прогнозы #Обработка изображений #компьютерное зрение #удаление отражения одиночного изображения #sirr #сверточная нейронная сеть #синтетический набор данных
-
Использование Бесконтактных Карт
19 Oct, 24