Вивек Ядав, доктор философии
ОБНОВЛЕНИЕ: С момента написания этой статьи я продолжил работу над моделью и включил увеличение яркости вместе с методами увеличения, представленными здесь. Используя эти методы, мне удалось повысить точность до 99,1%. Пост с этими результатами также находится здесь.
В этом посте мы рассмотрим работу, которую я проделал для проекта 2 проекта беспилотных автомобилей Udacity, классифицируя немецкие дорожные знаки с помощью глубокого обучения. Для беспилотного автомобиля очень важно читать дорожные знаки и интерпретировать их, чтобы понимать правила дорожного движения. Нейронные сети с глубоким обучением или сверточные нейронные сети стали мощными классификаторами изображений за последнее десятилетие. В первую очередь из-за достижений в технологии графических процессоров для быстрых вычислений. В этом проекте мы рассмотрим решение для классификации данных немецких знаков, которое дало точность 98,8 на тестовых данных. В качестве справки ниже приведены прогнозы из других статей и человеческая точность.
Остальная часть сообщения организована следующим образом:
- Исследовательский анализ данных
- Дополнение и предварительная обработка данных
- Архитектура модели
- Обучение
- Производительность модели на данных испытаний немецких знаков и производительность модели на невидимых данных
- Выводы
Исследовательский анализ данных
Сначала ознакомимся с самими данными. Данные немецкого знака состоят из многих знаков, как показано ниже,
Мы также ожидаем, что каждый знак будет присутствовать только в соответствующих местах, поэтому существует разница в количестве знаков, которые можно было бы увидеть. В этом наборе данных наиболее распространенным знаком был знак 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-регуляризации, чтобы снизить вес модели.
Обучение:
Сначала мы начнем с большого дополнения, чтобы модель изучала общие особенности дорожного знака, и постепенно уменьшим его, чтобы настроить модель. Обучение проводится в следующие этапы:
- Создавайте 10 новых изображений для каждого изображения в обучающем наборе с помощью увеличения данных
- Разделите данные на обучающие и проверочные наборы таким образом, чтобы набор проверки составлял 25% от обучающего набора.
- После первых 10 эпох уменьшите увеличение в 0,9 раза за эпоху.
Эффективность модели:
После определения всех параметров модели потребовалось около 4 часов обучения на Nvidia Titan X. Полную сборку машины, которую я использовал, можно найти здесь. После обучения результативность по немецким тестовым данным была чуть выше 98,8%.
Эффективность модели для невидимых данных дорожных знаков в США
Модель очень хорошо работает с изображениями, которые похожи на знаки в немецком наборе данных. Например, знак «Стоп» и «Не входить» классифицируются правильно, с высокой достоверностью.
Хорошие примеры:
Плохие примеры:
Размышления
Это был очень интересный проект, и, вероятно, я впервые занялся проблемой глубокого обучения с нуля до стадии, когда я мог сравнить производительность с результатами, опубликованными в литературе. Есть несколько вещей, которые можно попробовать для дальнейшего улучшения модели. Один простой способ - позволить модели тренироваться дольше. Поскольку каждый цикл обучения занимал около 4 часов, я не выполнял оптимизацию гиперпараметров, чтобы выбрать лучшую скорость обучения или регуляризацию.
Благодарности:
Я очень благодарен Udacity за выбор меня в первую когорту, это позволило мне найти много единомышленников. Я особенно многому научился из бесед с Хенриком Тюннерманном и Джоном Ченом. Я также благодарен за грант от NVIDA на GPU. Хотя для работы, но и для Udacity использую. :)