Компьютерное зрение

Погружаемся глубже с картами глубины

Как мы используем машинное обучение для оценки карт глубины и заметности фотографий в Canva

Автор Керри Халупка

Миссия группы редакторов фотографий Canva — сделать фотографии наших пользователей потрясающими. Недавно мы выпустили новый инструмент под названием Автофокус, который позволяет пользователям редактировать точку фокусировки на фотографии после того, как она была сделана, применяя эффект малой глубины резкости, который помогает объекту выделиться.

По сути, этот эффект удерживает объект в фокусе, в то же время размывая предметы вокруг него. На изображении выше, где точкой фокусировки является человек в центре, пиксели на заднем плане (и, следовательно, дальше от глубины фокусировки) размыты. Также, если какие-то объекты были ближе к камере, чем объект съемки, они тоже размываются.

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

Чтобы применить эффект автофокуса, нам нужны две вещи:

  • Оценка глубины или относительного расстояния от камеры каждого пикселя изображения и
  • Глубина, на которой нужно сосредоточиться.

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

Оценка глубины из Stereo Vision

"Шутки о восприятии глубины всегда на грани провала. Вы не увидите изюминку, пока не станет слишком поздно».

— Анонимно

У человека хорошо развито чувство глубины. Например, хотя вы можете не знать точное расстояние от монитора до ваших глаз, вы знаете, насколько близко он находится относительно всего остального в поле вашего зрения. Этого можно добиться несколькими способами, которые называются метками глубины.

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

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

Оценка глубины с помощью монокулярного зрения

«В чем разница между целующимся в жопу и коричневым носом? Восприятие глубины»

— возможно, Хелен Миррен

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

Общие сигналы глубины, которые мозг использует для восприятия глубины без стереозрения.

А для бонусных баллов обратите внимание, что «цилиндры» на самом деле вовсе не цилиндры. Мы используем затенение (вариант признака глубины «отбрасываемых теней»), чтобы создать впечатление, что плоская двухмерная форма имеет глубину.

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

Сосредоточение внимания на нужной точке

«Совет. Не пейте воду, пока пытаетесь сосредоточиться. Это снизит вашу концентрацию».

— ВОЗ, вероятно

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

Чтобы оценить предмет изображения, мы используем концепцию, называемую карта значимости. Карта значимости показывает уровень важности каждого пикселя изображения для зрительной системы человека. Обычно область изображения, на которую человек смотрит в первую очередь, более заметна, чем любая другая область. Определение значимости — сложная концепция, потому что она очень субъективна. Например, когда я голоден, могу поспорить, я посмотрю на мороженое на фотографии, прежде чем посмотрю на человека, который его держит.

Машинное обучение в помощь

«Я скучаю по объятиям людей. Это может быть проблема с восприятием глубины».

— me

В современных современных подходах к оценке карты глубины по одному изображению используются подходы к глубокому обучению с учителем, такие как сверточные нейронные сети (CNN) и преобразователи зрения (ViT). Контролируемый означает, что мы показываем нейронным сетям тысячи изображений и заставляем их предсказывать глубину каждого пикселя. Затем мы сравниваем прогнозы с наземной истиной, которая представляет собой известную глубину каждого изображения.

Canva необходимо относительно быстро оценить глубину на большом количестве фотографий с разным уровнем качества. Вдохновленные недавними подходами к прогнозированию карты глубины, мы выбрали предварительно обученный ResNet в качестве основы. Чтобы использовать ResNet в качестве кодировщика для плотного прогнозирования глубины, мы удалили окончательный пул, полносвязные слои и слои softmax. Кодировщик ResNet генерирует карты объектов уменьшающегося размера, но с увеличивающимися рецептивными полями, что позволяет сети идентифицировать сигналы глубины как в мелком, так и в крупном масштабе.

Мы передаем эти карты признаков в декодер через пропущенные соединения. Декодер постепенно увеличивает предсказание глубины от грубого до точного за счет остаточных блоков свертки и операций повышения дискретизации. Результатом этого процесса является карта объектов с вдвое меньшим разрешением, чем входное изображение, с 256 каналами. Существует огромное количество информации о каждом пикселе, содержащемся в этой карте признаков. Чтобы понять эту информацию, мы применяем два сверточных слоя, чтобы сжать выходные данные в один канал за два шага. Мы будем называть эти слои слоями карты глубины. Затем мы масштабируем выходные данные до исходного размера, используя билинейную интерполяцию, и повторно масштабируем их до диапазона 0–1.

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

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

Чтобы проверить гипотезу, после того, как сеть предсказания глубины достигла приемлемого уровня производительности, мы заморозили веса сети кодировщика/декодера и слоев, специфичных для карты глубины. Мы также разветвили последний слой сети декодера со случайно инициализированным набором слоев, специфичных для карты значимости, которые затем были обучены на наборе данных значимости с использованием задачи двоичной классификации с значимыми областями в качестве положительного класса.

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

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

Попробуйте!

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

Заинтересованы в фотографии, машинном обучении и обработке изображений? Присоединяйтесь к нам!

Благодарности

Отдельное спасибо Bhautik Joshi за магию симуляции камеры. Огромная благодарность Grant Noble и Paul Tune за предложения по улучшению поста.

*Примечание редактора: это личное (очень) предвзятое мнение автора об одном особенно милом уиппете. Все представления, опубликованные здесь, могут не совпадать с представлениями, предоставленными Canva.