Udacity SDCND

Управляя автомобилем, нужно сделать две очень важные вещи: а) оставаться на своей полосе движения; б) избегать других автомобилей. Для этого нам нужно знать, где находится полоса дороги и где находятся другие автомобили. Та же история и с беспилотными автомобилями, поэтому ребята из Udacity решили, что это последние два проекта Self-Driving Car Nannodegree. В моем предыдущем посте я рассказал, как найти линию полосы движения и сделать ее устойчивой к изменениям освещения и шуму. В этом посте рассматривается проблема поиска транспортных средств на изображении и оценки их удаленности от нашей машины.

Цели / шаги этого проекта следующие:

  • Извлеките признаки, используемые для классификации
  • Создайте и обучите классификатор
  • Сдвиньте окно и определите автомобиль на изображении
  • Отфильтруйте ложные срабатывания
  • Рассчитать расстояние
  • Запускаем конвейер на видео

Здесь используются некоторые детали расширенного поиска полос движения, поэтому, если вас интересует более подробное описание, вы можете прочитать мой предыдущий пост здесь.

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

Автомобильный классификатор

Первое, что нам нужно сделать, это создать классификатор, который классифицирует автомобили по сравнению с другими автомобилями. Для этого необходим набор данных, и я использовал набор данных, предоставленный Udacity. (Скачать: автомобили, не транспортные средства). Набор данных представляет собой комбинацию набора тестов KITTI Vision и базы данных изображений автомобилей GTI. Изображения автомобилей GTI сгруппированы в дальние, левые, правые и средние точки. Примеры автомобилей и не автомобилей следующие:

Чтобы построить классификатор, сначала необходимо идентифицировать признаки. Функции, которые будут использоваться, представляют собой смесь гистограмм, полных изображений и HOG-ов.

Извлечение функций

Цветовое пространство

Цветовое пространство связано с представлением изображений в смысле цветовых кодировок. Есть кодировки, которые больше подходят для одной цели, но плохи для других. Например, RBG хорош с точки зрения оборудования, поскольку именно так захватываются и отображаются пиксели (хороший пример - фильтр Байера), но он не отражает то, как люди воспринимают цвета, что важно для классификации. задания. Я уверен, что для задачи классификации автомобилей не существует предписанного цветового пространства, которое подходит лучше всего. Так что его нужно выбирать методом проб и ошибок. Что я сделал, так это то, что я построил классификатор на основе HOG, цветовых гистограмм и полного изображения, а затем изменил цветовое пространство, пока не получил лучший результат классификации на тестовом наборе. Возможно, я описываю проблему сверху вниз, но цветовое пространство очень важно для объяснения и визуализации функций. После некоторых проб я обнаружил, что цветовое пространство LUV работает лучше всего. Он имеет компонент люминесценции L, а также два компонента цветности (u и v). Это цветовое пространство постоянно давало лучшие результаты классификации.

Субдискретизированное и нормализованное изображение как функция

Первая и самая простая функция - это субдискретизированное изображение. Еще раз, попробовав и проверив результат классификации, размер субдискретизированного изображения выбирается равным 20x20. Кроме того, изображение нормализовано по гамме. Это пришло мне в голову при просмотре этого видео YouTube, объясняющего HOG. Было заявлено, что извлечение квадратного корня из изображения нормализует его и обеспечивает равномерную яркость, уменьшая, таким образом, эффект теней. Я попробовал, и это немного улучшило классификацию. Поскольку это довольно простая операция, она осталась в моем коде, поскольку обеспечивает дополнительную надежность. После нормализации и субдискретизации изображение преобразуется в вектор вместо матрицы. Исходное изображение, нормализованное, преобразованное в LUV:

Гистограмма цветов

Вторая группа функций - это цветовые гистограммы. Изначально я старался использовать только гистограмму канала люминесценции L. Автомобили могут быть разных цветов, поэтому отказ от каналов цветности для меня казался естественным выбором. После некоторого тестирования я обнаружил, что включение гистограммы всех трех цветовых каналов повысило точность теста на пару процентов, что может иметь большое значение. Количество интервалов в гистограмме выбирается в зависимости от точности тестирования, и 128 интервалов дают наилучший результат. Вот примеры гистограмм для ранее показанного изображения:

БОРЬБА

Последняя, ​​но, пожалуй, самая важная особенность - это гистограмма ориентированных градиентов - HOG. Основная идея HOG заключается в том, что гистограмма рассчитывается на основе ориентации каждого пикселя, рассчитанной с помощью некоторого детектора границ. Пиксели, которые находятся по краям, вносят гораздо больший вклад в гистограмму, чем края, на которых нет. Изображение делится на несколько ячеек, и для каждой ячейки бинируются ориентации. Таким образом, HOG в основном показывает доминирующую ориентацию на ячейку. Вы можете найти подробную информацию о HOG в этом видео YouTube. Изображение, на котором рассчитывается HOG, имеет размер 64x64. Количество пикселей в ячейке равно 8, а количество ячеек в блоке - 1. Количество ориентаций - 12. HOG рассчитывается для всех трех каналов нормализованного изображения. Я много тестировал эти параметры и, наконец, пришел к выводу, что это оптимальный выбор. При выборе я учел количество функций, сгенерированных таким образом, и полученную точность на тестовом наборе. При использовании этого набора параметров создается всего 768 функций на канал. Если количество ячеек в блоке увеличивается до 2, количество функций увеличивается до 2352 на канал. Повышение точности классификации при использовании 2 ячеек на блок было незначительным, поэтому я решил использовать 1 ячейку на блок. Кроме того, я пробовал использовать большее количество пикселей на ячейку, в этом случае теряется много информации и падает точность, в то время как уменьшение количества пикселей на ячейку увеличивает количество функций. Изображения, визуализирующие HOG для каждого канала:

Обучение классификатору

Используемый классификатор - линейный классификатор опорных векторов. Набор данных получается путем циклического просмотра изображений транспортных средств и других видов транспорта и вычисления характеристик этих изображений. Следующее, что было выполнено, - это масштабирование функций, что очень важно для любого алгоритма машинного обучения. После этого набор данных разделяется на обучающий и тестовый набор, где тестовый набор составляет 10% от всех данных. Классификатор обучается с помощью C = 1e-4, где эта функция была выбрана на основе точности набора параметров обучения и тестирования. Если разница между двумя точностями велика, обучение переобучало данным, поэтому значение C было снижено. Когда точность теста низкая, но такая же, как и точность обучения, произошло недостаточное соответствие, поэтому значение C было увеличено. Окончательная точность, полученная на тестовом наборе, составила 99,55%. После обучения классификатор и скейлер были обработаны и сохранены, чтобы их можно было повторно использовать при обработке изображений, поступающих с камеры.

Поиск автомобилей по изображениям / видео

Конвейер поиска автомобилей на изображениях и видео очень похож. Фактически, поиск автомобилей на видео осуществляется по тому же конвейеру, что и поиск автомобилей на неподвижных изображениях с некоторыми дополнительными функциями. По этой причине сначала будет описан конвейер для одного изображения.

Скольжение окна

Первое, что нужно сделать, это провести окном по экрану и попытаться определить области, которые дают положительный результат в определенном классификаторе. Окно, которое будет сдвинуто, всегда имеет размер 64x64 с перекрытием 75%. В некоторых случаях размер автомобиля может превышать 64x64 пикселя, поэтому, чтобы охватить эти случаи, все изображение уменьшается в масштабе. В результате выполняется поиск автомобиля на исходном изображении и 5 уменьшенных изображений, выбранных таким образом, чтобы автомобили на исходном изображении имели размеры 80x80, 96x96, 112x112, 128x128 и 160x160. HOG вычисляется только один раз для уменьшенного изображения, и подобласть HOG используется, когда каждое из окон проверяется на наличие автомобиля. После того, как окно сдвинуто, классифицируется весь пакет функций, рассчитанный для каждого окна. Вот пример исходного изображения, 2 региона, в которых выполняется поиск автомобилей, и регионы с обнаруженными автомобилями:

Расчет тепловой карты и идентификация автомобилей

Так как одна и та же машина была обнаружена несколько раз, окна пришлось как-то сгруппировать. В этом случае используется тепловая карта. Каждый пиксель на тепловой карте содержит количество окон с идентифицированными автомобилями, которые содержат этот пиксель. Чем выше значение пикселя на тепловой карте, тем больше вероятность, что это часть автомобиля. Тепловая карта имеет пороговое значение 1, что исключает любые возможные ложные обнаружения автомобилей. После этого соединенные компоненты маркируются и вычисляется ограничивающая рамка. В результате получаются следующие изображения:

Удаление дороги

Причина этого в том, что мы хотим оценить, насколько далеко впереди нас опознает автомобиль. В нашем предыдущем проекте было найдено перспективное преобразование, которое сопоставляет поверхность дороги с изображением и позволяет нам измерять расстояния. Перспективное преобразование предполагает, что преобразованный объект является плоским, поэтому для точного измерения расстояния нам нужна точка, которая находится на поверхности дороги. Для измерения расстояния используется средняя точка нижнего края ограничительной рамки. Дорожное покрытие удаляется, чтобы измерение проводилось на задних колесах идентифицированного автомобиля. Для этого определяется средний цвет последних 8 строк ограничивающей рамки. Первая снизу линия, в которой более 20% точек далеки от среднего цвета, считается новым нижним краем ограничивающей рамки. Точки далеко цвета представлены фиолетовым цветом на рисунке ниже.

Оценка расстояния

Перед тем как нарисовать прямоугольники вокруг обнаруженных автомобилей, определяется линия полосы движения. Также попробуем оценить расстояние до машины. Как только мы получим ограничивающую рамку и среднюю точку ее нижнего края, используя перспективное преобразование, мы можем вычислить ее положение на деформированном изображении из Расширенного проекта поиска полос. Нам не нужно деформировать все изображение, а просто пересчитать положение одиночного изображения на деформированном изображении. На этом изображении существует прямая корреляция между положением пикселя и расстоянием в метрах, поэтому расстояние между рассчитанным положением средней точки и нижней части изображения, умноженное на количество метров на пиксель, представляет собой расстояние между нашей машиной и автомобилем. мы обнаружили. Просматривая, как это расстояние изменяется от кадра к кадру, мы можем вычислить относительную скорость автомобиля, умножив разницу между двумя кадрами на кадры в секунду и 3,6, чтобы преобразовать ее в километры в час, а не в метры в секунду. Изображение с обнаруженным автомобилем и искаженное изображение, на котором измерено расстояние:

Подробнее о преобразовании перспективы читайте в моем предыдущем посте.

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

Как найти машину в видео

Для видео конвейер следует базовому конвейеру, применяемому к отдельным изображениям. Кроме того, из-за временного измерения применяется некоторая дополнительная фильтрация. Вот что сделано:

  1. При расчете тепловой карты используются ограничивающие рамки всех уже обнаруженных автомобилей. Эти ограничивающие рамки считаются так, как если бы автомобиль был идентифицирован на этом месте. Это помогает избежать мерцания и потери уже идентифицированных автомобилей.
  2. Ограничивающая рамка усредняется по последнему 21 кадру.
  3. Если автомобиль не найден в 5 последовательных кадрах, он исчез. Новые автомобили необходимо найти в 5 последовательных кадрах, чтобы они были нарисованы и считались существующими.

Конвейер работает с обоими предоставленными видео и отлично работает. Никаких ложных срабатываний или неидентификации существующих автомобилей не происходит. Результаты видео:

Обсуждение

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

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

И последнее - процедура очень трудоемкая. В среднем на каждую итерацию требуется около 1,4 секунды (Ubuntu 16.06, 2xIntel (R) Core (TM) i7–4510U CPU @ 2,00 ГГц, 8 ГБ DDR3) для обнаружения автомобилей и полос движения. Он далек от реального времени, чтобы его можно было использовать в реальном беспилотном автомобиле. Путем профилирования я заметил, что около 50% времени уходит на расчет гистограмм. Этот код нужно оптимизировать и, возможно, переписать на C / C ++.