Перейти к содержимому
Compvision.ru
prim.ko

Сравнение изображений

Recommended Posts

Как насчёт того чтобы натренировать siamese network для определения меры похожести тайлов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
48 minutes ago, prim.ko said:

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

Куда смотреть?

На пальцах: увидели объект А класса дом, увидели объект Б класса дом, рассчитали центр масс, сравнили расстояние. ищем что-то похожее в базе

Меня всё таки не покидает мысль о ключевых точках. Найти их на карте, хранить. Они же содержат в себе и масштаб также, часто точка+дескриптор - описывают целое озеро. Или вообще что-то типа MODS посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
34 минуты назад, Nuzhny сказал:

Меня всё таки не покидает мысль о ключевых точках. Найти их на карте, хранить. Они же содержат в себе и масштаб также, часто точка+дескриптор - описывают целое озеро. Или вообще что-то типа MODS посмотре

Получается при сравнении дескрипторов будем будем пользоваться обычнмы матчером?

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1,des2)
matches = sorted(matches, key = lambda x:x.distance)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для начала - да.

Тут ещё вопрос - сколько ключевых точек будет на снимке и в этом месте на карте. Очень часто делают итеративно (кадр меньше карты, на нём ключевых точек меньше):

1. Находят все соответствия точек кадра к точкам карты, это может быть один ко многим (одно соответствие на кадре может соответствовать 0, 1, 2,... точкам на карте).

2. Находят область на карте, куда выпадает большая часть соответствий.

3. Если область карты по масштабу больше снимка, то повторяются шаги 1-2.

4. Если область карты по масштабу совпадает со снимком, то ищут уже соответствия методом, который ты привёл: один к одному, чтобы совпадали в обе стороны.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 часов назад, mrgloom сказал:

Как насчёт того чтобы натренировать siamese network для определения меры похожести тайлов?

Как выглядит реализация этого решения? Это будет как на imagenet`e?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, prim.ko сказал:

Как выглядит реализация этого решения? Это будет как на imagenet`e?

Не понял что вы имеете ввиду, на вход подаются пары похожие пары тайлов и не похожие пары тайлов, после обучения сеть отвечает на вопрос похожи ли 2 конкретных тайла или нет, есть еще tripple loss где подаются тройки, но идея примерна такая же.

 

В репе Keras'a есть пример, наверно можно улучшить заменив MLP на CNN.

https://github.com/fchollet/keras/blob/master/examples/mnist_siamese_graph.py

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здесь интересное применение GAN, может пригодится:

https://github.com/hiwonjoon/cycle-gan-tf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проблема давно решена при помощи семантической+Монте карло

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 minutes ago, prim.ko said:

при помощи семантической

При помощи чего?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Nuzhny сказал:

При помощи чего?

Семантическая сегментация на U-Net. Дальше использовал непараметрическое восстановление плотности, используя центры масс зданий. Затем матрица "плотностей" использовалась в монте-карло. С учетом известной точки старта полета по GPS или по ручному вводу выходит вполне сносно. Подключаем еще на сегментации класс дороги, деревья и вероятности "гуляют" еще меньше.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно поподробней что после U-net происходит? плотности чего? монте-карло для чего?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, mrgloom сказал:

Можно поподробней что после U-net происходит? плотности чего? монте-карло для чего?

По монте-карло все просто:

Имеем карту мира( например бинарную карту на которой отмечены дома ). Переводим карту в матрицу вероятностей. Снимаем далее показания с сенсора (камеры в моем случае), сегментируем и рассчитываем вероятность пребывания в какой либо точке на карте используя эту матрицу вероятностей. Затем берем следующее показание сенсора (следующий кадр) и при помощи лукаса-канаде вычисляем корреляцию. Это будет значением, на которое мы сдвинулись. Снова рассчитываем вероятности, которые в этот раз изменятся. Чем выше вероятность какой либо точки - значит выше вероятность нашего там пребывания. 

В качестве самого простого способа можно тупо брать значение центрального пикселя сегментированного изображения и подавать это значение в монте-карло, но это долго. Потому что если генерировать матрицу вероятностей ( то что является нашим миром) из всех пикселей карты-подложки - это будет очень медленно. Представь у тебя карта-подложка размером 10к*10к пикселей = 100000000 матрица. И при каждом новом показании сенсора (камеры) тебе это все просчитывать. Поэтому нужна какая-то метрика, описывающая объекты на карте-подложке (здания). Тут я использую метод непараметрического восстановления плотности. По всей карте-подложке рассчитываем центры масс зданий и применяем куполообразную функцию, что-то типо:

@staticmethod
    def nonparametric_estimation(points, x_grid, y_grid, x_size, y_size):
        """
        :param points: array of points (center of mass)
        :param x_grid: coordinate x of grid
        :param y_grid: coordinate y of grid
        :param x_size: window size
        :param y_size: windows size
        :return:
        """

        def f(z):
            if math.fabs(z) < 1:
                return 1 - math.fabs(z)
            else:
                return 0

        value = 0
        count = 0

        for i in range(len(points)):
            if math.fabs(x_grid - points[i][0]) < x_size and math.fabs(y_grid - points[i][1]) < y_size:
                value += f((x_grid - points[i][0]) / x_size) * f((y_grid - points[i][1]) / y_size)
                count += 1

        if count > 0:
            return value / count
        else:
            return 0

Это необходимо для того чтобы уменьшить размер матрицы вероятностей. Тут зависит от шага, с которым будем рассчитывать плотность. Я использовал шаг 5 пикселей. Только например, если БЛА летит на высоте 900м, а карта-подложка была сделана с 500 метров,  в этом случае нужно кропать изображение до размера с которым рассчитывались значения плотностей.

Получается вот такая красивая картинка для изображения:

nonparam_est.thumb.png.51962779f7a97f68cf8c6aa325c2b4ca.png 

austin3.thumb.png.f39388b5efc6654e720b6f14af66fbca.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×