Оригинал статьи размещен на сайте Вастрик.ру и опубликован на 3DNews с разрешения автора. Мы приводим полный текст статьи, за исключением огромного количества ссылок — они пригодятся тем, кто всерьез заинтересовался темой и хотел бы изучить теоретические аспекты вычислительной фотографии более глубоко, но для широкой аудитории мы сочли этот материал избыточным.
Сегодня ни одна презентация смартфона не обходится без облизывания его камеры. Каждый месяц мы слышим об очередном успехе мобильных камер: Google учит Pixel снимать в темноте, Huawei зумить как бинокль, Samsung вставляет лидар, а Apple делает самые круглые в мире уголочки. Мало где сейчас так жирно текут инновации.
Зеркалки, при этом, как будто топчутся на месте. Sony ежегодно осыпает всех новыми матрицами, а производители лениво обновляют последнюю цифру версии и продолжают расслабленно курить в сторонке. У меня на столе лежит зеркалка за $3000, но в путешествия я беру айфон. Почему?
Как говорил классик — я вышел в интернет с этим вопросом. Там обсуждают какие-то «алгоритмы» и «нейросети», понятия не имея как конкретно они влияют на фотографию. Журналисты громко зачитывают количество мегапикселей, блогеры хором пилят проплаченные анбоксинги, а эстеты обмазываются «чувственным восприятием цветовой палитры матрицы». Всё как обычно.
Пришлось сесть, потратить половину жизни и самому во всём разобраться. В этой статье я расскажу что узнал.
Везде, включая википедию, дают примерно такое определение: вычислительная фотография — любые техники захвата и обработки изображений, где вместо оптических преобразований используются цифровые вычисления. В нём всё хорошо, кроме того, что оно ничего не объясняет. Под него подходит даже автофокус, но не влезает пленоптика, которая уже принесла нам много полезного. Размытость официальных определений как бы намекает, что мы понятия не имеем о чём говорим.
Пионер вычислительной фотографии, профессор Стенфорда Marc Levoy (он же сейчас отвечает за камеру в Google Pixel) приводит другое определение — набор методов компьютерной визуализации, улучшающих или расширяющих возможности цифровой фотографии, при использовании которых получается обычная фотография, которая не могла технически быть снята на данную камеру традиционным способом. В статье я придерживаюсь именно его.
Итак, во всём были виноваты смартфоны.
У смартфонов не было выбора, кроме как дать жизнь новому виду фотографии — вычислительной
Их маленькие шумные матрицы и крохотные несветосильные объективы по всем законам физики должны были приносить только боль и страдание. Они и приносили, пока их разработчики не догадались хитро использовать их сильные стороны, чтобы побороть слабые — быстрые электронные затворы, мощные процессоры и софт.
Большинство громких исследований в области вычислительной фотографии приходятся на 2005-2015 года, что в науке считается буквально вчера. Прямо сейчас на наших глазах и в наших карманах развивается новая область знаний и технологий, которой никогда не было.
Вычислительная фотография — это не только селфи с нейро-боке. Недавняя фотография черной дыры не появилась бы на свет без методов вычислительной фотографии. Чтобы снять такое фото на обычный телескоп, нам бы пришлось сделать его размером с Землю. Однако, объединив данные восьми радиотелескопов в разных точках нашего шарика и написав немного скриптов на питоне, мы получили первую в мире фотографию горизонта событий. Для селфи тоже сгодится.
Представим, что мы вернули 2007-й. Наша мама — анархия, а наши фотографии — шумные 0,6-Мп джипеги, снятые на скейтборд. Примерно тогда у нас появляется первое непреодолимое желание насыпать на них пресетов, чтобы скрыть убогость мобильных матриц. Не будем себе отказывать.
С выходом инстаграма все помешались на фильтрах. Как человек, который в своё время реверс-инжинирил X-Pro II, Lo-Fi и Valencia в, конечно же, исследовательских (кек) целях, я всё еще помню, что состояли они из трёх компонентов:
Современные фильтры недалеко ушли от этой тройки, лишь стали чуть сложнее по математике. С появлением аппаратных шейдеров и OpenCL на смартфонах их быстро переписали под GPU и это считалось дико круто. Для 2012 года, конечно. Сегодня любой школьник может сделать такое же на CSS и ему всё равно не перепадёт на выпускном.
Однако, прогресс фильтров сегодня не остановился. Ребята из Дехансера, например, отлично упарываются по нелинейным фильтрам — вместо пролетарского тон-маппинга они используют более сложные нелинейные преобразования, что по их словам открывает куда больше возможностей.
Нелинейными преобразованиями можно натворить много дел, но они невероятно сложны, а мы, человеки, невероятно тупы. Как только в науке дело доходит до нелинейных преобразований, мы предпочитаем идти в численные методы и напихивать везде нейросетей, чтобы те писали шедевры за нас. То же было и здесь.
Когда все привыкли к фильтрам, мы начали встраивать их прямо в камеры. История скрывает кто именно из производителей был первым, но чисто для понимания как давно это было — в iOS 5.0, которая вышла аж в 2011 году, уже был публичный API для Auto Enhancing Images. Одному только Джобсу известно как долго он использовался до открытия на публику.
Автоматика делала то же, что и каждый из нас, открывая фотку в редакторе — вытягивала провалы в свете и тенях, наваливала сатурейшена, убирала красные глаза и фиксила цвет лица. Пользователи даже не догадывались, что «драматически улучшенная камера» в новом смартфоне была лишь заслугой пары новых шейдеров. До выхода Google Pixel и начала хайпа по вычислительной фотографии оставалось еще пять лет.
ML Enhance в пиксельматоре
Сегодня же бои за кнопку «шедевр» перешли на поле машинного обучения. Наигравшись с тон-маппингом все ринулись тренировать CNN'ы и GAN'ы двигать ползуночки вместо пользователя. Иными словами, по входному изображению определять набор оптимальных параметров, которые приближали бы данное изображение к некому субъективному пониманию «хорошей фотографии». Реализовано в том же Pixelmator Pro и других редакторах. Работает, как можно догадаться, не очень и не всегда.
Настоящая вычислительная фотография началась со стекинга — наложения нескольких фотографий друг на друга. Для смартфона не проблема нащелкать десяток кадров за полсекунды. В их камерах нет медленных механических частей: диафрагма фиксирована, а вместо ездящей шторки — электронный затвор. Процессор просто командует матрице сколько микросекунд ей ловить дикие фотоны, а сам считывает результат.
Технически, телефон может снимать фото со скоростью видео, а видео с разрешением фото, но всё упирается в скорость шины и процессора. Поэтому всегда ставят программные лимиты.
Сам по себе стекинг с нами давно. Еще деды ставили плагины на Photoshop 7.0 чтоб собрать несколько фотографий в вырвиглазный HDR или склеить панораму 18000 × 600 пикселей и... на самом деле никто так и не придумал что с ними делать дальше. Богатые времена были, жаль дикие.
Сейчас мы стали взрослые и называем это «эпсилон-фотографией» — когда изменяя один из параметров камеры (экспозицию, фокус, положение) и склеивая полученные кадры мы получаем нечто, что не могло быть снято одним кадром. Но это термин для теоретиков, на практике же прижилось другое название — стекинг. Сегодня по факту на нём строится 90% всех инноваций в мобильных камерах.
Вещь, о которой многие не задумываются, но она важна для понимания всей мобильной и вычислительной фотографии: камера в современном смартфоне начинает делать фотографии сразу как только вы открываете её приложение. Что логично, ей ведь надо как-то передавать изображение на экран. Однако, помимо экрана, она сохраняет кадры высокого разрешения в свой собственный циклический буфер, где хранит их еще пару секунд.
Когда вы нажимаете кнопку «снять фото» — оно на самом деле уже снято, камера просто берет последнее фото из буфера
Сегодня так работает любая мобильная камера. По крайней мере во всех флагманах не с помоек. Буферизация позволяет реализовать не просто нулевую задержку затвора, о которой так давно мечтали фотографы, а даже отрицательную — при нажатии на кнопку, смартфон заглядывает в прошлое, выгружает 5-10 последних фото из буфера и начинает неистово анализировать их и клеить. Больше не нужно ждать пока телефон нащелкает кадров для HDR или ночного режима — просто забирай их из буфера, пользователь даже не узнает.
Кстати, именно с помощью отрицательного лага затвора реализовано Live Photo в айфонах, а в HTC подобное было еще в 2013-м году под странным названием Zoe.
Способны ли матрицы фотоаппаратов фиксировать весь диапазон яркости, доступный нашему глазу — старая горячая тема для споров. Одни говорят нет, ведь глаз способен видеть до 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 чтобы наложить их друг на друга. Таким образом алгоритм собирает больше информации о тёмных участках кадра чтобы минимизировать шумы — пиксели, где по каким-то причинам камера не смогла собрать всю информацию и лажанула.
Как если бы вы не знали как выглядит капибара и попросили пять человек описать её — их рассказы были бы примерно одинаковыми, но каждый упомянул бы какую-то уникальную деталь. Так вы бы собрали больше информации, чем просто спросив одного. То же и с пикселями.
Сложение снятых с одной точки кадров даёт тот же фейковый эффект длинной выдержки как со звёздами выше. Экспозиция десятков кадров суммируется, ошибки на одном минимизируются на других. Представьте сколько бы каждый раз пришлось щелкать затвором зеркалки, чтобы достичь такого.
Реклама Pixel, прославляющая HDR+ и Night Sight
Оставалось только решить проблему автоматической цветокоррекции — снятые в темноте кадры обычно получаются поголовно жёлтыми или зелёными, а мы вроде как хотим сочности дневного освещения. В ранних версиях 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 камера впервые стала «немного» пленоптической, правда с кластерами всего по два пикселя. Это дало возможность гуглу не ставить вторую камеру как все остальные ребята, а вычислять карту глубины исключительно по одной фотографии.
Картинки, которые видят левый и правый субпиксель камеры Google Pixel. Самая правая анимирована для наглядности (придётся всмотреться)
Карта глубины дополнительно обрабатывается нейросетками чтобы блюр фона был более равномерным
Карта глубины строится по двум кадрам, сдвинутым на один суб-пиксель. Этого вполне хватает, чтобы вычислить бинарную карту глубины и отделить передний план от заднего и размыть последний в модном нынче боке. Результат такого расслоения еще сглаживается и «улучшается» нейросетями, которые натренированы улучшать карты глубины (а не блюрить, как многие думают).
Фишка еще в том, что пленоптика в смартфонах нам досталась почти бесплатно. Мы и так ставили линзы на эти крошечные матрицы, чтобы хоть как-то увеличить световой поток. В следующих Pixel гугл планирует пойти дальше накрыть линзой четыре фотодиода.