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

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

Благодаря работе Dalal & Triggs (2005), линейная поддержка
векторных машин (SVM), которая максимизирует запас всех
выборок от границы линейного решения, в сочетании с
гистограммой ориентации Функции (HOG) стали популярными
инструментами классификации. Однако все предыдущие методы основаны на
функциях, созданных вручную, которые сложно спроектировать. С возрождением
глубокого обучения сверточные нейронные сети
автоматизировали эту задачу, значительно повысив производительность
.

Как оказалось, глубокие нейронные сети превосходят подход, который я использовал (машины линейных опорных векторов в сочетании с гистограммой ориентированных градиентов). Я обязательно вернусь к этому проекту и опробую некоторых из лучших исполнителей в этом списке по той же проблеме:

Процесс обнаружения транспортных средств на дороге можно свести к следующим этапам:

Анализ данных обучения

Данные для обучения предоставлены Udacity и состоят из изображений автомобилей под разными углами (8792) и неавтомобильных (8968) объектов. Вот два образца:

Извлечение признаков

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

Чтобы иметь надежный набор функций и повысить нашу точность, мы будем использовать Гистограмму ориентированных градиентов (HOG). Этот дескриптор функции намного более устойчив к динамике трафика. По сути, вы должны думать о функциях как о отпечатках пальцев интересующих вас объектов.

Библиотека Python Scikit-image предоставляет нам необходимый API для расчета функции HOG. Я использовал цветовое пространство YCrCb и все его каналы в качестве входных данных для извлечения признаков HOG. Я пробовал другие цветовые пространства, но YCrCb дал мне лучшую точность при обучении моей модели прогнозирования. Вот образец изображения транспортного средства и не транспортного средства с функциями HOG из тех же изображений, что и выше:

Извлечение признаков HOG было основано на 9 ориентациях, 8 пикселей на ячейку и 2 ячейки на блок. Увеличение ориентации и параметров пикселя на ячейку действительно улучшило время прогнозирования, но уровень точности модели снизился.

Модельное обучение

Чтобы обнаружить машину на основе нашего набора функций, нам понадобится модель прогнозирования. В этом конкретном случае мы будем использовать Линейные машины опорных векторов (Linear SVM). Это модель обучения с учителем, которая сможет классифицировать, является ли что-то автомобилем или нет, после того, как мы его обучим.

Характеристики HOG были масштабированы до нулевого среднего и единичной дисперсии с помощью Standard Scaler.

Я разделил предоставленный набор данных на обучающий набор (80%) и набор для тестирования (20%). Перед началом тренировки изображения также были перемешаны. В итоге модель Linear SVM с извлеченными функциями HOG в цветовом пространстве YCrCb достигла уровня точности 98,06%.

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

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

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

Вот как эта концепция выглядит, когда она применяется на нашем тестовом изображении:

Я использовал разные размеры окон (от 128x128 для области ближе к машине и 64x64 для области дальше от автомобиля). Перекрытие окон установлено на 65%.

Устранение ложных срабатываний

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

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

Это пример применения тепловой карты и определения ее порога для определенного значения.

Окончательный результат

Конечный результат не идеален, но сам трубопровод демонстрирует хороший потенциал.

Заключение

Если бы у меня была возможность переделать этот проект, я бы, вероятно, выбрал подход глубокой нейронной сети. Я потратил много времени на поиски правильного цветового пространства, параметров HOG и размера оконного слайда.

Производительность конвейера невелика и ее можно улучшить. Подход с глубокой нейронной сетью будет иметь лучшие показатели производительности.

Поскольку этот подход к обнаружению автомобилей основан на камере, он может иметь обычные проблемы с датчиком такого типа (плохая видимость, отражения и т. Д.).

Проект можно найти в моем профиле Github: