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

Трубопровод

  • Выполните извлечение функции гистограммы ориентированных градиентов (HOG) на помеченном наборе обучающих изображений.
  • Используйте функции HOG, а также значения пикселей, функции цвета гистограммы, чтобы обучить классификатор Linear SVM распознавать «автомобили» и «не автомобили».
  • Реализуйте метод скользящего окна и используйте обученный классификатор для поиска транспортных средств на изображениях.
  • Запустите конвейер для видеопотока и создайте тепловую карту повторяющихся обнаружений кадр за кадром, чтобы отклонить ложные срабатывания и следить за обнаруженными транспортными средствами.
  • Оцените ограничивающую рамку для обнаруженных транспортных средств.

Набор данных

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

Вот разбивка данных обучения:

Number of cars = 8792
Number of not cars = 8968
Image data shape = (64, 64, 3)

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

Каждое изображение состоит из 12288 пикселей (64x64x3), которые можно использовать непосредственно в качестве признаков для обучения классификатора. Однако сделать это будет довольно дорого. Вместо этого мы извлекаем гистограмму, цвет и градиент из изображений. Это позволяет нам работать с гораздо меньшим вектором признаков (в данном случае 1788), не теряя при этом слишком много информации.

Из необработанных изображений извлекаются три типа признаков:

  • Пространственный цвет: это необработанные значения пикселей, извлеченные после изменения размера изображения до 16 x 16. Пожалуйста, обратитесь к методу bin_spatial для получения подробной информации.
  • Цветовая гистограмма: они извлекаются путем группировки значений пикселей из каждого канала изображения (R, G, B) в 16 бинов. Пожалуйста, обратитесь к методу color_hist для деталей.
  • Гистограмма ориентированных градиентов (HOG): они подробно обсуждаются в следующем разделе.

Гистограмма ориентированных градиентов (HOG)

Элементы градиента извлекаются с использованием метода, называемого Гистограмма ориентированных градиентов (HOG). HOG работает путем субдискретизации изображения в сетку, например. Ячейки 8x8 или 4x4, каждая из которых содержит только наиболее заметный градиент в этой части изображения. В результате из изображения извлекаются градиенты, а другая информация, например цвет, отбрасывается.

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

color_space: LUV      # Can be RGB, HSV, LUV, HLS, YUV, YCrCb
orientations: 9       # HOG orientations
pix_per_cell: 16      # HOG pixels per cell
cell_per_block: 2     # HOG cells per block
hog_channel: ALL      # Use image channels 0, 1, 2, or ALL

Характеристики HOG были извлечены с использованием метода skimage hog. Пожалуйста, обратитесь к методу get_hog_features для деталей.

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

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

Я попробовал две популярные модели машинного обучения для этой задачи классификации:

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

color_space: LUV         # Can be RGB, HSV, LUV, HLS, YUV, YCrCb
orientations: 9          # HOG orientations
pix_per_cell: 16         # HOG pixels per cell
cell_per_block: 2        # HOG cells per block
hog_channel: ALL         # Use image channels 0, 1, 2, or ALL
spatial_size: (16, 16)   # Spatial binning dimensions
hist_bins: 16            # Number of histogram bins
C: 1.0                   # SVM penalty parameter
kernel: linear           # SVM kernel type
gamma: 'auto'            # SVM gamma parameter
spatial_feat: True       # Spatial features on or off
hist_feat: True          # Histogram features on or off
hog_feat: True           # HOG features on or off

Обнаружение автомобиля

Поиск в скользящем окне

Подход со скользящим окном использовался для сканирования изображения и определения областей с транспортными средствами.

Поскольку транспортные средства могут появляться на изображении в любом масштабе, наивным подходом к обнаружению транспортных средств было бы скольжение окна по исходному изображению размером, например. 128x128 и измените размер фрагмента на 64x64 перед прогнозированием. Это помогло бы захватывать автомобили, которые в 2 раза больше по размеру по сравнению с обучающими примерами. Однако этот подход быстро становится невыполнимым с вычислительной точки зрения, когда необходимо протестировать несколько масштабов.

Лучшим подходом является уменьшение масштаба всего изображения в требуемом масштабе (при масштабе 2x изображение 128x128 станет 64x64), а затем применить извлечение признаков HOG ко всему изображению сразу со скользящим окном 64x64. Цветовые пространственные характеристики и цветовые гистограммы также извлекаются из каждого фрагмента.

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

Конвейер применяет find_cars() два раза с масштабами 1, 1,5 для поиска изображения с окнами 64x64, 96x96. Положительные прогнозы суммируются. Обе шкалы используют окна с перекрытием 50%.

Ложноположительный отказ

Чтобы отклонить ложные срабатывания, я реализовал класс VehicleDetector, который сохраняет прошлые обнаружения в предыдущих 20 кадрах и отклоняет любые положительные обнаружения, которые не происходят во всех 20 кадрах.

Это было выполнено путем создания тепловой карты для каждого кадра путем добавления «1» к пустому изображению нулей всякий раз, когда классификатор сообщал о положительном обнаружении.

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

Ящики для рисования

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

Результат

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

В целом, я очень доволен результатами. Тем не менее, есть возможности для дальнейшего совершенствования.

Дальнейшие улучшения

  • Как видно из приведенного выше видео, классификатор имеет несколько ложных срабатываний вокруг разметки левой полосы движения. Использование некоторых из этих обнаружений в качестве дополнительных отрицательных классов поможет уменьшить количество ложных срабатываний.
  • Недостатком подхода с использованием компьютерного зрения и машинного обучения является то, что он требует больших вычислительных ресурсов. Обработка всего видео заняла около 12 минут, что соответствует 1,75 кадра в секунду. Это слишком медленно для реального применения в беспилотном автомобиле.
  • Еще одним недостатком подхода компьютерного зрения является точная настройка, необходимая для надежной работы в различных условиях освещения и с различными формами/размерами транспортных средств.
  • Кроме того, конвейер не различает отдельные экземпляры автомобилей. Это видно, когда одна единственная рамка нарисована вокруг перекрывающихся черных и белых автомобилей.

Полную информацию о реализации можно найти здесь.