Изучите передовую сеть HDRnet от Google за 10 минут

HDR и улучшение мобильных изображений уже давно являются областью интересов в сфере компьютерного зрения. С ростом популярности глубокого обучения для решения этой проблемы с все большим успехом применяется все больше и больше инновационных конвейеров и решений.

Было предложено множество решений для улучшения изображений на настольных устройствах. Фактически, потребительские продукты, такие как Adobe Photoshop CC, уже делают передовые технологии доступными для потребителя.

Однако мобильная сфера разочаровывает немного больше. Проблема в том, что, хотя в обработке изображений в целом есть множество достижений, большинство из них не очень практично для использования на мобильных устройствах, поскольку для этого требуется много вычислительной мощности. Поскольку огромное количество фотографий и редактирования происходит на телефонах, это стало очень актуальной областью исследований. Из этого родился HDRnet: конвейер настройки изображения, который может работать в реальном времени на мобильных устройствах.

(Обратите внимание, ребята, это статья о том, как это работает, а не о том, как реализовать. Я постараюсь включить детали, касающиеся реализации, насколько это возможно, но если вы действительно серьезно относитесь к попытке ее реализовать , убедитесь, что вы читаете настоящую статью, в ней гораздо больше подробностей, чем в этой статье.)

Чтобы понять, насколько хорош HDRnet, взгляните на следующую демонстрацию:

Довольно хорошо, правда?

Сеть разбита на два потока: поток с высоким разрешением и поток с низким разрешением. Это показано на схеме архитектуры ниже.

Прежде чем я продолжу, есть несколько основных предпосылок с точки зрения того, что вы должны знать. Во-первых, у вас должно быть рабочее понимание CNN, а также терминов полностью связанные и (полосатые) сверточные слои. Если вы этого не сделаете, я настоятельно рекомендую проверить свободно доступный онлайн-учебник по глубокому обучению MIT, веб-сайт можно найти здесь, а быстрый поиск в Google показывает, что версию в формате pdf можно найти здесь (я рекомендую использовать версия с закладками, так как по ней легче ориентироваться). Если вы ленивы или у вас нет времени, здесь можно найти быстрое, но интуитивно понятное руководство по сверточным нейронным сетям и шагам, где они объясняют обе концепции с помощью простой для понимания графики. Одно предложение определения шага, взятого из последней ссылки, будет заключаться в том, что это размер шага, на который фильтр свертки перемещается каждый раз.

В любом случае, вернемся к конвейеру.

Обработка с низким разрешением

Этот модуль конвейера принимает входной сигнал с полным разрешением I и масштабирует его до более низкого разрешения 256x256, образуя Ĩ.

Вход Ĩ, как упоминалось ранее, имеет фиксированный входной размер 256x256. Сначала он обрабатывается стеком сверточных слоев с чередованием (S_i) i = 1… n_S с шагом s, чтобы извлечь низкоуровневые (фокальные точки, края и т. Д.) .) особенности и уменьшить пространственное разрешение. После этого модуль разделяется на два потока: один для извлечения локальных функций (L_i) i = 1… n_L, а второй для извлечения глобальных функций (G_i) i = 1… n_G , в дизайне, вдохновленном «[Iizuka et al. 2016] », не волнуйтесь, если в этом нет особого смысла, мы рассмотрим локальные и глобальные варианты позже.

Первый путь S_i является полностью сверточным, цитируется в статье: «[Long et al. 2015] »за их вдохновение и фокусируется на изучении локальных функций, которые распространяют данные изображения, одновременно сохраняя релевантную пространственную информацию.

Второй путь G_i использует комбинацию полносвязных (FC) и сверточных слоев для изучения вектора фиксированного размера соответствующих глобальных функций (таких как категория сцены, внутренний / внешний вид, распределение цветов и т. Д., функции, которые являются общими для изображений, т.е. глобальными), которые помогают предотвратить образование локальных искажений цвета и других нежелательных артефактов.

Выходные данные этих двух потоков G ^ (n_G) и L ^ (n_L) затем объединяются в единый набор функций F с помощью обучаемая линейная функция, а не простая конкатенация, по-видимому, для уменьшения включения нерелевантной информации и повышения точности сети. После этого «поточечный линейный слой» выводит окончательный массив A из объединенных потоков, который затем используется слоем нарезки в слое обработки с полным разрешением. В статье массив A интерпретируется как «двусторонняя сетка аффинных коэффициентов».

Это жаргонное предложение имеет гораздо больше смысла, если вы действительно знаете, что такое двусторонняя сетка и аффинные преобразования, поэтому, если вы этого не знаете, вам, вероятно, следует хотя бы быстро поискать в Google, прежде чем продолжить. Интуитивно двусторонняя сетка позволяет сформировать трехмерное представление двухмерного изображения, используя интенсивность пикселей в качестве третьей оси. Взгляните на следующую схему, взятую из презентации о двусторонних сетках:

Как видите, вместо оси Z используется интенсивность пикселей. Одним из результатов этого является то, что он сохраняет края даже при агрессивном понижении дискретизации (т.е. уменьшении разрешения), что делает его очень полезным для обнаружения границ. Для получения дополнительной информации я бы рекомендовал просмотреть эту презентацию MIT о них.

Аффинное преобразование на самом деле не так уж сложно, это просто тип преобразования, который можно применить к изображениям, сохраняя точки, прямые линии и плоскости. Обычно он используется для исправления геометрических искажений, но в этом случае не очень важно знать, как он применяется напрямую, достаточно просто знать, что это форма преобразования изображения и что его можно использовать для цветокоррекции.

В любом случае, давайте подробнее остановимся на конвейере.

3.1.1

Изображение с низким разрешением сначала обрабатывается серией чередующихся сверточных слоев с s = 2. На этом этапе важно сделать несколько важных технических замечаний о реализации автора, которые могут помочь вам, если вы попытаетесь прочитать статью самостоятельно или реализовать ее самостоятельно. Их предложение максимально сжато, поэтому я просто процитирую его здесь: «Где i = 1,. . . , n_S индексирует слои, c и c ' индексирует каналы слоев, w_i - массив весов для сверток b_i - вектор смещений, а суммирование ведется по −1 ≤ x ′, y ′ ≤ 1 (т. е. ядра свертки имеют пространственную протяженность 3 × 3) »- это просто говорит о том, что w_i - это массив весов, а b_i - вектор смещений ( в соответствии с соглашением), а также то, что ядра CNN имеют размер окна 3 x 3.

Эти слои имеют совокупный эффект уменьшения размера изображения на 2 * n_S, таким образом показывая, что n_S имеет два эффекта: (1) чем больше его значение, тем грубее (менее резкость) итоговая сетка. , (2) он контролирует сложность прогноза. Чем больше слоев имеет сеть, тем более сложной может быть функция, которую она моделирует, и, следовательно, она может извлекать более сложные шаблоны в сети. Авторы выбрали для этой статьи золотую середину - n_S = 4.

Сверточные слои в этом разделе имеют следующую форму:

3.1.2 - Путь к локальным функциям

Этот раздел конвейера посвящен локальным особенностям. Местные объекты - это объекты, относящиеся только к определенным местам на изображении (например, здесь лицо, верхний фрагмент - небо). Окончательный низкоуровневый путь объекта обрабатывается стеком из n_L = 2 сверточных слоев Li, которые принимают ту же форму, что и уравнение в разд. 3.1.1, но с s = 1 (шаг 1).

Важная функция пути локальных объектов, которую обязательно следует иметь в виду, заключается в том, что она дает прогнозируемым аффинным коэффициентам ощущение пространственного положения. Это означает, что когда аффинное преобразование действительно применяется, оно менее подвержено локализованным искажениям, таким как некрасивые пятна или обесцвечивание в случайных местах.

3.1.3 - Путь к глобальным функциям

Глобальная ветвь начинается с того же места, где была локальная ветвь, S ^ (n_S). Он состоит из двух усеченных конв. слоев (как в уравнении из 3.1.1 с s = 2), за которыми следуют три полностью связанных (FC) слоя. Этот поток создает 64-мерный вектор, который суммирует глобальную информацию (например, распределение цвета, внутри / снаружи?, День / ночь?) Об изображении, и он имеет своего рода регуляризующий эффект на преобразования, производимые локальным путем. Без этой ветки для кодирования глобальной информации об изображении (и эффекта регуляризации, который она имеет), сеть склонна создавать нежелательные локализованные артефакты, подобные показанному ниже (подсказка - посмотрите на небо в b, видите пятно?):

3.1.4 - Объединение и линейное прогнозирование

Авторы говорят, что два потока сливаются с помощью «точечного аффинного перемешивания», что, по сути, является просто причудливым способом выразить линейное уравнение.

Это дает массив функций размером 16 * 16 * 64, который затем используется для окончательного прогноза 1 * 1 для создания карты 16 * 16 с 96 каналами. На английском это означает, что конечный результат A содержит предсказанные аффинные коэффициенты, которые позже используются в преобразованиях цвета, которые происходят, когда коэффициенты фактически применяются (последний шаг в конвейере - если вы посмотрите диаграмму, вы можете увидеть его ярко-зеленым).

3.2–3.4

Мы можем довольно легко резюмировать остальную часть статьи. По сути, выход A из предыдущего этапа слияния обрабатывается как двусторонняя сетка, третье измерение которой развернуто. Игнорируя некоторые из более утомительных деталей документа, вы должны заметить, что только рассматривая конечный результат A как двустороннюю сетку, сама сеть может научиться (и будет отвечать) за переключение с 2D на 3D.

Сегмент с меткой 3.3 отвечает за масштабирование двусторонней сетки с низким разрешением для использования с исходным входным изображением с более высоким разрешением I. Авторы упоминают, что этот слой представляет собой специально созданную операцию «разрезания» двусторонней сетки, которая по существу помогает масштабировать меньшую (читай: с низким разрешением) двустороннюю сетку аффинных коэффициентов до более крупной (читай: с высоким разрешением) без ухудшения качества. В качестве входных данных для этого используется карта руководства g, которая изучается на этапе 3.4.1 (который, как ни странно, на самом деле предшествует 3.3, просто авторы решили объяснить это позже в своей статье, и поэтому нумерация немного странно), а также A (который снова рассматривается как двусторонняя сетка). Также обратите внимание, что сама операция нарезки не имеет параметров, это карта указаний, которая изучается.

Выполняя все операции логического вывода, включенные в срез внутри двусторонней сетки, модель вынуждена следовать по краям от g, что делает конвейер в целом более учитывающим края.

Кроме того, просто обратите внимание, что навигационная карта g - это просто изученное отображение входного изображения I в оттенках серого. Ее основная цель - помочь слою срезов приблизить желаемые улучшения с гораздо более высокими верность.

Наконец, фактическая сборка в окончательный результат довольно тривиальна:

В целом, это очень впечатляющая работа. HDRnet может производить с сопоставимыми результатами с другими передовыми решениями, делая это намного быстрее и без накладных расходов, связанных с архитектурой клиент-сервер, при этом имея возможность изучать практически любой тип редактирования. Если бы только у меня был NVIDIA Titan X….

Https://groups.csail.mit.edu/graphics/hdrnet/data/hdrnet.pdf