Как стать автором
Обновить

Склеиваем несколько фотографий в одну длинную с помощью компьютерного зрения

Время на прочтение4 мин
Количество просмотров25K
Всего голосов 100: ↑100 и ↓0+99
Комментарии30

Комментарии 30

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

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

Алгоритм работает где-то 4 секунды на 1000x1000px. Рост сложности можно сделать линейным, но не факт, что наша конкретная реализация не отвалится, если я ей скормлю картинки в таком разрешении. Но там надо еще и много оперативной памяти, т.к. много манипуляций с битмапами.
спасибо. А как себя будет вести opticalflow при обьемных изображениях? Не 2D? будут ли так же хорошо совмещаться изображения?
Если честно, я не очень понял вопроса. Речь идет именно о 3D моделях, или двух фотографиях из немного разного ракурса?
Две фотографии с разными ракурсами. У них есть глубина в отличие от этикетки.

И еще один вопрос созрел, вы получаете этикетку из видео ряда? Или серии фотографий? Тут вопрос наверное пользовательского удобства, покрутить на видео пользователю проще, а вот разбивать видео потом на фреймы, выкидывая лишнее и не иметь гарантий резких кадров для склейки — сложнее. Или же вы просите сделать серию фотографий?
Мы просим делать серию фотографий, хотя записывать видео — выглядит довольно заманчиво.
Что касается фотографий из разных ракурсов, то мне кажется, что оптический поток склеит довольно неплохо, другое дело, что полученная фотография может выглядеть довольно странно (хотя и без стыков).
Для таких задач лучше использовать другие методики, которые по кадрам восстанавливают 3D habr.com/ru/post/516116/#comment_21985568
Видео изначально с низкой резкостью, там же не полное разрешение используется, но для анализа может быть и пойдет. Ведь такая резкость на фото, чтобы разглядеть даже линии гильоша вам не нужна. И, вероятно, нужно же еще выбирать не мыльные кадры для сшивания. На фото резкость контролирует сам пользователь.Хотя я не знаю, какие точные возможности у camera api, вероятно, можно забирать видео поток с 5-10fps тогда можно и не делить видео на фреймы, обрабатывать сразу. В идеале, конечно, самостоятельно забирать из видеопотока нужные кадры, но как это по мощностям с телефона получится — не знаю. Но для удобства, наверное, это лучшй вариант, нажал и провел камерой по обьекту.
спасибо.
Была идея запустить нейронку сразу на телефоне, и выбирать хорошие кадры прямо ей. На практике, она работала слишком медленно (пару секунд на детектирование), так что эту идею пока отложили. Специально ничего не затачивали под мобильные, если не считать стандартных методик компрессии моделей, которые предлагает pytorch из коробки.
Для таких алгоритмов нужно большее количество фоток, плюс обычно приходится убирать артефакты. А вообще да, это все работает, плюс даже есть специальные девайсы для более удобного сканирования.

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


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

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

с помощью машинного обучения

Но причём тут машинное обучение? И RANSAK и OpticalFlow — достаточно классические алгоритмы (Ок, OF можно сделать через нейронки, но тут это не рассмотренно). Плюс набор эмпирик чтобы всё попристойне выглядело.
По заголовку я надеялся будет какой-нибудь очередной подход без RANSAK, типо этого.

ZlodeiBaal, ну извините, что не оправдал надежды :)
Что касается машинного обучения — это более широкая область, она не обязательно включает в себя нейронные сети.

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

Сдаюсь! "Компьютерное зрение" здесь действительно лучше подходит.

Я не спорю, что включает:)
Но всё же и RANSAK — это чисто логический алгоритм перебора гипотез и поиска оптимальной, а OpticalFlow, где нет нейронок — либо алгоритмы дифференциального анализа, либо опять же, какая-то логика, либо матан.
В матчинге вы сами говорите что KNN, который сложно назвать ML.

Так что в базовом пайплайне ни SVM ни Boost'инговых алгоритмов не вижу.

Но я только к заголовку придираюсь, всё остальное — ок:)

А можно вопрос немного не по теме: если есть фотографии человека с младенчества до подросткового возраста — как-то можно автоматически обработать в гифку, чтобы показать изменения лица во времени?

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

Спасибо! А не знаете, может быть есть какие-то уже готовы подобные скрипты и решения?

Прямо готовых я не знаю, но знаю, что есть целая куча готовых библиотек по распознаванию лиц. Тут главное найти такие, которые ищут не просто bounding box, а выделяют keypoints (глаза, и т.д.), чтбы их можно было точно совмещать в автоматическом режиме.
Для этого нужно брать специальную нейронную сеть — таких архтитектур (даже уже обученых) хватает.
Попробовал поискать — есть готовая библиотека для Python github.com/ageitgey/face_recognition.

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


https://colab.research.google.com/drive/1ShgW6wohEFQtqs_znMna3dzrcVoABKIH#scrollTo=rYdsgv4i6YPl вот тут пример работы проектора.

Спасибо! Крутая штука похоже.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории