Всеволод Орлов, руководитель службы восприятия в Автономном транспорте Яндекса, выступил на конференции «Я Железо 2024». Он рассказал, благодаря чему автономный транспорт видит окружающий мир, как его органы зрения менялись и эволюционировали и какой софт позволяет роботам и машинам успешно ездить без человека в кабине.
Переложили выступление в текст для удобства читателей Хабра.
Чтобы построить визуальную картину окружающего мира, люди используют глаза: рассматривают объекты и осознают их состояние, а затем уже решают, как и куда двигаться. Но как видит и действует автономный транспорт?
Сегодня я расскажу про эволюцию машинного зрения автономного транспорта: какие датчики помогают нашим автомобилям воспринимать окружающий мир и что именно они видят.
ML в автономном транспорте
Вернёмся к окружающим нас объектам: чтобы взаимодействовать с ними, для начала нужно их осознать. В терминах машинного обучения это называется «задача 3D‑детекции». Чтобы решить эту задачу, мы работаем с трёхмерными объектами, которые делим на две большие группы:
Агенты — объекты, которые принимают активное участие в движении транспорта и могут учитывать наше поведение. Например, люди, машины или мотоциклы.
Статические препятствия — объекты, которые участвуют в дорожном движении пассивно и не могут взаимодействовать с нами по своей воле. Тем не менее учитывать их всё равно нужно.
Скрытый текст
Система планирования движения строит для автономного автомобиля маршрут: из начальной точки в конечную. Чтобы работать с маршрутом, его удобно интерпретировать как некоторый граф.
Помните, как выглядит интерфейс навигатора для автомобилистов или пешеходов? Местность и проложенный через неё маршрут отображаются в проекции «Вид сверху». Для автономного транспорта это тоже подходит — планирование из трёхмерного слегка упрощается до двумерного.
Про само планирование подробно рассказано в одной из предыдущих статей — «Нейронные сети для планирования движения беспилотных автомобилей». А сейчас речь пойдёт о том, что именно помогает автомобилю понять, что же перед ним такое — самолёт, птица, агент или статика, — и принять решение, как двигаться дальше.
Первый этап эволюции: камеры и появление лидара
Сегодняшний набор датчиков и ПО — третий этап эволюции «зрения» нашего автономного транспорта. А первый этап начинался с камер.
Камеры
Собственно, это самый простой способ реализовать техническое зрение для автономного автомобиля — поставить на него камеру и запустить, например, сегментацию.
Заметно, что таким образом хорошо распознаются дорожное полотно и статические препятствия: тротуары и бордюры. Но, как я и говорил ранее, для планирования требуется перевести все изображения в вид сверху.
Для получения проекции сверху необходимо трёхмерное представление поверхности, но у нас его не было. Самое простое, что можно было получить быстро, — это гомография. Гомография — геометрическое преобразование, которое репроецирует одну плоскость в другую. Для наших задач нужно репроецировать плоскость камеры в плоскость дороги.
В результате такого преобразования все объекты, которые на картинке относятся к дороге, сохраняют свои линейные размеры в её плоскости — присмотритесь к треугольнику безопасности на картинке выше.
Но плоскость дороги плохо интерпретировать только одной плоскостью: чем дальше объект от камеры, тем больше накапливается искажений. Поэтому гомография из коробки хороша для распознавания объектов, которые находятся в радиусе не дальше 40 метров от камеры. Такое поле зрения приемлемо для движения со скоростью около 20 км/ч. Этого достаточно, чтобы автономный автомобиль мог ездить по закрытой территории.
Глубина из стереопары
Чтобы улучшить репроецирование, мы решили добавить предсказание глубины по изображению и поставили в систему стереопару.
Ожидания: прекрасная карта глубины, похорошевшее репроецирование статических препятствий на вид сверху, 60 км/ч — без проблем.
Реальность: ни один из доступных на тот момент алгоритмов не помог нам улучшить качество репроецирования. Обученные на комнатных данных модели не были готовы к настоящей погоде и живым камерам.
Чтобы переобучить модель глубины, мы решили добавить новый сенсор, который бы дал нам возможность собрать ground-truth-данные для глубины.
Лидар
Лидар хорош тем, что может определить расстояние до объекта с точностью до сантиметра. Мы надеялись, что если репроецируем данные с лидара на картинку с камер, то получим ground truth для глубины.
И снова реальность не сошлась с ожиданиями. Многие из наших CV‑ и ML‑инженеров считали, что за два года на одних только камерах можно было сделать полностью автономный автомобиль. В итоге значимо улучшить статические препятствия только на камерах у нас не вышло. А лидар позволил одному разработчику за две недели сделать детектор статики, соизмеримый по качеству с тем, над которым толпа специалистов работала 4 месяца.
Итак, подведём итоги первого этапа эволюции. С одной стороны, лидар — отличный источник ground‑truth‑данных для глубины по камерам. С другой — лидар сам по себе отличный источник данных о статических препятствиях. С его помощью можно закрыть эту задачу и перейти к другим.
Второй этап эволюции: 3D-детекторы и расположение сенсоров
Для начала поподробнее остановлюсь на датчиках, с помощью которых можно реализовать техническое зрение.
Наши автономные автомобили оборудованы множеством разных сенсоров. Например, камеры установлены так, чтобы поле зрения машины достигало 360 градусов, без слепых зон.
Так, в первом приближении, автономный автомобиль видит мир с помощью камер. А лидары позволяют ему более точно оценивать расстояние до объектов.
Вот пример сцены из нашей визуализации — узнаёте автомобиль, который едет навстречу нашему автономному транспорту, в облаке серых точек на картинках слева? Лидары настолько хороши, что даже без визуализации, по одному облаку, можно понять, что происходит.
3D-детекторы
Есть камеры, есть лидары, есть данные с них. Как это всё объединить? С помощью ML‑CV‑моделей, работающих с 3D.
Один из классических подходов к работе с лидарными облаками — архитектура PointNet. Однако она не справляется с real‑time‑сегментацией больших лидарных облаков.
Наш первый 3D-детектор мы назвали YaBoxnet.
Мы представляем лидарное облако в виде сверху, режем его на кубики, которые называем вокселями, и запускаем в каждом из них тот самый PointNet. Из каждого кубика вытягиваем некоторые фичи. А дальше, если смотреть на результат обработки лидарного облака сверху, его можно интерпретировать как картинку — только вместо каналов RGB мы используем воксели и те самые фичи, которые вытащили с помощью PointNet.
А дальше достаточно запустить YOLO, SSD или любой другой 2D‑детектор, и — вжух! — получится детектор, который умеет раскрашивать картинку и делать 2D‑кропы.
YaBoxnet не использует картинку с камеры, поэтому теряет большую часть информации. Параллельный путь, где эта картинка используется (и к которому мы также обращаемся), — фрустумные детекторы.
Как это работает: запускаем на картинке стандартный 2D‑детектор, получаем 2D‑прямоугольник, в котором есть объект. Берём сектор, на который опирается этот прямоугольник, запускаем в нём PointNet и вытягиваем 3D‑объекты.
К сожалению, у обоих подходов есть недостатки:
YaBoxnet хорошо работает с видом сверху и оценивает углы объектов. При этом, поскольку у него нет информации о картинке, он может легко перепутать, например, пихту, у которой две веточки торчат вправо и влево, с человеком. Или не отличить квадратную автобусную остановку от автобуса той же формы.
Фрустум лучше работает с объектами, у которых есть какой‑то кластер, например с человеком. Но он хуже оценивает углы и искажает детекцию машин.
LaserNet
Нам захотелось получить более универсальный детектор, который решал бы задачу 3D‑детектирования и при этом обладал плюсами обоих подходов. Мы вдохновились одним из существующих решений — LaserNet.
LaserNet работает примерно так: берёт картинку с камер и репроецирует её в лидар. Данные с камеры и лидара конкатенируются. В итоге получается 2D‑представление, на котором запускаются детекция и сегментация.
Мы придумали, как усовершенствовать эту схему. Давайте представим, что вокруг автомобиля есть бесконечная сфера, на которую можно репроецировать все камеры и лидары.
Смотрим на первую схему. Есть камера. И есть луч, проходящий через какой‑либо пиксель этой камеры (первый красный квадрат). Он попадает в пиксель бесконечной сферы (второй красный квадрат). Таким образом мы смогли данные со всех камер перенести на бесконечную сферу.
Аналогично и с лидаром: каждая точка, которую он возвращает, — тоже некоторый луч, который можно спроецировать на бесконечную сферу (синий квадрат).
А дальше — стандартная схема: камерный энкодер/декодер, в середину которого мы добавляем данные от лидара, чтобы обогатить 2D‑детекции. При этом, если в лидарных данных останутся X, Y и Z, то их вместе с фичами на выходе декодера можно репроецировать на вид сверху и получить энкодер/декодер, аналогичный Boxnet, но уже с камерными фичами.
И снова наши ожидания разбились о реальность.
К сожалению, сфера бесконечного радиуса — утопия, если сенсоры расположены неправильно.
Места, где панорама склеилась хорошо, отмечены на картинке выше зелёными стрелочками. В остальных областях всё просто ужасно: обратите внимание на синие стрелочки. Справа не сошёлся тротуар, слева — пешеходный переход. Такие артефакты возникают, когда камеры расположены слишком далеко друг от друга: для репроекции в одну панораму нужно, чтобы фокусные точки всех камер были близки.
Так как мы сами разрабатывали наш набор сенсоров, то у нас была возможность расположить камеры ближе к лидару, чтобы минимизировать ошибки репроекции.
Так мы перешли к третьему этапу эволюции. Но прежде подведём итоги второго.
Fuse данных связанных модальностей — непростая задача. Её можно решить машинным обучением, сложными моделями, но зачем? Если разрабатывать sensor set самостоятельно, можно расположить сенсоры так, чтобы упростить архитектуру ML‑модели, а значит, помочь ей лучше сходиться и обучаться.
Третий этап эволюции: GorynychNet
У архитектуры, которую мы обсуждали выше, есть существенные недостатки:
Все камеры должны располагаться рядом с лидаром.
В зонах перекрытия камер есть сигнал только от одной камеры.
В слепой зоне лидара данные с камер бесполезны.
Следующий шаг эволюции — GorynychNet.
GorynychNet
Мы отказались от одной панорамы в пользу нескольких: для каждого лидара генерируем собственную бесконечную сферу и репроецируем на неё данные с самой близкой к этому лидару камеры. Этого оказалось достаточно: нам удалось улучшить распознавание в ближней зоне автомобиля. Например, теперь мы прекрасно видим людей, которые в него садятся.
Возврат к истокам
Лидары — это, конечно, прекрасно. Но нам не давал покоя вопрос: можно ли всё же обойтись одними камерами?
Попытка номер раз: мы запустили на всех камерах моноглубину, которая позволила нам уплотнить данные до 30 метров и даже решать с их помощью какие‑то задачи. Но тут у нас в руках очутился лидар получше, который решил те же задачи сильно проще.
Прошёл год или полтора. Мы придумали, как уплотнить лидар с помощью камеры для зоны до 60 метров. Снова решили какие‑то задачи. И опять появился новый лидар, который решал эти задачи лучше.
Казалось бы, не летит. Но, как сказал руководитель разработки лидаров, больше такого не произойдёт: скорость света увеличить пока что не получается. Поэтому с зоной от 120 метров сейчас можно работать только с камерами. Но это не единственный случай, когда без этого подхода не обойтись.
Ещё важный момент — гарантии безопасности. Представим, что какая‑то из систем автономного автомобиля вышла из строя. Для таких случаев должно быть предусмотрено резервирование, которое позволит безопасно припарковать автомобиль.
Чтобы обеспечить безопасность, сенсоры должны быть избыточными. Сами архитектуры, которые мы обсудили выше, хорошо работают в двух случаях:
есть данные и с лидара, и с камер;
есть данные хотя бы с лидара (например, ночью с камер много данных не получишь).
Но всё сломается, если лидар выйдет из строя. А значит, чтобы обеспечить безопасность, придётся обращаться исключительно к камерам.
Подведу итоги:
Изначально у нас не вышло сделать всё только на камерах.
Лидар оказался отличным сенсором, который ускорил наше развитие.
Правильно расположение сенсоров также помогло улучшить техническое зрение.
Но, к сожалению, чтобы сделать по‑настоящему безопасный продукт, нам всё равно пришлось вернуться к подходу с использованием одних лишь камер.
Комментарии (22)
malyazin_2010
19.09.2024 08:08+3Самое лучшее бинокулярное зрение на дронах skydio. Они даже ветки деревьев и провода облетают.
С другой стороны, если человек закроет один глаз, то он может вести машину так же хорошо, как обычно. Видимо бинокулярное зрение не обязательно для вождения/ориентации в пространстве.
Подробнее про skydio тут: https://habr.com/ru/articles/665808/
funca
19.09.2024 08:08+1У меня приятель в детстве остался без глаза и носит имитатор. При этом сдал на права с первого раза и долгое время работал водителем-экспедитором. По его словам, чувствовать расстояние он может и с одним глазом. Основная сложность это зеркала и необходимость больше крутить головой во время перестроений и движения назад.
nApoBo3
19.09.2024 08:08Это все хорош, но на практике один глаз создает массу ограничений. Скорость реакции такого водителя, особенно на объект с дисфункциональной стороны, значительно снижена.
Dynasaur
19.09.2024 08:08+4Реальность: ни один из доступных на тот момент алгоритмов не помог нам улучшить качество репроецирования. Обученные на комнатных данных модели не были готовы к настоящей погоде и живым камерам.
а если расставить камеры по-шире?
Лидар хорош тем, что может определить расстояние до объекта с точностью до сантиметра
а в дождь/снег?
И ещё вопрос - а если не дороге будет много автомобилей с лидарами и все будут светить друг другу в лидары одинаковым лазером - лидар сможет понять где его отражения, а где засветка от чужих лазеров?
Сфера бесконечного радиуса в действии
Вообще-то на картинке у вас цилиндр :-)))
Vsevo10d
19.09.2024 08:08+1Всегда думал, в будущем, когда на улице сотни лидаров будут тебя облизывать, сетчатке от этого плохо не будет?
Alexufo
19.09.2024 08:08А ИК прожектора перестали волновать?)
Vsevo10d
19.09.2024 08:08+2А где они нопремер? В купольных камерах где-то над головой? А тут на уровне глаз и есть. И к тому же подсветка именно что прожектор, рассеивающийся через десяток метров, а не когерентный пучок, который фокусированный для сканирования препятствий.
Alexufo
19.09.2024 08:08В любой камере вечером, коих вокруг полно над дверьми, а фокусируетесь сразу, как подмечаете едва красные огонечьки на них. Подсветка яркая, диафрагма глаза открыта... не знаю, что там с температурой, ясно что у лазера на порядки выше, но все же эффекты мне не понятны, вся ли опасность только от нагрева?
1CHer
19.09.2024 08:08ИК в камере это между тепловым и видимым. Нагревает не сильно и глаз его не регистрирует.
Alexufo
19.09.2024 08:08Пусть не регистрирует, излучение же все равно остается. Тут правда 197 Вт/см2 - кажется, дохрена, но все же смысл показан
https://pubmed.ncbi.nlm.nih.gov/25044273/
konst90
Опыт показывает, что управлять машиной можно при наличии только стереокамер (глаза), никакой лидар для этого не нужен. Почему же изначально не получилось сделать беспилотник на камерах - софт оказался слишком сложным?
polRk
У человека глаз не плоский и от этого есть ощущение глубины и расстояния. а все камеры - проецируют изобращение на плоскую матрицу теряя существенный пласт данных. вот как только матрицу сделают полусферой - все пойдет лучше
konst90
Насколько я помню, глубина и расстояние берётся не из формы глаза, а из бинокулярного зрения.
kalbas
Тогда если закрыть один глаз, то у вас и глубина пропадет?
konst90
Конечно.
Не полностью, потому что мозг на основе опыта будет пытаться выстроить трехмерную картину, но определить расстояние до объекта неизвестного размера будет намного сложнее.
kalbas
Ох, как бы хотелось лидар в глаза, чтобы на трассе нормально определять расстояние до встречных машин, а также скорость их приближения :)
radtie
Ой да ладно, признайся, ты просто хочешь пулять лазерами из глаз и всё.
SnakeSolid
У человека не просто две камеры. Они могут перемещаться и смотреть в любом направлении, и имеют очень большой динамический диапазон. Более того человек имеет миллионы примеров разных ракурсов машин, велосипедов, знаков, других людей из-за чего ему проще ориентироваться на местности и определять препятствия.
Dynasaur
у автопилота всё то же самое, только камер может быть сколько угодно, направлены во все стороны, часть из них в ИК диапазоне и ещё радары и лидары в любом количестве.
SnakeSolid
Обученный человек с двумя глазами пока справляется лучше, чем лидары и камеры, особенно если нужно проехать по лесу или разбитой деревенской дороге. Да и распознает объекты человек лучше чем нейросети, как минимум на майку со знаком stop он не остановится, под фуру не заедет и рекламу с людьми не перепутает.
Dynasaur
Во первых, это уже другая тема. Про две камеры мы, видимо, закончили. Во вторых, во многих случаях уже хуже. И быстрее, что тоже важно. Ну и пределы обучения человека практически достигнуты и далее радикального улучшения ждать не стоит. А с ИИ всё только начинается.
acc0unt
Да, ИИ - это сложно.
Животных эволюция точила под задачи навигации в пространстве сотни миллионов лет. Человек при разработке ИИ начинает буквально "с нуля". Неудивительно что нахрапом, с первой попытки, задача не решилась.
Ясно, что работать только на камерах не невозможно. В идеале лидар не нужен. Но живём мы не в идеале, а в реальности. Допилить "софт" ИИ до такого уровня работы очень и очень тяжело. Поэтому много кто подпирает систему костылями в виде лидаров.