Ориентация мобильного робота, выбор способа регистрации особых точек изображений

    Это предыстория и продолжение статьи:

    Дело было вечером… все статьи на Хабре были прочитаны, затеял «небольшой» проект по автономной ориентации робота на RaspberryPi 3. С железом проблем нет, собирается недорого из г-на и палок купленных на ебау деталек, камера с хорошей стеклянной оптикой (это важно для стабильности калибраций), привод камеры вверх, вниз и компас, гироскоп и тд прикрепленные к камере:



    Существующие системы SLAM не устраивают, или по цене, или по качеству/скорости. Поскольку наработок деталей для Visual SLAM у меня много, решил шаг за шагом писать и выкладывать алгоритмы и код в открытый доступ, с обоснованием причин выбора тех или иных алгоритмов.

    В целом план следующий (всё на C++, кроме последнего):

    1. Захват видео с камеры (в основном скопипастен написан)
    2. Выделение особых точек на каждом 1/1-1/8 кадре изображения (написан)
    3. Регистрация особых точек (написан)
    4. Трассировка особых точек (пишется, несложно)
    5. 3D Реконструкция облака точек и координат камеры в нем (пишется, не очень сложно)
    6. Драйверы моторов, компаса и тд(в основном скопипастен написан)
    7. Написание хотя бы примитивной логики верхнего уровня, для отладки предыдущего кода (куда и зачем двигаться, на питоне, пока отложено)

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

    У алгоритмов связывания (matching) точек есть 3 характеристики:

    1. recall (какой процент точек связан верно из всех детектированных)
    2. precision (какой процент точек связан верно из всех связанных)
    3. скорость (время детекции и связывания)

    Поскольку связанные точки используются в дальнейшем для нахождения матрицы трансформации при помощи RANSAC метода сложность которого ~O((1/precision)^N) где N — минимальное число пар связанных точек необходимое для вычисления данной матрицы. Если вы ищите плоскость (homography matrix) в 3D (спроецированную в 2D), то N=4, если жесткую трансформацию 3D точек (fundamental matrix), то N=5-8. То есть если, например, precision = 0.1(10%), то для поиска homography вам потребуется десятки тысяч недешевых проб, а для fundamental миллионы. Поэтому был разработан и протестирован алгоритм с высоким precision.

    Для проверок алгоритмов детектирования и связывания существует стандартный набор изображений предложенный Mikolajczyk и др. (включенный в дистрибуцию opencv opencv_extra)
    В данном наборе 8 сетов изображений, каждый сет состоит из 6 картинок.

    Первая картинка референсная. Остальные пять искаженные, с нарастающей величиной искажений. Каждый сет — для своего типа искажений (вращение, сдвиг, масштаб, выдержка, параллакс, размазывание, де-фокусировка, артефакты сжатия) Вот результаты для различных алгоритмов (SIFT, SURF, AKAZE, BRISK, ORB и разработанного BOEV (Bigraph Oriented Edge Voting)), вертикальная шкала — проценты (больше лучше) и горизонтальная номер картинки в сете (больше- сложнее). Справа от названия алгоритма — время исполнения сета (detection + decription + matching).

    Set bark (scale+rotation) precision:



    recall:



    Set bikes (shift + smooth) precision:



    recall:



    Set wall (perspective distortion) precision:



    wall recall:



    Видимые результаты регистрации на примере wall (красные — false positive, зеленые true positive)



    Остальные картинки и исходный код в поддиректории test.

    Заключение


    Данный алгоритм показал себя в тестах очень достойно и будет использован в топик проекте.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 9
    • 0
      Какая функция у светодиодной матрицы за шлейфом камеры?
      • 0
        Посветка и она де не на месте Была выдрана из сломанного готового фонарика с юсб зарядкой. Методом тыка и скопа нашёл сигнальный провод на плате для вкл/выкл. Вроде 4 линии диодов по 8 параллель. И чип с преобразованием вверх
      • 0
        Не флейма ради, а интереса для :)
        Вы не смотрели на библиотечку VINS-Mono? Вроде ее скорости и точности хватает для того чтобы на мобильниках делать вполне приличный AR, так что роботу вообще должно быть за глаза…
        • 0
          VINS-Mono? Посмотрел.
          1 Телефоны сейчас заметно быстрее чем распи 3.
          2 Инициализацию проводят с использованием гироскопа, что по идее верно, но мне так не интересно.
          3 Кроме того робот не самоцель, а средство отладки хобби проекта SLAM :)
          • 0
            И не просто быстрее, а хорошо так быстрее, раза в 2.

            из VINS-Mobile:
            Compatible Devices and iOS version requiements

            iPhone7 Plus, iPhone7, iPhone6s Plus, iPhone6s, iPad Pro
            iOS 10.2.1 and above
          • 0
            Расширения кругозора ради… На самого бота есть какие-то ссылки?
            • 0
              Пока нет, но предполагаю выкладывать по мере написания
            • +1
              Было бы очень интересно взглянуть на описание алгоритма BOEV
              • 0
                Так в начале статьи -первая ссылка на статью в хабре

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.