Вступление

Проект по обнаружению и отслеживанию транспортных средств Udacity Self-Driving Car Nanodegree представляет собой вызов для применения традиционных методов компьютерного зрения, таких как гистограмма ориентированных градиентов (HOG) и других функций в сочетании со скользящими окнами для отслеживания транспортных средств на видео. Идеальное решение - работать в режиме реального времени, т. Е. ›30 кадров в секунду. Мой подход к решению основан на подходе 2005 года, предложенном Далалом и Триггсом, с использованием линейного SVM и обработки видео с жалкими 3 кадрами в секунду на процессоре i7. Проверьте это репо для кода и более подробного обсуждения технических вопросов.

Ради интереса я также передал видео проекта через YOLO, невероятно быструю сверточную нейронную сеть для обнаружения объектов. Если вы работаете с быстрым графическим процессором (в моем случае это GTX 1080), видео обрабатывается со скоростью около 65 кадров в секунду. Да! Это более чем в 20 раз быстрее, поэтому я не пытался векторизовать свое решение SVM + HOG. Хотя возможности, безусловно, есть, особенно в части раздвижных окон. Я расскажу о результатах YOLO ниже.

Наборы данных

Для обучения я использовал наборы данных KITTI и GTI, а также дополнительные данные, которые поставляются вместе с репозиторием проекта. Классов всего два: автомобили и notcars. Данные GTI берутся из видеопотоков. Поэтому слепая рандомизация всех изображений и последующее разделение на обучающие и тестовые наборы вводят корреляции между обучающими и тестовыми наборами. Поэтому я просто разделил последние 30% каждого источника данных на наборы для проверки и тестирования. Все изображения (включая изображения с неквадратным соотношением сторон) изменяются до 64x64 пикселей для извлечения функций.

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

В качестве вектора признаков я использовал комбинацию

  • пространственные особенности, которые представляют собой не что иное, как копию фрагмента изображения с пониженной дискретизацией, подлежащую проверке непосредственно (16x16 пикселей)
  • функции цветовой гистограммы, которые фиксируют статистическую информацию о цвете каждого фрагмента изображения. Автомобили часто бывают очень насыщенных цветов, что отражается в этой части вектора признаков.
  • Функции гистограммы ориентированных градиентов (HOG), которые фиксируют структуру градиента каждого канала изображения и хорошо работают при различных условиях освещения.

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

Окончательный вектор признаков содержит признаки, извлеченные тремя разными способами, указанными выше. Следовательно, необходимо масштабировать каждую функцию, чтобы одна из функций не была доминирующей только из-за того, что диапазон ее значений находится в другом масштабе. Поэтому я использовал функцию Standard.Scaler пакета scikit learn для стандартизации функций путем удаления среднего и масштабирования до единичной дисперсии.

Тренировка линейной машины опорных векторов

В отличие от многих других задач классификации или обнаружения, существует строгая потребность в обнаружении автомобилей в реальном времени. Так что компромисс между высокой точностью и скоростью неизбежен. Два основных параметра, которые влияют на производительность, - это длина вектора признаков и алгоритм обнаружения транспортных средств. Линейная SVM предлагала лучший компромисс между скоростью и точностью, превосходя по производительности случайные леса (быстрые, но менее точные) и нелинейные SVM (ядро rbf, очень медленно). Окончательная точность теста с использованием вектора функций, содержащего 6156 функций, была выше 98,5%, что звучит хорошо, но намного меньше, когда вы обнаруживаете, что оставшиеся 1,5% представляют собой часто появляющиеся пятна изображения, особенно линии полос движения, аварийные барьеры и ограждения.

Раздвижные окна

При стандартном подходе к обнаружению транспортных средств кадры, записанные видеокамерой, сканируют изображение с помощью скользящего окна. Для каждого окна вычисляется вектор признаков и передается в классификатор. Поскольку машины появляются на разном расстоянии, поиск также необходимо проводить в нескольких масштабах. Обычно для каждого отдельного кадра необходимо извлекать и загружать в классификатор более сотни векторов признаков. К счастью, эту часть можно векторизовать (что не сделано). Ниже показан типичный пример положительного обнаружения вместе со всеми ~ 150 окнами, которые используются для обнаружения автомобилей. Как и ожидалось, есть несколько ложных срабатываний.

Для фильтрации ложных срабатываний я всегда отслеживал обнаруженные окна последних 30 кадров и считал положительными только те части изображения, где было зарегистрировано более 15 обнаружений. Результатом является тепловая карта со значительно сниженным уровнем шума, как показано ниже.

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

Применение всего конвейера к видео приводит к появлению ограничивающих рамок вокруг автомобилей, как показано здесь:

Сравнение с YOLO и выводы

Вышеупомянутый конвейер, использующий функции HOG и линейную SVM, хорошо известен с 2005 года. Совсем недавно появились чрезвычайно быстрые детекторы объектов на основе нейронных сетей, которые позволяют обнаруживать объекты быстрее, чем в реальном времени. Я просто клонировал исходный даркнет репозиторий и применил YOLO к видео проекта. Мне нужно было только внести незначительную модификацию кода, чтобы можно было напрямую сохранять видео. Результат просто потрясающий. Поскольку не используются скользящие окна, обнаружение происходит очень быстро. Кадр передается в сеть и обрабатывается ровно один раз, отсюда и название YOLO - вы смотрите только один раз.

Прямой проход всего изображения по сети дороже, чем извлечение вектора признаков патча изображения и его передача через SVM. Однако эту операцию необходимо выполнить ровно один раз для всего изображения, в отличие от примерно 150 раз в подходе SVM + HOG. Для создания видео выше я не делал оптимизацию производительности, такую ​​как уменьшение изображения или определение интересующей области, или даже обучение специально для автомобилей. Тем не менее, YOLO более чем в 20 раз быстрее, чем SVM + HOG, и, по крайней мере, так же точен. Порог обнаружения может быть установлен на любой уровень достоверности. Здесь я оставил значение по умолчанию 50%, и ни разу не было обнаружено никаких объектов, кроме автомобилей (хорошо, однажды автомобиль был принят за грузовик). Обратите внимание, что существует гораздо больше классов, таких как «человек», «сотовый телефон», «собака» и других. Так что не только количество ложных срабатываний, но и количество ложноотрицательных результатов было очень хорошим. Я нахожу это чрезвычайно захватывающим и проверю возможности обнаружения транспортных средств в отдельном проекте. Это будет весело.

Спасибо за прочтение,

Каспар