Проекты и сжатые решения

В минувшие выходные я закончил проекты Udacity по самостоятельному вождению автомобиля, семестр 1! Я с нетерпением жду семестра 2, но сначала я хотел бы сделать свой первый пост на Medium о своем опыте работы с первым семестром и вкратце рассказать о своих решениях (и их ссылках!) Для каждого проекта. Я запускал проекты внутри контейнера докеров, используя образ nvidia-docker, и обучал все свои модели на графическом процессоре GTX-1080.

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

Математика курса не дала мне никаких проблем, любой человек с солидным опытом в математике и программировании легко справится с этим термином. Линейная алгебра и исчисление делают свое дело!

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

Мои решения были вдохновлены сообщениями моих одноклассников об отличных решениях:

Без лишних слов с моей стороны, давайте начнем с первого проекта (длинный пост впереди):

Проект 1: поиск полосы движения

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

Этапы конвейера:

  • Преобразуйте изображение в оттенки серого.
  • Примените фильтр размытия по Гауссу.
  • Используйте хитрый алгоритм обнаружения краев для извлечения краев изображения.
  • Примените маску к изображению, которая включает «интересующую область».
  • Используйте преобразование Хафа, чтобы обнаружить параллельную линию на замаскированном изображении.
  • Проведите линию y = m * x + b через обнаруженные точки на изображении.
  • Нарисуйте на изображении подобранную линию.

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

Проект 2: Классификатор дорожных знаков

Второй проект заключается в разработке классификатора дорожных знаков для немецких дорожных знаков с использованием полносвязной сверточной нейронной сети, цель - достичь минимальной точности 93% на тестовом наборе. Используя некоторые методы увеличения данных и правильную сетевую архитектуру, проект можно реализовать примерно за два-три дня. Уловка заключается в увеличении данных!

Решение заключалось в:

  • Изучение набора данных.
  • Балансировка классов в наборе данных с помощью увеличения данных: случайный наклон и смещение классов знаков, которые имеют менее 1750 примеров.
  • Преобразуйте изображения из RGB в черно-белые, а затем используйте выравнивание гистограммы для усиления сигнала изображения.
  • Подходит для модели сверточной нейронной сети.

Архитектура модели:

Моя модель состоит из трех двумерных слоев свертки и максимального объединения с функциями активации RELU (выпрямленный линейный блок). Сглаженный слой с 1000 нейронами и 4 полностью связанных слоя, каждый с пропаданием (сохраните вероятность: 0,85), чтобы избежать чрезмерной подгонки.

Гиперпараметры (настраиваются вручную):

  • Оптимизатор: Адам
  • Размер партии: 512
  • Эпох: 15
  • Скорость обучения: 3 (10) ^ - 5

Точность:

  • Обучение: 99,32%
  • Проверка: 97,07%
  • Тест: 94.09%

В конце проекта вас попросят найти изображения немецких дорожных знаков и протестировать вашу модель на них. Эта модель правильно классифицировала 8 изображений из 9!

Проект 3: Поведенческое клонирование:

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

Совет для этого проекта - сразу перейти к публикации Nvidia о сквозном глубоком обучении для самостоятельного вождения автомобилей и использовать архитектуру, которую они объясняют в статье.

"Решение":

Процесс сбора данных немного утомителен, и лучше всего это делать с помощью xbox или контроллера ps3.

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

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

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

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

Гиперпараметры настраивались вручную:

  • Отсев: 0,55
  • Скорость обучения: 1 (10) ^ - 4
  • Размер партии: 64
  • Шагов на эпоху: 500
  • Эпох: 10

Проект 4: Расширенный поиск полосы движения

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

"Решение":

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

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

  • Преобразуйте исходное изображение в оттенки серого
  • Вычислить и нормализовать абсолютную производную Собеля изображения относительно x
  • Пороговое значение для изображения x gradient → первого двоичного файла
  • Преобразуйте исходное изображение в цветовое пространство HLS и отделите S-канал.
  • Порог S-канала. → второй двоичный
  • Объедините двоичные файлы изображения: x gradient и S-канал с пороговым значением.

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

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

Обнаруженные полосы возвращаются к исходному изображению, и область полосы выделяется.

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

Проект 5: Обнаружение и отслеживание транспортных средств

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

"Решение":

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

  • 8792 изображения автомобилей
  • 8 968 изображений, не относящихся к автомобилям

Набор достаточно сбалансирован, но в этом случае может быть выгодно иметь доминирующий класс: неавтомобильный класс.

Выполнив увеличение данных (как в проекте 2), я уменьшил количество ложных срабатываний и достиг точности классификации 98,67% на тестовой выборке.

Я тренировал свою модель с помощью:

  • Изображения автомобилей: 8,792
  • Неавтомобильные изображения: 11468

Извлекая характеристики HOG (гистограммы ориентированных градиентов) для каждого изображения, классификатор изучает особенности, связанные с автомобилем.

Параметры модели:

  • Цветовое пространство YUV
  • Ориентации HOG: 11
  • Пикселей на ячейку: 16
  • Ячейки в блоке: 2
  • Размер функционального вектора: 1188

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

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

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

Не довольны окончательным результатом проекта?

  • Использование традиционного метода обнаружения транспортных средств может быть не лучшим подходом. Сверточная нейронная сеть работает лучше в тех случаях, когда характеристики HOG новых транспортных средств не совпадают с таковыми в обучающем наборе. Использование сверточной нейронной сети может повысить точность обнаружения.
  • Трубопровод может выйти из строя при разных условиях освещения (тени и отражения, ночь, дождь и т. Д.)
  • Наконец, вычисление положений транспортных средств на изображении и прогнозирование их расположения в следующих кадрах также может сделать конвейер более надежным.

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