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

prim.ko

Пользователи
  • Количество публикаций

    42
  • Зарегистрирован

  • Посещение

  • Days Won

    2

Все публикации пользователя prim.ko

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

    По монте-карло все просто: Имеем карту мира( например бинарную карту на которой отмечены дома ). Переводим карту в матрицу вероятностей. Снимаем далее показания с сенсора (камеры в моем случае), сегментируем и рассчитываем вероятность пребывания в какой либо точке на карте используя эту матрицу вероятностей. Затем берем следующее показание сенсора (следующий кадр) и при помощи лукаса-канаде вычисляем корреляцию. Это будет значением, на которое мы сдвинулись. Снова рассчитываем вероятности, которые в этот раз изменятся. Чем выше вероятность какой либо точки - значит выше вероятность нашего там пребывания. В качестве самого простого способа можно тупо брать значение центрального пикселя сегментированного изображения и подавать это значение в монте-карло, но это долго. Потому что если генерировать матрицу вероятностей ( то что является нашим миром) из всех пикселей карты-подложки - это будет очень медленно. Представь у тебя карта-подложка размером 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 метров, в этом случае нужно кропать изображение до размера с которым рассчитывались значения плотностей. Получается вот такая красивая картинка для изображения:
  2. Сравнение изображений

    Приветствую! Думаю я обращусь по адресу со следующей задачей: Необходимо вычислить позиционирование объекта по карте местности. Объект производит снимки, камерой направленной вниз. Кадр из видеопотока можно обработать какой-нибудь нейронной сетью чтобы за что-нибудь зацепиться, и уже относительно классифицированного объекта плясать. Можно просто рассчитать перцептивный хэш изображения и сравнить с базой. Можно применить контурный анализ. Попробовал реализацию хэшем: Слева направо - изображение полученное объектом, изображение из Google maps расстояние = 15 Слева направо - Google maps, Yandex maps Расстояние = 7 Метод показывает вроде неплохие результаты. Если заранее загрузить спутниковую карту с максимальным уровнем тайлов, и перегнать каждый тайл в хэш, то получим быстрый результат при сравнении с таблицей хэшей. Вот только делается ли так? Второй вариант который я попробовал это контурный анализ при помощи Hu моментов: Подал на вход сегментированное сетью изображение, в котором белым залит класс "вода". Затем подал векторную карту в качестве шаблона. Получилось не очень хорошо. Алгоритм выделил контур в самой нижней части изображения (окно find). Если подать на вход маску а не изображение совмещенное с результатами сегментации, то вроде бы как алгоритм срабатывает: Немного не то нашел, ну да ладно. Близко. Минус данного алгоритма в том, что если у меня будет множество шаблонов, скажем это будут все озера и реки в округе, и я стану сравнивать изображение на котором не полностью уместилось в кадр озеро или река, то ничего хорошего не выйдет из этого, так как контур не полностью замкнет водную поверхность. Что посоветуете в данной ситуации? Только не нужно вопросов про GPS, на то оно и тех. зрение, для того и спрашиваю совета на данном форуме.
  3. Ученые мужики, подскажите что почитать по проектированию сетей на Caffe. Дело в том, что пытаюсь переписать U-Net на Caffe. И описание моделей в prototxt это совсем не ванильный Keras. Многое, что в Keras остается "черным ящиком" теперь не дает мне построить сетку на Caffe. Например начал с первой группы слоев U-Net (Картинка взята из dstl) layer { name: "label" type: "Data" top: "label" include { phase: TRAIN } transform_param { mirror: true } data_param { batch_size: 5 backend: LMDB } } layer { name: "data" type: "Data" top: "data" include { phase: TEST } transform_param { mirror: true } data_param { batch_size: 5 backend: LMDB } } layer { name: "label" type: "Data" top: "label" include { phase: TEST } transform_param { mirror: true } data_param { batch_size: 5 backend: LMDB } } # data layers layer { name: "data" type: "Data" top: "data" include { phase: TRAIN } transform_param { mirror: true } data_param { batch_size: 5 backend: LMDB } } #-------------layer group 1--------------- layer { name: "conv1a" type: "Convolution" bottom: "data" top: "conv1a" convolution_param { num_output: 32 kernel_size: 3 pad: 1 stride: 1 engine: CUDNN weight_filler { type: "xavier" #std: 0.01 } bias_filler { type: "constant" value: 0 } } } layer { name: "conv1a_BN" type: "BatchNorm" bottom: "conv1a" top: "conv1a_BN" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false moving_average_fraction: 0.95 } } layer { name: "elu1" type: "ELU" elu_param { alpha: 1.0} bottom: "conv1a_BN" top: "conv1a_BN" } layer { name: "conv1b" type: "Convolution" bottom: "conv1a_BN" top: "conv1b" convolution_param { num_output: 32 kernel_size: 3 pad: 1 stride: 1 engine: CUDNN weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "conv1b_BN" type: "BatchNorm" bottom: "conv1b" top: "conv1b_BN" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false moving_average_fraction: 0.95 } } layer { name: "elu2" type: "ELU" elu_param { alpha: 1.0} bottom: "conv1b_BN" top: "conv1b_BN" } layer { name: "loss" type: "SoftmaxWithLoss" bottom: "conv1b_BN" bottom: "label" top: "loss" include: { phase: TRAIN } } После загрузки данной сетки в DIGITS - тишина. В качестве обучения использую разметку дорог toronto dataset https://www.cs.toronto.edu/~vmnih/data/ . Там бинарная разметка. В DIGITS подготовил датасет для сегментации. Интерполировал его к разрешению 500*500 и указал "color map specification" from text file. В нем указал 255 255 255 0 0 0 В общем не понятно, почему не шевелится DIGITS?
  4. Сравнение изображений

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

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

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

    Получается при сравнении дескрипторов будем будем пользоваться обычнмы матчером? bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1,des2) matches = sorted(matches, key = lambda x:x.distance)
  8. Сравнение изображений

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

    В общем Inverse compositial - это тоже хорошо, но он бесполезен в условиях сегментации. Наличие общих черт между предыдущим и текущим сегментированным кадром крайне невелико. При сравнении моментов между сегментированным изображением и векторной картой ничего толкового не выходит
  10. Сравнение изображений

    Почему-то у меня выходит x= 47.7060367454 y = 60.4724409449 import numpy as np def calc(tiles_arr, weights, tr): res = 0 weights = np.delete (weights, np.where (weights > tr)) for i in range (len(weights)): res += tiles_arr[i]*(1-weights[i]/(np.sum(weights))) return res / len(weights) weights=np.array([0.0017, 0.0028, 0.00185, 0.00427]) x = [0,256,0,256] y = [0,0,256,256] print (calc(x, weights, 0.004)) print(calc(y, weights, 0.004))
  11. Сравнение изображений

    Истинное положение объекта обведено красной рамкой, вычисленное моментами - зеленой рамкой (без всяких улучшений тупым сравниванием ). Поэтому на первой итерации зеленая рамка перекрывает красную - метрика = 0,0
  12. Сравнение изображений

    В скринах выводится метрика в каждом из тайлов ( сравнивается с текущим кадром ). Сейчас остановился на фазовой корреляции. Она дает отличные результаты в качестве "уточнения" области поиска абсолютных координат объекта. Если я не ошибаюсь, так работают всякие SASplanet и др. гис системы, при отображении глобальной карты на заданный масштаб. В ods dstl уже спрашивал совета. Оттуда и перенял опыт тренировки UNet и использования ее для данной задачи.
  13. Сравнение изображений

    Криво, но сделал в большом разрешении. Взято три итерации. На каждой итерации красное окно сдвигалось на 50 pix. #1 current min distance: 0.0 #2 current min distance: 0.0001358896369232954 #3 current min distance: 0.00016839950091911252 Взвешивать средним?
  14. Сравнение изображений

    Да, если ты имеешь ввиду значения между текущим кадром с бла и всеми тайлами векторной карты. Как это поможет?
  15. Сравнение изображений

    Вечер добрый. Хочу поделится тем, что у меня не получается в данной задаче. Рассмотрим идеальный случай, когда нейросеть сегментирует землю идеально, и возможно использовать векторную карту для вычисления абсолютных координат бла. Выполняю я следующее: В качестве подложки использую векторную карту местности. Векторную карту я разбиваю на тайлы 256*256 объединяя их в слои пирамиды, в которой кол-во слоев высчитываю как |log2(max(max(H,W), 256)/256|+1 H,W у меня размеры векторной карты. Далее я вычисляю для каждого тайла каждого уровня hu moments, сохраняю информацию на диск. Обучил нейронку на спутниковых снимках, скармливаю ей изображения с бла. hu moments сегментированного изображения сравниваю с каждым тайлом выбранного слоя в пирамиде, используя евклидову метрику. Слой в пирамиде выбираю основываясь на высоте бла Все хорошо, если изображение с бла совпадает с фрагментом из векторной карты, но когда изображение с бла "пересекает" несколько фрагментов из векторной карты, ничего хорошего не получается. Какие есть мысли по поводу всего этого? Как это победить? На примере красным - положение бла, зеленым - вычисленная позиция.
  16. Сравнение изображений

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

    Применимость зимой я не рассматривал как раз из-за низкой корреляции. В примере с контуром, который не замкнут как будет производиться сравнение? Ведь моменты дадут нам много совпадений. Тут нейронка может дать существенный прирост информации для существующих/модифицированных алгоритмов?
×