Оригинал статьи размещен на сайте Вастрик.ру и опубликован на 3DNews с разрешения автора. Мы приводим полный текст статьи, за исключением огромного количества ссылок — они пригодятся тем, кто всерьез заинтересовался темой и хотел бы изучить теоретические аспекты вычислительной фотографии более глубоко, но для широкой аудитории мы сочли этот материал избыточным.
Сегодня ни одна презентация смартфона не обходится без облизывания его камеры. Каждый месяц мы слышим об очередном успехе мобильных камер: Google учит Pixel снимать в темноте, Huawei зумить как бинокль, Samsung вставляет лидар, а Apple делает самые круглые в мире уголочки. Мало где сейчас так жирно текут инновации.
Зеркалки при этом как будто топчутся на месте. Sony ежегодно осыпает всех новыми матрицами, а производители лениво обновляют последнюю цифру версии и продолжают расслабленно курить в сторонке. У меня на столе лежит зеркалка за $3000, но в путешествия я беру айфон. Почему?
Как говорил классик — я вышел в интернет с этим вопросом. Там обсуждают какие-то «алгоритмы» и «нейросети», понятия не имея, как конкретно они влияют на фотографию. Журналисты громко зачитывают количество мегапикселей, блогеры хором пилят проплаченные анбоксинги, а эстеты обмазываются «чувственным восприятием цветовой палитры матрицы». Все как обычно.
Пришлось сесть, потратить половину жизни и самому во всем разобраться. В этой статье я расскажу, что узнал.
Везде, включая википедию, дают примерно такое определение: вычислительная фотография — любые техники захвата и обработки изображений, где вместо оптических преобразований используются цифровые вычисления. В нем все хорошо, кроме того, что оно ничего не объясняет. Под него подходит даже автофокус, но не влезает пленоптика, которая уже принесла нам много полезного. Размытость официальных определений как бы намекает, что мы понятия не имеем о чем говорим.
Пионер вычислительной фотографии, профессор Стенфорда Marc Levoy (он же сейчас отвечает за камеру в Google Pixel) приводит другое определение — набор методов компьютерной визуализации, улучшающих или расширяющих возможности цифровой фотографии, при использовании которых получается обычная фотография, которая не могла технически быть снята на данную камеру традиционным способом. В статье я придерживаюсь именно его.
Итак, во всем были виноваты смартфоны.
У смартфонов не было выбора, кроме как дать жизнь новому виду фотографии — вычислительной.
Их маленькие шумные матрицы и крохотные несветосильные объективы по всем законам физики должны были приносить только боль и страдание. Они и приносили, пока их разработчики не догадались хитро использовать их сильные стороны, чтобы побороть слабые, — быстрые электронные затворы, мощные процессоры и софт.
Большинство громких исследований в области вычислительной фотографии приходятся на 2005-2015 года, что в науке считается буквально вчера. Прямо сейчас на наших глазах и в наших карманах развивается новая область знаний и технологий, которой никогда не было.
Вычислительная фотография — это не только селфи с нейро-боке. Недавняя фотография черной дыры не появилась бы на свет без методов вычислительной фотографии. Чтобы снять такое фото на обычный телескоп, нам бы пришлось сделать его размером с Землю. Однако, объединив данные восьми радиотелескопов в разных точках нашего шарика и написав немного скриптов на питоне, мы получили первую в мире фотографию горизонта событий. Для селфи тоже сгодится.
Представим, что мы вернули 2007-й. Наша мама — анархия, а наши фотографии — шумные 0,6-Мп джипеги, снятые на скейтборд. Примерно тогда у нас появляется первое непреодолимое желание насыпать на них пресетов, чтобы скрыть убогость мобильных матриц. Не будем себе отказывать.
С выходом инстаграма все помешались на фильтрах. Как человек, который в свое время реверс-инжинирил X-Pro II, Lo-Fi и Valencia в, конечно же, исследовательских (кек) целях, я все еще помню, что состояли они из трех компонентов:
Настроек цвета (Hue, Saturation, Lightness, Contrast, Levels и т. д.) — простых цифровых коэффициентов, в точности как в любых пресетах, которыми фотографы пользовались с древних времен.
Карты маппинга оттенков (Tone Mapping) — вектора значений, каждое из которых говорило нам: «Красный цвет с оттенком 128 надо превратить в оттенок 240».
Оверлея — полупрозрачной картинки с пылью, зерном, виньеткой, и всем остальным, что можно наложить сверху для получения нисколько не банального эффекта старой пленки. Присутствовал далеко не всегда.
Современные фильтры недалеко ушли от этой тройки, лишь стали чуть сложнее по математике. С появлением аппаратных шейдеров и OpenCL на смартфонах их быстро переписали под GPU, и это считалось дико круто. Для 2012 года, конечно. Сегодня любой школьник может сделать такое же на CSS, и ему все равно не перепадет на выпускном.
Однако прогресс фильтров сегодня не остановился. Ребята из Дехансера, например, отлично упарываются по нелинейным фильтрам — вместо пролетарского тон-маппинга они используют более сложные нелинейные преобразования, что, по их словам, открывает куда больше возможностей.
Нелинейными преобразованиями можно натворить много дел, но они невероятно сложны, а мы, человеки, невероятно тупы. Как только в науке дело доходит до нелинейных преобразований, мы предпочитаем идти в численные методы и напихивать везде нейросетей, чтобы те писали шедевры за нас. То же было и здесь.
Когда все привыкли к фильтрам, мы начали встраивать их прямо в камеры. История скрывает, кто именно из производителей был первым, но чисто для понимания как давно это было — в iOS 5.0, которая вышла аж в 2011 году, уже был публичный API для Auto Enhancing Images. Одному только Джобсу известно, как долго он использовался до открытия на публику.
Автоматика делала то же, что и каждый из нас, открывая фотку в редакторе, — вытягивала провалы в свете и тенях, наваливала сатурейшена, убирала красные глаза и фиксила цвет лица. Пользователи даже не догадывались, что «драматически улучшенная камера» в новом смартфоне была лишь заслугой пары новых шейдеров. До выхода Google Pixel и начала хайпа по вычислительной фотографии оставалось еще пять лет.
Сегодня же бои за кнопку «шедевр» перешли на поле машинного обучения. Наигравшись с тон-маппингом, все ринулись тренировать CNN’ы и GAN’ы двигать ползуночки вместо пользователя. Иными словами, по входному изображению определять набор оптимальных параметров, которые приближали бы данное изображение к некоему субъективному пониманию «хорошей фотографии». Реализовано в том же Pixelmator Pro и других редакторах. Работает, как можно догадаться, не очень и не всегда.
Настоящая вычислительная фотография началась со стекинга — наложения нескольких фотографий друг на друга. Для смартфона не проблема нащелкать десяток кадров за полсекунды. В их камерах нет медленных механических частей: диафрагма фиксирована, а вместо ездящей шторки — электронный затвор. Процессор просто командует матрице, сколько микросекунд ей ловить дикие фотоны, а сам считывает результат.
Технически телефон может снимать фото со скоростью видео, а видео с разрешением фото, но все упирается в скорость шины и процессора. Поэтому всегда ставят программные лимиты.
Сам по себе стекинг с нами давно. еще деды ставили плагины на Photoshop 7.0, чтоб собрать несколько фотографий в вырвиглазный HDR или склеить панораму 18000 × 600 пикселей и… на самом деле никто так и не придумал, что с ними делать дальше. Богатые времена были, жаль, дикие.
Сейчас мы стали взрослые и называем это «эпсилон-фотографией» — когда, изменяя один из параметров камеры (экспозицию, фокус, положение) и склеивая полученные кадры, мы получаем нечто, что не могло быть снято одним кадром. Но это термин для теоретиков, на практике же прижилось другое название — стекинг. Сегодня по факту на нем строится 90% всех инноваций в мобильных камерах.
Вещь, о которой многие не задумываются, но она важна для понимания всей мобильной и вычислительной фотографии: камера в современном смартфоне начинает делать фотографии сразу, как только вы открываете ее приложение. Что логично, ей ведь надо как-то передавать изображение на экран. Однако, помимо экрана, она сохраняет кадры высокого разрешения в свой собственный циклический буфер, где хранит их еще пару секунд.
Когда вы нажимаете кнопку «снять фото» — оно на самом деле уже снято, камера просто берет последнее фото из буфера.
Сегодня так работает любая мобильная камера. По крайней мере во всех флагманах не с помоек. Буферизация позволяет реализовать не просто нулевую задержку затвора, о которой так давно мечтали фотографы, а даже отрицательную — при нажатии на кнопку смартфон заглядывает в прошлое, выгружает 5-10 последних фото из буфера и начинает неистово анализировать их и клеить. Больше не нужно ждать, пока телефон нащелкает кадров для HDR или ночного режима, — просто забирай их из буфера, пользователь даже не узнает.
Кстати, именно с помощью отрицательного лага затвора реализовано Live Photo в айфонах, а в HTC подобное было еще в 2013 году под странным названием Zoe.
⇡#Стекинг по экспозиции — HDR и борьба с перепадами яркости
Способны ли матрицы фотоаппаратов фиксировать весь диапазон яркости, доступный нашему глазу, — старая горячая тема для споров. Одни говорят нет, ведь глаз способен видеть до 25 f-стопов, в то время как даже из топовой фуллфрейм-матрицы можно вытянуть максимум 14. Другие называют сравнение некорректным, ведь глазу помогает мозг, автоматически подстраивая зрачок и достраивая изображение своими нейросетями, а моментальный динамический диапазон глаза на самом деле не больше как раз 10-14 f-стопов. Оставим эти споры лучшим диванным мыслителям интернета.
Факт остается фактом: снимая друзей на фоне яркого неба без HDR на любую мобильную камеру, вы получаете либо нормальное небо и черные лица друзей, либо прорисованных друзей, но выжженное насмерть небо.
Решение давно придумано — расширять диапазон яркости с помощью HDR (High dynamic range). Нужно снять несколько кадров с разной выдержкой и склеить их вместе. Чтобы один был «нормальный», второй посветлее, третий потемнее. Берем темные места из светлого кадра, пересветы заполняем из темного — профит. Остается лишь решить задачу автоматического брекетинга — насколько сдвинуть экспозицию каждого кадра, чтобы не переборщить, но с определением средней яркости картинки сейчас справится второкурсник технического вуза.
На последних iPhone, Pixel и Galaxy режим HDR вообще включается автоматически, когда нехитрый алгоритм внутри камеры определяет, что вы снимаете что-то контрастное в солнечный день. Можно даже заметить, как телефон переключает режим записи в буфер, чтобы сохранять сдвинутые по экспозиции кадры, — в камере падает fps, а сама картинка становится сочнее. Момент переключения хорошо заметен на моем iPhone X, если снимать на улице. Присмотритесь к своему смартфону в следующий раз тоже.
Минус HDR с брекетингом по экспозиции — его непроходимая беспомощность в плохом освещении. Даже при свете комнатной лампы кадры получаются такими темными, что компьютер не может их выровнять и склеить. Для решения проблемы со светом в 2013-м Google показал иной подход к HDR в вышедшем тогда смартфоне Nexus. Он использовал стекинг по времени.
⇡#Стекинг по времени — симуляция длинной выдержки и таймлапс
Стекинг по времени позволяет получить длинную выдержку с помощью серии коротких. Первопроходцами были любители поснимать следы от звезд на ночном небе, которым было неудобно открывать затвор сразу на два часа. Так было тяжело заранее рассчитать все настройки, а от малейшей тряски весь кадр выходил испорченным. Они решили открывать затвор лишь на пару минут, но много раз, а потом шли домой и клеили полученные кадры в фотошопе.
Получается, камера никогда фактически не снимала на длинной выдержке, но мы получали эффект ее имитации, складывая несколько снятых подряд кадров. Для смартфонов уже давно написана куча приложений, использующих этот трюк, но все они не нужны с тех пор, как фича была добавлена почти во все стандартные камеры. Сегодня даже айфон легко склеит вам длинную выдержку из Live Photo.
Вернемся к гуглу с его ночным HDR. Оказалось, с помощью брекетинга по времени можно реализовать неплохой HDR в темноте. Технология впервые появилась в Nexus 5 и называлась HDR+. Остальные же телефоны на Android получили ее как бы в подарок. Технология до сих пор настолько популярна, что ей хвалятся даже в презентации последних Pixel.
Работает HDR+ достаточно просто: определив, что вы снимаете в темноте, камера выгружает из буфера 8-15 последних фотографий в RAW, чтобы наложить их друг на друга. Таким образом алгоритм собирает больше информации о темных участках кадра чтобы минимизировать шумы — пиксели, где по каким-то причинам камера не смогла собрать всю информацию и лажанула.
Как если бы вы не знали, как выглядит капибара, и попросили пять человек описать ее — их рассказы были бы примерно одинаковыми, но каждый упомянул бы какую-то уникальную деталь. Так вы бы собрали больше информации, чем просто спросив одного. То же и с пикселями.
Сложение снятых с одной точки кадров дает тот же фейковый эффект длинной выдержки как со звездами выше. Экспозиция десятков кадров суммируется, ошибки на одном минимизируются на других. Представьте, сколько бы каждый раз пришлось щелкать затвором зеркалки, чтобы достичь такого.
Оставалось только решить проблему автоматической цветокоррекции — снятые в темноте кадры обычно получаются поголовно желтыми или зелеными, а мы вроде как хотим сочности дневного освещения. В ранних версиях HDR+ это решали простым подкручиванием настроек, как в фильтрах а-ля инстаграм. Потом же призвали на помощь нейросети.
Так появился Night Sight — технология «ночной фотографии» в Pixel 2 и 3. В описании так и говорят: «Machine learning techniques built on top of HDR+, that make Night Sight work». По сути это является автоматизацией этапа цветокоррекции. Машину обучили на датасете фоточек «до» и «после», чтобы из всякого набора темных кривых фотографий делать одну красивую.
Датасет, кстати, выложили в открытый доступ. Может, ребята из Apple возьмут его и наконец-то научат свои стеклянные лопаты нормально снимать в темноте.
Вдобавок в Night Sight используется вычисление вектора движения объектов в кадре, чтобы нормализовать смазы, которые обязательно получатся на длинной выдержке. Так, смартфон может взять четкие части с других кадров и приклеить.
⇡#Стекинг по движению — панорама, суперзум и борьба с шумами
Панорама — популярное развлечение жителей сельской местности. Истории пока не известно случаев, чтобы сосискофотка оказалась бы интересна кому-то, кроме ее автора, но не упомянуть ее нельзя — для многих с этого вообще начался стекинг.
Первый же полезный способ применения панорамы — получение фотографии большего разрешения, чем позволяет матрица камеры путем склейки нескольких кадров. Фотографы давно используют разный софт для так называемых фотографий с суперразрешением — когда немного смещенные фотографии как бы дополняют друг друга между пикселей. Таким образом можно получить изображение хоть в сотни гигапикселей, что весьма полезно, если вам надо распечатать это на рекламном плакате размером с дом.
Другой, уже более интересный подход — Pixel Shifting. Некоторые беззеркалки типа Sony и Olympus начали поддерживать его еще с 2014-го, но клеить результат все равно заставляли руками. Типичные инновации больших камер.
Смартфоны же преуспели здесь по смешной причине — когда вы снимаете фото, ваши руки трясутся. Эта на первый взгляд проблема легла в основу реализации нативного суперразрешения на смартфонах.
Чтобы понять, как это работает, надо вспомнить, как устроена матрица любого фотоаппарата. Каждый ее пиксель (фотодиод) способен фиксировать только интенсивность света — т. е. количество залетевших фотонов. Однако пиксель не может измерить его цвет (длину волны). Чтобы получить RGB-картинку, пришлось и здесь нагородить костылей — накрыть всю матрицу сеткой разноцветных стеклышек. Самая популярная ее реализация называется фильтром Байера и используется сегодня в большинстве матриц. Выглядит как на картинке ниже.
Получается, что каждый пиксель матрицы ловит только R-, G- или B-компоненту, ведь остальные фотоны нещадно отражаются фильтром Байера. Недостающие же компоненты он узнает тупым усреднением значений соседних пикселей.
Зеленых ячеек в фильтре Байера больше — так сделали по аналогии с человеческим глазом. Получается, что из 50 миллионов пикселей на матрице зеленый цвет будет улавливать 25 млн, красный и синий — по 12,5 млн. Остальное будет усреднено — этот процесс называется дебайеризация или демозаик, и это такой жирный смешной костыль, на котором все держится.
На самом деле у каждой матрицы свой хитрый запатентованный алгоритм демозаикинга, но в рамках данной истории мы этим пренебрежем.
Другие типы матриц (типа Foveon) пока ну как-то совсем не прижились. Хотя некоторые производители пытаются использовать матрицы без фильтра Байера для улучшения резкости и динамического диапазона.
Когда света мало или детали объекта совсем крошечны, мы теряем кучу информации, потому что фильтр Байера нагло отсекает фотоны с неугодной длиной волны. Поэтому и придумали делать Pixel Shifting — смещать матрицу на 1 пиксель вверх-вниз-вправо-влево, чтобы поймать их все. Фотография при этом не получается в 4 раза больше, как может показаться, просто процессор использует эти данные, чтобы точнее записать значение каждого пикселя. Усредняет не по соседям, так сказать, а по четырем значениям самого себя.
Тряска же наших рук при съемке фото на телефон делает этот процесс естественным следствием. В последних версиях Google Pixel эта штука реализована и включается всегда, когда вы используете зум на телефоне, — называется Super Res Zoom (да, мне тоже нравится их беспощадный нейминг). Китайцы тоже скопировали его в свои ляофоны, хотя получилось немного хуже.
Наложение друг на друга немного смещенных фотографий позволяет собрать больше информации о цвете каждого пикселя, а значит, уменьшить шумы, увеличить резкость и поднять разрешение не увеличивая физическое число мегапикселей матрицы. Современные Android-флагманы делают это автоматически, пока их пользователи даже не задумываются об этом.
⇡#Стекинг по фокусу — любая глубина резкости и рефокус в постпродакшене
Метод пришел из макросъемки, где маленькая глубина резкости всегда была проблемой. Чтобы весь объект был в фокусе, приходилось делать несколько кадров со сдвигом фокуса вперед-назад, чтобы потом сшить их в один резкий. Тем же методом часто пользовались любители съемки ландшафтов, делая передний и задний план резкими как диарея.
Все это тоже переехало и на смартфоны, правда, без особого хайпа. В 2013-м выходит Nokia Lumia 1020 с «Refocus App», а в 2014 и Samsung Galaxy S5 с режимом «Selective Focus». Работали они по одной и той же схеме: по нажатию на кнопку они быстро делали 3 фотографии — одну с «нормальным» фокусом, вторую со сдвинутым вперед и третью со сдвинутым назад. Программа выравнивала кадры и позволяла выбрать один из них, что преподносилось как «настоящее» управление фокусом в постпродакшене.
Никакой дальнейшей обработки не было, ведь даже этого простого хака было достаточно, чтобы вбить еще один гвоздь в крышку Lytro и аналогов с их честным рефокусом. Кстати, поговорим о них (мастер переходов 80 lvl).
⇡#Вычислительные матрицы — световые поля и пленоптика
Как мы поняли выше, наши матрицы — ужас на костылях. Мы просто привыкли и пытаемся с этим жить. По своему устройству они мало изменялись с самого начала времен. Мы лишь совершенствовали техпроцесс — уменьшали расстояние между пикселями, боролись с шумами-наводками, добавляли специальные пиксели для работы фазового автофокуса. Но стоит взять даже самую дорогую зеркалку и попытаться снять на нее бегущего кота при комнатном освещении — кот, мягко говоря, победит.
Мы уже давно пытаемся изобрести что-то получше. Много попыток и исследований в этой области гуглится по запросу «computational sensor» или «non-bayer sensor», и даже пример с Pixel Shifting выше можно отнести к попыткам улучшения матриц с помощью вычислений. Однако самые многообещающие истории в последние лет двадцать приходят к нам именно из мира так называемых пленоптических камер.
Чтобы вы не уснули от предвкушения надвигающихся сложных слов, вброшу инсайд, что камера последних Google Pixel как раз «немного» пленоптическая. Всего на два пикселя, но даже это позволяет ей вычислять честную оптическую глубину кадра и без второй камеры как у всех.
Придумана в 1994-м, собрана в Стенфорде в 2004-м. Первая потребительская камера — Lytro, выпущена в 2012-м. С похожими технологиями сейчас активно экспериментирует VR-индустрия.
От обычной камеры пленоптическая отличается лишь одной модификацией — матрица в ней накрыта сеткой из линз, каждая из которых покрывает несколько реальных пикселей. Как-то так:
если правильно рассчитать расстояние от сетки до матрицы и размер диафрагмы, в итоговом изображении получатся четкие кластеры из пикселей — эдакие мини-версии оригинального изображения.
Оказывается, если взять из каждого кластера, скажем, один центральный пиксель и склеить картинку только по ним — она ничем не будет отличаться от снятой на обычную камеру. Да, мы немного потеряли в разрешении, но просто попросим Sony досыпать еще мегапикселей в новых матрицах.
Веселье же на этом только начинается. если взять другой пиксель из каждого кластера и снова склеить картинку — получится снова нормальная фотография, только как будто снятая со сдвигом на один пиксель. Таким образом, имея кластеры 10 × 10 пикселей, мы получим 100 изображений предмета с «немного» разных точек.
Больше размер кластера — больше изображений, но меньше разрешение. В мире смартфонов с 41-мегапиксельными матрицами мы хоть и можем немного пренебречь разрешением, но у всего есть предел. Приходится сохранять баланс.
Окей, мы собрали пленоптическую камеру, и что это нам дает?
Честный рефокус
Фича, о которой жужжали все журналисты в статьях про Lytro, — возможность честной корректировки фокуса в постпродакшене. Под честной имеется в виду, что мы не применяем всякие алгоритмы деблюринга, а используем исключительно имеющиеся под рукой пиксели, выбирая или усредняя их из кластеров в нужном порядке.
RAW-фотография с пленоптической камеры выглядит странно. Чтобы получить из нее привычный резкий джипег, надо сначала его собрать. Для этого надо выбрать каждый пиксель джипега из одного из кластеров RAW’а. В зависимости от того, как мы их выберем, будет меняться результат.
Например, чем дальше находится кластер от места падения оригинального луча, тем более этот луч получается в расфокусе. Потому что оптика. Чтобы получить смещенное по фокусу изображение, нам лишь надо выбрать пиксели на нужном нам удалении от оригинального — либо ближе, либо дальше.
Со сдвигом фокуса на себя было сложнее — чисто физически таких пикселей в кластерах было меньше. Сначала разработчики даже не хотели давать пользователю возможность фокусироваться руками — камера сама решала это программно. Пользователям такое будущее не понравилось, потому фичу добавили в поздних прошивках под названием «креативный режим», но сделали рефокус в нем сильно ограниченным ровно по этой причине.
Карта глубины и 3D с одной камеры
Одна из самых простых операций в пленоптике — получение карты глубины. Для этого надо просто собрать два разных кадра и рассчитать, насколько сдвинуты объекты на них. Больше сдвиг — дальше от камеры.
Недавно Google купил и убил Lytro, но использовал их технологии для своего VR и… для камеры в Pixel. Начиная с Pixel 2 камера впервые стала «немного» пленоптической, правда, с кластерами всего по два пикселя. Это дало возможность гуглу не ставить вторую камеру, как все остальные ребята, а вычислять карту глубины исключительно по одной фотографии.
Карта глубины строится по двум кадрам, сдвинутым на один субпиксель. Этого вполне хватает, чтобы вычислить бинарную карту глубины и отделить передний план от заднего и размыть последний в модном нынче боке. Результат такого расслоения еще сглаживается и «улучшается» нейросетями, которые натренированы улучшать карты глубины (а не блюрить, как многие думают).
Фишка еще в том, что пленоптика в смартфонах нам досталась почти бесплатно. Мы и так ставили линзы на эти крошечные матрицы, чтобы хоть как-то увеличить световой поток. В следующих Pixel гугл планирует пойти дальше и накрыть линзой четыре фотодиода.