Что вообще такое сверточные нейронные сети? Могут ли они делать больше, чем просто идентифицировать кошек?

Что такое сверточные нейронные сети

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

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

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

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

За сверточным слоем обычно следует объединяющий слой. Как упоминалось выше, каждый узел одного уровня связан со всеми остальными узлами следующего уровня. Если, например, первый уровень имеет 1000 узлов, а второй 500, будет 1000 x 500, что составляет 500 000 соединений. Это также означает, что нейронная сеть будет сосредоточена на очень многих функциях. Слой объединения уменьшает размер представления, разбивая входные данные на регионы и выбирая наиболее сильные характеристики в каждой из них. Это ускоряет вычисления и делает обнаруженные функции более четкими. В конце сверточной нейронной сети обычно находится полностью связанный слой, который использует обнаруженные функции для классификации входных данных по различным классам в соответствии с набором данных.

Прежде чем продолжить, мы должны знать, что компьютеры не видят изображения так, как мы. Каждое изображение рассматривается как 3 матрицы значений пикселей (по 1 для каждого канала RGB). В процессе свертки используются «детекторы признаков», называемые фильтрами или ядрами. Логика заключается в том, что фильтр может обнаружить определенную функцию в части изображения. он, вероятно, может обнаружить похожие изображения на других изображениях или в разных частях одного и того же изображения.

Сверточные нейронные сети в беспилотных автомобилях

В составе команды, которая недавно выиграла национальный конкурс автономных мини-гоночных автомобилей OpenZeka MARC, я смог протестировать их на настоящем мини-транспортном средстве. Мини-машина, которую я использовал, оснащена комплектом разработчика NVIDIA Jetson TX2, камерой ZED, лидаром и блоком инерциальных измерений. В автомобиле используется операционная система роботов ROS. Ради этого поста я провел эксперимент только с камерой ZED и сверточными нейронными сетями. Ниже представлен обзор моего подхода.

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

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

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

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

В реальной жизни автономному автомобилю требуется гораздо больше датчиков и способ хранить и транспортировать огромное количество сгенерированных данных. Сбор достаточного количества данных о тренировках для безопасного вождения также является проблемой. Достаточно ли современных технологий для поиска дешевых решений этих проблем при одновременном повышении безопасности - это тема для обсуждения. Единственный способ узнать это - попытаться решить их.

Это мой первый пост на Medium. Если вам понравилось, не забудьте указать 💛 через 👏 👏 👏 и подписаться на меня в Medium или LinkedIn. Будем очень признательны за ваши замечания и предложения.