company_banner

Методы распознавания 3D-объектов для беспилотных автомобилей. Доклад Яндекса

    Беспилотному авто не обойтись без понимания, что находится вокруг и где именно. В декабре прошлого года разработчик Виктор Отлига vitonka выступил на «Дата-елке» с докладом о детекции 3D-объектов. Виктор работает в направлении беспилотных автомобилей Яндекса, в группе обработки дорожной ситуации (а также преподает в ШАДе). Он объяснил, как мы решаем задачу распознавания других участников дорожного движения в трехмерном облаке точек, чем эта задача отличается от распознавания объектов на изображении и как извлечь пользу из совместного использования разных типов сенсоров.


    — Всем привет! Меня зовут Виктор Отлига, я работаю в офисе Яндекса в Минске, занимаюсь разработкой беспилотных автомобилей. Сегодня я расскажу о достаточно важной задаче для беспилотников — распознавании 3D-объектов вокруг нас.



    Чтобы ездить, надо понимать, что находится вокруг. Я коротко расскажу, какие датчики и сенсоры используются на беспилотных автомобилях и какие используем мы. Расскажу, что представляет собой задача детекции 3D-объектов и как померить качество детекции. Потом расскажу, на чем это качество можно мерить. И потом сделаю краткий обзор хороших современных алгоритмов, в том числе тех, на идеях из которых основаны наши решения. А в конце — маленькие результаты, сравнение этих алгоритмов, и нашего в том числе.



    Примерно так сейчас выглядит наш рабочий прототип беспилотного автомобиля. Именно такое такси может прокатить любого желающего без водителя в городе Иннополис в России, а также в Сколково. И если приглядеться, сверху большая плашка. Что же там внутри?



    Внутри нехитрый набор сенсоров. Есть антенна GNSS и GSM, чтобы определять, где находится автомобиль, и иметь связь с внешним миром. Куда же без такого классического датчика, как камеры. Но нас сегодня будут интересовать лидары.





    Лидар выдает примерно такое облако точек вокруг себя, у которых есть три координаты. И с ними приходится работать. Я расскажу, как, используя картинку с камеры и лидарное облако, распознать какие-нибудь объекты.



    В чем задача? На вход поступает картинка с камеры, камера синхронизирована с лидаром. Было бы странно использовать картинку с камеры секунду назад, брать лидарное облако совсем с другого момента и пытаться на нем распознать объекты.



    Мы как-то синхронизируем камеры и лидары, это отдельная непростая задача, но мы с ней успешно справляемся. На вход поступают такие данные, и в конце хотим получить коробочки, bounding boxes, которые ограничивают объект: пешеходов, велосипедистов, машин и прочих участников дорожного движения и не только.

    Задачу поставили. Как мы будем ее оценивать?



    Широко изучена задача 2D-распознавания объектов на изображении.


    Ссылка со слайда

    Можно воспользоваться стандартными метриками или их аналогами. Есть коэффициент Жаккарда или intersection over union, замечательный коэффициент, который показывает, насколько хорошо мы объект задетектили. Можем взять коробочку, где, как мы предполагаем находится объект, и коробочку, где он находится на самом деле. Посчитать эту метрику. Есть стандартные пороги — допустим, для машин часто берут порог в 0,7. Если эта величина больше, чем 0,7, мы считаем, что успешно задетектировали объект, что объект там находится. Мы молодцы, можем ехать дальше.

    Кроме того, чтобы задетектить объект и понять, что он где-то есть, нам хотелось бы считать какую-то уверенность в том, что мы действительно видим там объект, и ее тоже мерить. Можно мерить нехитро, считать среднюю точность. Можно взять кривую precision recall и площадь под ней и говорить: чем она больше, тем намного лучше.


    Ссылка со слайда

    Обычно для измерения качества 3D-детекции берут датасет и делят его на несколько частей, потому что объекты могут находиться близко или дальше, могут быть частично заслонены чем-то другим. Поэтому часто валидационную выборку делят на три части. Объекты, которые легко задетектировать, средней сложности и сложные, далекие или которые заслонены сильно. И меряют отдельно на трех частях. И в результатах при сравнении мы тоже будем брать такое разбиение.



    Мерить качество можно как в 3D, аналог intersection over union, но уже не отношение площадей, а, например, объемов. Но беспилотному автомобилю, как правило, не очень важно, что творится по координате Z. Мы можем взять вид сверху, bird’s eye view, и считать какую-то метрику, как будто мы смотрим это все в 2D. Человек навигируется более-менее в 2D, и беспилотный автомобиль так же. Насколько высока коробочка, не очень часто важно.



    На чем мерить?



    Наверное, все, кто хоть как-то сталкивался с задачей детекции в 3D по лидарному облаку, слышали о таком датасете, как KITTI.


    Ссылка со слайда

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



    Внешние датасеты — это хорошо, на них не надо тратить свое время и ресурсы, но как правило, машина, которая ездила в Германии, может быть оборудована совсем другими датчиками. И всегда хорошо иметь свой внутренний датасет. Тем более внешний датасет расширять за счет других тяжелее, а свой проще, можно этим процессом управлять. Поэтому мы используем замечательный сервис Яндекс.Толока.



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

    Допустим, мы определились, какую задачу мы будем решать, как будем считать, что мы это сделали хорошо или плохо. Взяли где-то данные.

    Какие есть алгоритмы? Начнем с 2D. Задача детекции 2D очень хорошо известна и изучена.


    Ссылка со слайда

    Наверняка многие знают об алгоритме SSD, который является одним из state of the art методов детекции 2D-объектов, и в принципе можно считать, что в некотором роде задача детекции объектов на изображении достаточно хорошо решена. Если что, мы можем пользоваться этими результатами как какой-то дополнительной информацией.

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

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

    Мы бы хотели придумать такую систему, которая будет инвариантна к нашим проблемам, будет все эти проблемы решать. Благо на прошлом CVPR в прошлом году такую систему презентовали. Была такая архитектура — PointNet. Как она работает?



    На вход поступает облако, n точек, у каждой три координаты. Потом каждая точка каким-то образом стандартизируется специальным маленьким трансформом. Дальше прогоняется через полносвязную сеть, чтобы эти точки обогатить признаками. Потом опять происходит трансформация, и в конце обогащается дополнительно. В какой-то момент получается n точек, но у каждой примерно по 1024 признака, они как-то стандартизированы. Но пока что мы не решили проблему относительно инвариантности сдвигов, поворотов и так далее. Здесь предлагается сделать max-pooling, взять по каждому каналу максимум среди точек и получить какой-то вектор из 1024 признаков, который будет являться некоторым дескриптором нашего облака, который будет сжато содержаться информацию обо всем облаке. А дальше с этим дескриптором можно делать много разных вещей.


    Ссылка со слайда

    Например, можно подклеивать его к дескрипторам отдельных точек и решать задачу сегментации, для каждой точки определять, к какому объекту она принадлежит. Это просто дорога или человек, или машина. И тут представлены результаты из статьи.


    Ссылка со слайда

    Можно заметить, что этот алгоритм очень хорошо справляется. В частности, мне очень нравится тот столик, в котором часть данных о столешнице выкинули, и он, тем не менее, определил, где ножки и где столешница. И этот алгоритм, в частности, можно использовать как кирпичик для построения дальнейших систем.

    Одним из подходов, которые это используют, является подход Frustum PointNets или подход с усеченной пирамидой. Идея примерно такая: давайте распознаем объекты в 2D, это мы хорошо умеем делать.



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


    Ссылка со слайда

    Архитектура выглядит примерно так. Сначала мы как-то выделяем регионы, которые нас интересуют, в каждом регионе делаем сегментацию, а потом решаем задачу нахождения bounding box, который ограничивает интересующий нас объект.



    Подход себя зарекомендовал. На картинках можно заметить, что он достаточно хорошо работает, но в нем есть и недостатки. Подход двухуровневый, из-за этого он может быть медленным. Нам нужно сначала применить сети и распознать 2D-объекты, потом вырезать, а потом уже решить на кусочке облака задачу сегментации и выделения bounding box, поэтому он может работать немного медленно.

    Другой подход. Почему бы нам не превратить наше облако в какую-нибудь структуру, похожую на картинку? Идея такая: давайте посмотрим сверху и дискретизируем наше лидарное облако. Получим кубики пространств.


    Ссылка со слайда

    Внутри каждого кубика к нам попали какие-то точки. Можем какие-то фичи по ним посчитать, а можем применить PointNet, который для каждого кусочка пространства посчитает какой-то дескриптор. У нас получится воксель, у каждого вокселя признаковое описание, и это будет более-менее похоже на плотную структуру, как у картинки. Мы уже сможем делать разные архитектуры, например SSD-подобную архитектуру для детекции объектов.



    Последний подход, который был одним из самых первых подходов к объединению данных с нескольких сенсоров. Было бы грешно использовать только лидарные данные, когда у нас есть еще и данные с камер. Один из этих подходов называется Multi-View 3D Object Detection Network. Его идея в следующем: подадим на вход большой сети сразу три канала входных данных.


    Ссылка со слайда

    Это картинка с камеры и, в двух вариантах, лидарное облако: сверху, с bird’s-eye view, и какое-то представление спереди, то, что мы видим впереди себя. Подадим это на вход нейронке, и она сама внутри себя все сконфигурирует, будет выдавать нам конечный результат — объект.

    Хочется сравнить эти модели. На датасете KITTI, на валидационных проездах, качество оценивается как проценты в average precision.



    Можно заметить, что F-PointNet работает достаточно хорошо и достаточно быстро, выигрывает у всех остальных на разных областях — по крайней мере, по заявлениям авторов.

    Наш подход основывается на более-менее всех идеях, что я перечислил. Если сравнивать, получается примерно следующая картинка. Если мы не первое место занимаем, то как минимум второе. Причем на тех объектах, которые детектить достаточно сложно, мы вырываемся в лидеры. И что самое главное, наш подход работает достаточно быстро. Это означает, что он уже достаточно хорошо применим для realtime-систем, а ведь беспилотному автомобилю особенно важно мониторить, что же происходит на дороге, и выделять все эти объекты.



    В завершение — пример работы нашего детектора:


    Видно, что ситуация сложная: часть объектов закрыты, часть — не видны камере. Пешеходы, велосипедисты. Но детектор достаточно хорошо справляется. Спасибо!
    Яндекс
    562,00
    Как мы делаем Яндекс
    Поделиться публикацией

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

      +2
      Благодарю за отличную статью!
      Если из сенсоров только Realsense D435 то какой алгоритм будет работать лучше?
        +1
        А в чем именно заключается Ваш подход? Это какой-то оптимизированный вариант перечисленных подходов или кардинально другой?
          +2
          Как поведут себя лидары, если на дороге встретятся 20 беспилотников с лидарами и начнут светить друг другу?
          А ещё как влияют многкратные отражения лазерного луча от разных поверхностей на работу лидара? Например, луч отразился от поверхности авто, от окна здания и вернулся с другого направления?
            +1
            Очень познавательно, спасибо! Можно несколько вопросов? На сколько я знаю, инженеры Tesla делают автопилот без лидаров, окружающая обстановка меряется только по (стерео)камерам. Как сильно помогает облако точек от лидара? Используете ли вы камеры видимого спектра? Как ведет себя лидар в сильный снегопад? И как вообще разные погодные условия влияют на качество распознавания объектов?
              0
              Нет ни слова о применении радаров. Яндекс не использует радарные датчики?
              Контролировать окружающую обстановку в оптическом диапазоне это, конечно, хорошо, но мало, т.к. при наличии дождя, снега, тумана и т.д. эффективность таких датчиков резко снижается. Поэтому сейчас многие используют радарные датчики, работающие в диапазоне 24 ГГц и/или 77 ГГц.
                0
                Как радар работает на расстояниях в несколько метров? Скорость радиосигнала 30 000 000 км/с, от пешехода на расстоянии 15 м эхо придёт за 0,000000001с. Неужели электроника радара способна заметить такое малое время с нужной точностью?
                  +1
                  Давайте по порядку:
                  1. Вас же не смущает, что камера или лидар работают на таком расстоянии? Хотя скорость распространения сигнала примерно такая же.
                  2. Вы немного ошиблись (в 100 раз), написав, что скорость радиосигнала 30 000 000 км/c. В свободном пространстве скорость распространения, примерно, 3*10^8 м/c или 300 000 км/с Поэтому эхо придет примерно за 0,1 мкс (вроде, не ошибся). Так что электронике уже отводится немного побольше времени и она будет успевать :)
                  3. Дело в том, что автомобили оснащаются датчиками (РЛД) нескольких типов. Условно их можно разделить на датчики дальнего (около 150-300 метров) и ближнего обзора (около 15-50 метров). Получается, что цель захватывается и сопровождается радарным датчиком дальнего обзора еще на расстоянии около 150-300 метров (т.е. у системы есть около 1-2 мкс, чтобы отреагировать на цель). Т.е. система не пытается работать «с нуля» на расстоянии 15 м от цели, а ведет цель с того момента, когда она была обнаружена РЛД дальнего обзора. Постоянно происходит накопление и обработка информации, поэтому при сокращении расстояния до цели до некой пороговой величины система либо подаст сигнал водителю, либо начнет торможение и остановку транспортного средства (ТС). РЛД ближнего обзора позволяют контролировать боковое сближение с другими ТС.
                  Это очень кратко. Если же вам интересно узнать немного подробнее об этой технологии, то делюсь ссылками на материалы:
                  1) "Датчики. Актуальные технологии и применения датчиков автомобильных систем активной безопасности. Часть 6. Радары" — конечно, этот материал нельзя назвать свежим, но он все еще актуален.
                  2) "Измеритель дальности и скорости на железнодорожном транспорте" — система, построенная на базе автомобильного радара. Приводятся типовые значения дальности, погрешности. Диапазон частот тот же, что и в автомобильных радарных датчиках.
                  3) "Автомобильные радары: история, практика, перспектива (до 2006)" — интересная обзорная статья по РЛД различных диапазонов.
                    0
                    1. Нет, по тому, что лидар и камера работают не по принципу эхолокации. Там мгновенное распространение сигнала как раз помогает. Радар работает по принципу радиолокации ru.wikipedia.org/wiki/Радиолокация#Основные_методы_радиолокации, и определяет расстояние до объекта по формуле D = 2T/c, где Т- время, а с — скорость света. Ни к лидару, ни к камере это не отностится
                    2. Да, ошибся, верно. Но 0.1 мкс это тоже время на грани возможностей электроники. Если справляется — ок. Но, опять-таки, с какой точностью она сможет замерить эти 0.1мкс? Ошибка всего на 0.05мкс это уже 50% и 7,5м — существенно.
                    3. Основные проблемы с пешеходами возникают не когда они были в поле зрения за 300м, а именно когда они появились в нём внезапно на дистанции сопоставимой с тормозным путём

                    Спасибо за ссылки. С удивлением узнал из первой, что радары применяются на расстояниях от 0,2м. В голове не укладывается, но интересно :-)
                      0
                      Давайте еще раз по порядку :)
                      1. Лидар — это активная система, принцип работы которого схож с радаром, т.е. лидар излучает и принимает отраженный сигнал. Разница только в том, что лидар с работает в оптическом диапазоне, а радар — в радиодиапазоне. Поэтому время распространения сигнала у лидара и РЛД примерно одинаковые. Проблема в том, что наличие тумана, дождя, снега или просто запыленность или загазованность воздуха могут стать критичными для работы лидара. А вот на сигнал РЛД эти факторы влияют в меньшей степени, чем на сигнал лидара. Хотя тоже влияют.
                      Аналогично и с камерами, т.к. для улучшения работы камеры в темное время суток может использоваться инфракрасная подсветка. Хотя в светлое время суток камера может не использовать подсветку.
                      Получается, что чисто пассивной системой можно считать только камеру (без подсветки). Но при этом она будет малоэффективна в услових низкой освещенности (правда, есть автомобильный свет, который можно считать активной подсветкой для камеры :) ).
                      2. Тут все зависит от алгоритмов обработки и скорости вычислителя. Но идея именно в том, что система следит за обстановкой постоянно.
                      3. Если пешеход появляется перед ТС на дистанции, сопоставимой с тормозным путем, то не поможет, ни камера, ни лидар, ни радар, т.к. ТС просто физически не успеет затормозить. Хотя тут тоже очень много нюансов в плане ситуаций и сценариев их возникновения. Например, если пешеход возник неожиданно из-за рядом стоящего ТС (например, на светофоре), то РЛД его (пешехода) обнаружит и не даст водителю поехать даже если тот уже нажал на педаль газа. Дистанции обнаружения вы сами видели в статьях.
                      А вот если пешеход появляется сзади или сбоку, когда водитель его не видит, то РЛД в этой ситуации может предупредить водителя, подав сигнал, или включив торможение.

                      Опять же, РЛД и камера, как правило, используется совместно, взаимно дополняя друг друга и компенсируя недостатки друг друга.
                        0
                        1. Есть 3 метода измерения, используемые в лидарах, импульсный лишь один из них.Потому я думал, что на коротких дистанциях импульсные не используется. Но, теперь вижу, что используется. Высокоточный таймер усложняет и удорожает устройство. Помимо импульсного на малых расстояниях до 15м используется фазовый. А вообще-то самый простой способ — особенно на расстояниях от долей до десятков метров — триангуляционный www.prst.ru/docs/triangul-prinzip.pdf — именно его я имел в голове, когда говорил о лидарах. Для радара он не применим.
                        2. да
                        3. Вот как раз вы не правы. Время реакции водителя 0.4-0.6с, у робота почти мгновенно. Кроме того, робота теоретически можно научить сложным манёврам ухода вбок, а водителей никогда этому учить не будут — только тормози в пол. Так что потенциал сохранения жизней пешеходам тут очень существенный. Так что умение вовремя заметить внезапного пешехода на короткой дистанции — очень ценно.
                          0
                          Про замеры времени 0.1 мкс. Есть же еще один параметр которым можно жертвовать для увеличения точности — latency, или пинг по русски. Т.е. банально умножая оптический путь измеряем бОльшее расстояние, жертвуя запаздыванием измерения. Как это технически делать — отдельная тема.
                        0
                        '2. Да, ошибся, верно. Но 0.1 мкс это тоже время на грани возможностей электроники

                        За 0.1 мкс можно небольшие матрицы перемножить, это же целых 100нс! Несколько сотен операций для таких монстров, как CPU. А нужно лишь время замерить. Но детектор смещения фазы, как понимаю, реализуется намного более просто, чем процессор или даже счётчик.


                        Кстати, бытовые лазерные дальномеры имеют точность порядка 3мм.

                  0
                  Те, кто ездил по дорогам России, знают, что есть куча перекрестков, выехать с которых невозможно, если тебя не пропустит кто-то из водителей, имеющих тем не менее преимущество в движении. На таком месте, автопилот будет стоять сутки на второстепенной дороге и проедет часа в 4 ночи, когда поток по главной дороге иссякнет.
                  Как решается такая проблема? Автопилот научится распознавать кивок другого водителя, означающий, что тебя пропускают?
                    0
                    На таком месте, автопилот будет стоять сутки на второстепенной дороге

                    Алгоритм живого водителя довольно прост — 1) в меру нагло медленно высовываемся, чтобы вас заметили, но не зацепили; 2) как только на главной встречается ТС, которое снижает скорость достаточно, чтобы вы проехали без столкновений, это значит, что вас пропускают, и вы едете. Аналогично с другой стороны, достаточно пропускать высунувшихся с какой-то вероятностью.

                    0
                    Про toloka, и расстановку баунд боксов… Неужели так трудно сгенерить синтетические данные где заранее известны все эти боксы. В наше то время, если уж в риал тайме фотореализм рендерится то облако точек то точно можно. Вообще синтетические данные и тесты как то используются?
                      0
                      Я видел вакансии в фирмы, которые генерят такие данные. Но также читал что нейросети на таких данных ведут себя не так как на реальных.
                        0
                        Но если «на глаз» данные выглядят одинаково, а распознаватель (нейросеть в данном случае) ведет себя как то по разному — я скорее засомневаюсь в распознавателе, потому что он явно цепляется ни за те данные которые мы от него хотим. Это в общем то и проблема всех нейросетей, что мы не понимаем а что они в действительности там распознают. И как раз набор разных тестов, в том числе синтетических, дает хоть какую то гарантию что алгоритм решает нужную нам задачу, и делает это надежно.
                      0
                      Я посмотрел ваш график точности, если взять самую дальнюю точку на medium графике, получается precision и recall ~~0.8. Это что же, получается при детекции машин на картинке, 20% будут ложными срабатываниями, а 20% машин не будут обнаружены? Что-то это как-то маловато для отказоустойчивой системы. Я читал обзоры работ по детекции пешеходов, в целом вывод такой же был примерно — пока всё плохо, если пешеход перекрыт, то надежно различить его можем в <60% случаев.

                      Ну и ещё я правильно понимаю, что ночью пешеходов детектить эта система не умеет?

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

                      Самое читаемое