Создайте проект распознавания дорожных знаков

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

Цели/этапы этого проекта следующие:

  • Загрузите набор данных (см. ниже ссылки на набор данных проекта)
  • Исследуйте, обобщайте и визуализируйте набор данных
  • Проектировать, обучать и тестировать архитектуру модели
  • Используйте модель, чтобы делать прогнозы для новых изображений
  • Проанализируйте вероятности softmax новых изображений
  • Подведите итоги в письменном отчете

Вот ссылка на код моего проекта https://github.com/iceberg12/Udacity_selfDrivingCarP2.

Сводка и исследование набора данных

1. Основная сводка набора данных.

Я использовал библиотеку pandas для расчета сводной статистики набора данных дорожных знаков:

  • Размер обучающей выборки 34799
  • Размер проверочного набора 4410
  • Размер тестового набора 12630
  • Форма изображения дорожного знака (32, 32, 3)
  • Количество уникальных классов/меток в наборе данных — 43.

2. Исследовательская визуализация набора данных.

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

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

Кроме того, я рисую пример для каждого класса с их метками, полученными из эталонного файла signnames.csv.

Проектирование и тестирование архитектуры модели

1. Предварительная обработка изображений

Я решил преобразовать изображения в оттенки серого, потому что дизайн трафика не зависит от цвета. Таким образом, используя оттенки серого, мы можем немного уменьшить размер модели. В качестве первого шага я использую идеи из статьи Пьера Сермане и Яна Лекуна «Распознавание дорожных знаков с помощью многомасштабных сверточных сетей». Речь идет о преобразовании, основанном на глобальной, а затем локальной нормализации контраста, поэтому я реализовал его с помощью skimage и scipy.ndimage. Кроме того, я сравниваю преобразование в пространстве YUV и RGB и понимаю, что RGB дает лучшую граничную производительность, чем YUV, обсуждаемый в статье, поэтому я выбираю преобразование в RGB. После этого следует преобразование в оттенки серого с весом [0,2126, 0,7152, 0,0722].

Вот пример изображения дорожного знака до и после преобразования и оттенков серого.

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

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

Чтобы добавить больше данных в набор данных, я использовал следующие методы:

  • Поворот [-15, 15] градусов
  • Трансляция [-4, 4] пикселей в обоих измерениях x, y
  • Увеличение [80%, 120%]

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

Расширенный набор данных имеет более сбалансированное распределение

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

Моя окончательная модель состояла из следующих слоев:

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

Для обучения модели я использовал AdamOptimizer для автоматической оптимизации скорости обучения, размер партии 128, количество эпох 30 и значения скорости обучения 0,001.

4. Обсуждение

Мои окончательные результаты модели были:

  • точность тренировочного набора 0,748
  • точность набора валидации 0,953
  • точность набора тестов 0,936

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

  • Первой испытанной архитектурой была LeNet из-за ее прочной и простой структуры.
  • Некоторые проблемы с исходной архитектурой заключаются в переоснащении обучающей выборки, а затем в низкой точности (~0,89).
  • Как корректировалась архитектура и почему она корректировалась? Типичные корректировки могут включать в себя выбор другой архитектуры модели, добавление или удаление слоев (объединение, выпадение, свертка и т. д.), использование функции активации или изменение функции активации. Одним из распространенных оправданий для корректировки архитектуры может быть переоснащение или недооснащение. Высокая точность на тренировочном наборе, но низкая точность на проверочном наборе указывает на чрезмерную подгонку; низкая точность на обоих наборах свидетельствует о недостаточной подгонке.
  • Настроенными параметрами являются скорость отсева и скорость обучения. Показатели отсева были скорректированы на основе переобучения обучающего набора, то есть разрыва между точностью обучения и проверки. Скорость обучения была скорректирована, чтобы быть меньше, когда точность обучения продолжала колебаться и не увеличивалась.
  • Слои свертки обычно используют одинаковые веса фильтров и проходят через изображения, что делает обучение быстрее и проще. Техника выпадения дополнительно заставляет сеть обучаться с избыточностью из-за случайного выпадения нейронов, что делает производительность более обобщенной и надежной.

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

Вот пять немецких дорожных знаков, которые я нашел в Интернете:

Третье и четвертое изображения могут вызвать некоторые трудности из-за их перевода, размера и качества. Пятое изображение имеет схожую форму с «Остерегайтесь льда/снега» (видно в четвертой строке снизу вверх на изображениях раздела «Сводка и исследование набора данных»), которое потенциально может быть исправлено с помощью балансировки классов или создания дополнительных обучающих данных.

Вот результаты прогноза:

Визуализация нейронной сети

Сверточный слой 1

Сверточный слой 2

Я применил отсев для слоев свертки, полагая, что он все же помогает с регуляризацией, хотя количество нейронов невелико по сравнению с полносвязными слоями. Из визуализации видно, что для проверочных данных знаки «Конец ограничения скорости» / «Конец запрета проезда» играют большую роль, потому что из слоя свертки 1 мы видим множество диагональных линий. Для свертки 2 размеры малы, поэтому мы не можем уловить осмысленный смысл изображений. Один из способов улучшения — сохранить выходные данные этих слоев с высоким разрешением, применяя ОДИНАКОВОЕ заполнение, но обратите внимание, что максимальное объединение по-прежнему уменьшает размер карты объектов.