Вивек Ядав, доктор философии

ОБНОВЛЕНИЕ: С момента написания этой статьи я продолжил работу над моделью и включил увеличение яркости вместе с методами увеличения, представленными здесь. Используя эти методы, мне удалось повысить точность до 99,1%. Пост с этими результатами также находится здесь.

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

Остальная часть сообщения организована следующим образом:

  1. Исследовательский анализ данных
  2. Дополнение и предварительная обработка данных
  3. Архитектура модели
  4. Обучение
  5. Производительность модели на данных испытаний немецких знаков и производительность модели на невидимых данных
  6. Выводы

Исследовательский анализ данных

Сначала ознакомимся с самими данными. Данные немецкого знака состоят из многих знаков, как показано ниже,

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

Дополнение и предварительная обработка данных

Увеличение объема данных

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

Подробное описание дополнений и кода представлено в предыдущем посте https://medium.com/@vivek.yadav/dealing-with-unbalanced-data-generating-additional-data-by-jittering-the-original-image -7497fe2119c3 # .sgh2jfdqu

Предварительная обработка:

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

Мы изменим масштаб всех изображений, чтобы их значения интенсивности варьировались от -,5 до 0,5.

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

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

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

Следующие 3 модуля состоят из 32, 64 и 128 (соответственно) фильтров 3x3, за которыми следуют maxpooling и dropout. Выходные данные каждого сверточного модуля поступают в слой с прямой связью. Обоснование состоит в том, что полностью подключенный уровень имеет доступ к выходным сигналам фильтров низкого и высокого уровня и имеет возможность выбирать функции, которые работают лучше всего. Слои прямой связи состоят из 2 скрытых слоев с 1024 нейронами в каждом слое. Дополнительные слои исключения применяются после каждого из полностью связанных слоев.

Идея интенсивного использования исключения состоит в том, чтобы избежать переобучения и заставить сеть изучать несколько моделей для одних и тех же данных. Эффект от добавления отсева подробно объяснен в предыдущем среднем сообщении https://medium.com/@vivek.yadav/why-dropouts-prevent-overfitting-in-deep-neural-networks-937e2543a701#.5v3w4fl2d

Последний слой softmax используется для вычисления логарифма потери прогноза модели. Кроме того, включена стоимость l2-регуляризации, чтобы снизить вес модели.

Обучение:

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

  1. Создавайте 10 новых изображений для каждого изображения в обучающем наборе с помощью увеличения данных
  2. Разделите данные на обучающие и проверочные наборы таким образом, чтобы набор проверки составлял 25% от обучающего набора.
  3. После первых 10 эпох уменьшите увеличение в 0,9 раза за эпоху.

Эффективность модели:

После определения всех параметров модели потребовалось около 4 часов обучения на Nvidia Titan X. Полную сборку машины, которую я использовал, можно найти здесь. После обучения результативность по немецким тестовым данным была чуть выше 98,8%.

Эффективность модели для невидимых данных дорожных знаков в США

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

Хорошие примеры:

Плохие примеры:

Размышления

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

Благодарности:

Я очень благодарен Udacity за выбор меня в первую когорту, это позволило мне найти много единомышленников. Я особенно многому научился из бесед с Хенриком Тюннерманном и Джоном Ченом. Я также благодарен за грант от NVIDA на GPU. Хотя для работы, но и для Udacity использую. :)