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

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

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

Введение

Знание того, где находятся другие транспортные средства на дороге, и способность предвидеть, куда они направляются дальше, очень важны для беспилотного автомобиля. Кроме того, определение таких вещей, как то, как далеко они находятся, в какую сторону они идут и как быстро они движутся. Почти так же, как мы это делаем собственными глазами, когда едем за рулем. Обнаружение и отслеживание объектов — основная концепция передового компьютерного зрения. Сначала мы рассмотрим, какие визуальные характеристики мы можем извлечь из изображений, чтобы надежно классифицировать транспортные средства. Далее мы рассмотрим поиск изображений для обнаружения. И затем мы будем отслеживать эти обнаружения от кадра к кадру в видеопотоке.

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

Обзор обнаружения объектов

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

Введение в функции

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

Особенности цвета

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

Допустим, вы хотите узнать, есть ли в какой-то области нового тестового изображения автомобиль.Что нам делать?

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

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

Функции цветовой гистограммы

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

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

Когда преобразование заключается в вычислении гистограммы значений цвета в изображении. Когда мы сравниваем гистограмму известного объекта с областями тестового изображения, места с похожим цветовым распределением обнаруживают близкое совпадение. Здесь мы убрали нашу зависимость от структуры, то есть мы больше не чувствительны к идеальному расположению пикселей. Следовательно, объекты, которые появляются в немного разных аспектах и ​​​​ориентациях, все равно будут сопоставлены. Вариации и размер изображения также могут быть учтены путем нормализации гистограмм. Однако обратите внимание, что теперь мы полагаемся исключительно на распределение значений цвета, которое может соответствовать некоторым нежелательным областям.

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

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

Особенности градиента и HOG

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

Теперь вместо того, чтобы использовать все эти отдельные значения, давайте сгруппируем их в небольшие ячейки, скажем, размером 8 на 8 пикселей каждая. Внутри каждой клетки происходит волшебство. Мы вычислим гистограмму направлений или ориентаций градиента для каждого из 64 пикселей внутри ячейки. Образцы градиента распределяются, скажем, по девяти ячейкам ориентации и суммируются. Обычно нам не нужна большая точность в таком маленьком масштабе. Лучшим способом визуализации гистограммы для отдельной ячейки было бы сложение вкладов для выборок в каждом интервале ориентации, чтобы получить своего рода звезду с лучами разной длины. Направление с самым длинным плечом является доминирующим направлением градиента в ячейке. Обратите внимание, что гистограмма не является строго подсчетом количества выборок в каждом направлении. Вместо этого мы суммируем величину градиента каждого образца. Таким образом, более сильные градиенты вносят больший вес в их ориентационный бин, а влияние небольших случайных градиентов из-за шума и т. д. уменьшается.

Другими словами, каждый пиксель в изображении получает право голоса в отношении того, к какой ячейке гистограммы он принадлежит, в зависимости от направления градиента в этой позиции. Но сила или вес этого голоса зависит от величины градиента в этом пикселе. Когда мы делаем это для всех клеток, мы начинаем видеть появление представления исходной структуры. Как было продемонстрировано ранее с более простыми фигурами, что-то подобное можно использовать в качестве подписи для данной формы. Это известно как гистограмма ориентированных градиентов или функция HoG.

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

Объединение функций

Как отмечалось ранее, нет необходимости использовать только один тип функции для обнаружения объектов. Мы можем комбинировать функции как на основе цвета, так и на основе формы. Ведь они дополняют друг друга в собираемой ими информации о желаемом объекте. Фактически, различные функции могут помочь нам разработать более надежную систему обнаружения. Тем не менее, мы должны быть осторожны с тем, как мы их используем. Например, предположим, что мы используем значения HSV в качестве одного входного объекта с плоским вектором, содержащим элементы a. И HoG в качестве другого признака с элементами b. Самый простой способ их объединения — объединить их. HSV и HoG в длинный вектор элементов a + b. Если мы визуализируем этот вектор как простую гистограмму, мы можем заметить разницу в величине между функциями на основе цвета и на основе градиента. Это потому, что они представляют разные величины. Этап нормализации может предотвратить доминирование одного типа над другим на более поздних этапах. Также обратите внимание, что элементов одного типа может быть намного больше, чем элементов другого. Это может быть проблемой само по себе, а может и не быть, но, как правило, неплохо посмотреть, есть ли избыточность в комбинированном векторе признаков. Например, можно использовать дерево решений для анализа относительной важности функций и отбросить те, которые не вносят большой вклад.

Создание классификатора

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

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

В идеале нам нужен сбалансированный набор данных. То есть количество автомобильных и не автомобильных изображений должно быть примерно равным. Если это не так, мы рискуем, что классификатор попытается предсказать все как принадлежащее к классу большинства. Существует несколько способов обработки несбалансированных наборов данных, например, дублирование некоторых выборок из меньшего класса, чтобы сбалансировать подсчеты. Для классификации транспортных средств, если у нас недостаточно изображений, отличных от автомобилей, мы можем просто извлечь больше из видеокадров. Хорошо, когда у нас есть значительный набор данных, нам нужно разделить его на две коллекции. Обучающий набор и тестовый набор. Как следует из названий, мы будем использовать изображения только из обучающего набора при обучении нашего классификатора, а затем проверим его работу на невидимых примерах из тестового набора. Чтобы избежать любых возможных эффектов упорядочения данных, мы должны выбирать или перемешивать набор данных случайным образом при его разделении для обучения и тестирования. Даже в обучающих и тестовых наборах мы должны стремиться к балансу между количеством изображений автомобилей и не автомобилей. Вся эта предварительная обработка может показаться большой работой, но алгоритмы машинного обучения работают по принципу «мусор на входе — мусор на выходе». Поэтому нам нужно быть осторожными с тем, чем мы их кормим.

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

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

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

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

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

Итак, как мы собираемся это сделать?

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

В общем случае мы не будем знать, какого размера будет интересующий нас объект на изображении, которое мы ищем. Поэтому имеет смысл искать в нескольких масштабах. В этом случае рекомендуется установить минимальный и максимальный масштабы, при которых мы ожидаем появления объекта, а затем разумное количество промежуточных масштабов для сканирования в качестве Что ж. Здесь нужно быть осторожным, так как общее количество окон, которые мы ищем, может быстро увеличиваться, что означает, что наш алгоритм будет работать медленнее. Мы ищем транспортные средства, поэтому имеет смысл ограничить наш поиск только теми областями изображений, где могут появляться транспортные средства. Кроме того, когда дело доходит до масштаба, мы знаем, например, что автомобили, которые кажутся маленькими, будут находиться у горизонта. Таким образом, поиск в мелком масштабе может быть ограничен даже узкой полосой изображения.

Ложные срабатывания

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

Отслеживание конвейера

Хорошо, давайте подытожим наш общий конвейер отслеживания.

  1. В каждом кадре видео мы будем запускать поиск транспортных средств с помощью метода скользящего окна.
  2. Везде, где наш классификатор возвращает положительное обнаружение, мы будем записывать положение окна, в котором было сделано обнаружение.
  3. В некоторых случаях мы можем обнаружить один и тот же автомобиль в перекрывающихся окнах или в разных масштабах. В случае перекрывающихся обнаружений мы собираемся назначить положение обнаружения центроиду перекрывающихся окон.
  4. У нас также есть ложные срабатывания, которые мы будем отфильтровывать, определяя, какие обнаружения появляются в одном кадре, но не появляются в следующем. Получив обнаружение с высокой достоверностью, мы можем записать, как его центр тяжести перемещается от кадра к кадру, и в конечном итоге оценить, где он будет появляться в каждом последующем кадре.

Резюме

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

использованная литература

  1. Основы компьютерного зрения — самоуправляемые автомобили (поиск полос движения)


2. Введение в нейронные сети для беспилотных автомобилей (основные понятия, часть — 1)



3. Введение в нейронные сети для беспилотных автомобилей (часть фундаментальных концепций — 2)



4. Введение в глубокое обучение для самоуправляемых автомобилей (часть — 1)



5. Введение в глубокое обучение для самоуправляемых автомобилей (часть 2)



6. Введение в сверточные нейронные сети для беспилотных автомобилей



7. Введение в Keras и трансферное обучение для самоуправляемых автомобилей



8. Компьютерное зрение и калибровка камеры для беспилотных автомобилей



9. Усовершенствованные методы поиска полосы движения (беспилотные автомобили)



На этом мы подошли к концу этой статьи. Спасибо, что прочитали это и последовали за нами. Надеюсь, вам понравилось! Большое спасибо за прочтение!

Мое Портфолио и Linkedin :)