Портретный режим на смартфонах Pixel позволяет вам делать профессионально выглядящие фотографии, привлекающие внимание к объекту съёмки при помощи размытия фона. В прошлом году мы описывали, как мы подсчитываем глубину, используя единственную камеру и автофокус с определением фазы (Phase-Detection Autofocus, PDAF), также известный, как автофокус с двойными пикселями. Это процесс использовал традиционный стерео-алгоритм без обучения. В этом году на Pixel 3 мы взяли на вооружение машинное обучение, чтобы улучшить оценку глубины и выдавать ещё более качественные результаты в портретном режиме.
Слева: первоначальное изображение, снятое в HDR+. Справа – сравнение результатов съёмки в портретном режиме с использованием глубины от традиционного стерео и от машинного обучения. У результатов работы с обучением получается меньше ошибок. У традиционного результата со стерео глубина многих горизонтальных линий за мужчиной неправильно оценивается равной глубине самого мужчины, в результате чего они остаются резкими.
Краткий экскурс в предыдущий материал
В прошлом году мы описывали, что портретный режим использует нейросеть для разделения пикселей, принадлежащих изображениям людей и изображению фона, и дополняет эту двухуровневую маску информацией о глубине, полученной из PDAF-пикселей. Всё это делалось для получения размытия, зависящего от глубины, близкого к тому, что может дать профессиональная камера.
Для работы PDAF делает два слегка различных снимка сцены. Переключаясь между снимками, можно увидеть, что человек не двигается, а фон сдвигается по горизонтали – этот эффект называют параллаксом. Поскольку параллакс – это функция от расстояния точки от камеры и от расстояния между двумя точками зрения, глубину мы можем определить, сопоставив каждую точку в одном снимке с соответствующей ей точкой в другом.
Изображения PDAF слева и в середине выглядят схожими, но справа в увеличенном фрагменте можно заметить параллакс. Легче всего его заметить по круглой структуре в центре увеличения.
Однако поиск таких соответствий в изображениях PDAF (этот метод называется глубиной из стерео) — чрезвычайно тяжёлая задача, поскольку точки между фотографиями сдвигаются очень слабо. Более того, все технологии, использующие стерео, страдают от проблемы апертуры. Если смотреть на сцену через малую апертуру, невозможно будет найти соответствие точек для линий, параллельных базовой линии стерео, то есть, линии, соединяющей две камеры. Иначе говоря, изучая на представленном фото горизонтальные линии (или вертикальные линии в снимках с портретной ориентацией) все сдвиги в одном изображении относительно другого выглядят примерно одинаково. В прошлогоднем портретном режиме все эти факторы могли привести к ошибкам в определении глубины и к появлению неприятных артефактов.
Улучшая оценку глубины
С портретным режимом у Pixel 3 мы исправляем эти ошибки, используя тот факт, что параллакс из стереофотографий – лишь одна из многих подсказок, присутствующих в изображениях. К примеру, точки, находящиеся далеко от плоскости фокусировки, кажутся менее резкими, и это будет подсказка от расфокусированной глубины. Кроме того, даже при просмотре изображения на плоском экране мы легко можем оценить расстояние до предметов, поскольку нам известен примерный размер повседневных объектов (то есть, можно использовать количество пикселей, изображающих лицо человека, чтобы оценить, насколько далеко он находится). Это будет семантическая подсказка.
Вручную разработать алгоритм, комбинирующий эти подсказки, чрезвычайно тяжело, но используя МО, мы можем это сделать, одновременно улучшая работу подсказок от параллакса PDAF. Конкретно, мы тренируем свёрточную нейронную сеть, написанную на TensorFlow, принимающую на вход пиксели от PDAF, и обучающуюся предсказывать глубину. Этот новый, улучшенный метод оценки глубины на базе МО и используется в портретном режиме Pixel 3.
Наша свёрточная нейросеть принимает на вход PDAF-изображения и выдаёт карту глубины. Сеть использует архитектуру в стиле кодировщик-декодировщик с дополнительными связями внутри слоя [skip connections] и остаточными блоками [residual blocks].
Тренировка нейросети
Чтобы натренировать сеть, нам нужно множество PDAF-изображений и соответствующие карты глубины высокого качества. А поскольку нам нужно, чтобы предсказания глубины оказались полезными в портретном режиме, нам нужно, чтобы тренировочные данные были похожи на фото, которые пользователи делают со смартфонов.
Для этого мы сконструировали специальное устройство «Франкенфон», в котором объединили пять телефонов Pixel 3 и наладили между ними WiFi связь, что позволяло одновременно делать фотографии со всех телефонов (с разницей не более 2 мс). С этим устройством мы рассчитывали высококачественные карты глубины на базе фотографий, используя как движение, так и стерео с нескольких точек зрения.
Слева: устройство для сбора тренировочных данных. В середине: пример переключения между пятью фотографиями. Синхронизация камер гарантирует возможность подсчёта глубины в динамических сценах. Справа: Итоговая глубина. Точки с низкой достоверностью, где сопоставление пикселей на разных фотографиях было неуверенным из-за слабости текстур, окрашены чёрным, и не используются в тренировке.
Полученные при помощи этого устройства данные оказались идеальными для тренировки сети по следующим причинам:
- Пять точек зрения гарантируют наличие параллакса в нескольких направлениях, что избавляет нас от проблемы апертуры.
- Расположение камер гарантирует, что любая точка изображения повторяется как минимум на двух фотографиях, что уменьшает количество точек, которым нельзя подобрать соответствие.
- Базовая линия, то есть расстояние между камерами, больше, чем у PDAF, что гарантирует более точную оценку глубины.
- Синхронизация камер гарантирует возможность подсчёта глубины в динамических сценах.
- Портативность устройства гарантирует возможность съёмки фотографий на природе, симулирующих фотографии, которые пользователи делают при помощи смартфонов.
Однако, несмотря на идеальность данных, полученных при помощи этого устройства, предсказывать абсолютную глубину объектов сцены всё ещё чрезвычайно сложно – любая заданная PDAF-пара может соответствовать разнообразным картам глубины (всё зависит от характеристик линз, фокусного расстояния и т.п.). Чтобы учесть всё это, мы оцениваем относительную глубину объектов сцены, чего хватает для получения удовлетворительных результатов в портретном режиме.
Совмещаем всё это
Оценка глубины при помощи МО на Pixel 3 должна работать быстро, чтобы пользователям не приходилось слишком долго ждать результатов снимков в портретном режиме. Однако для получения хороших оценок глубины, использующих небольшие расфокусировку и параллакс, приходится скармливать нейросети фотографии в полном разрешении. Чтобы гарантировать быстрое получение результатов, мы используем TensorFlow Lite, кроссплатформенное решение для запуска МО-моделей на мобильных и встроенных устройствах, а также мощный GPU Pixel 3, что позволяет быстро рассчитывать глубину на необычно больших входных данных. Затем мы комбинируем полученные оценки глубины с масками от нашей нейросети, выделяющей людей, чтобы получить красивейшие результаты съёмки в портретном режиме.
Попробуйте сами
В приложении Google Camera App версий 6.1 и выше наши карты глубины встроены в изображения портретного режима. Это значит, что мы можете использовать редактор глубины Google Photos для изменения степени размытия и точки фокусировки после того, как уже сделали снимок. Вы также можете использовать сторонние программы для извлечения карт глубины из jpeg, и изучать их самостоятельно. Также по ссылке вы можете взять альбом, демонстрирующий относительные карты глубины и соответствующие изображения в портретном режиме, для сравнения традиционного стерео и МО-подхода.
Автор: SLY_G