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

В конвейере, который я использовал, используется предварительная обработка данных и полностью сверточная сеть (FCN).

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

Предварительная обработка заключалась в стандартизации всех входных сигналов RGB от 0 до 1 с последующим вырезанием полосы из центра изображения и изменением размера полосы перед ее вводом в сеть. Я создал наложения вероятности того, что пиксель с маркировкой транспортного средства или дороги окажется в данном пикселе нового случайного изображения. Вероятность появления метки выше y = 170 или ниже y = 521 была очень низкой. Не было достаточно низкой вероятности ни для левой, ни для правой стороны изображения, чтобы обрезать интересующую область (ROI), используя также координату x. Эта стандартизованная и обрезанная область размером 352x800 пикселей использовалась для обучения нейронной сети. При составлении прогнозов верх / низ прогноза вне области рентабельности инвестиций 352x800 не анализировался, и всегда говорилось, что он не содержит ни транспортного средства, ни дороги. Это хорошо работает для городов в Карле и в этом соревновании; однако это было бы проблематично в реальной жизни, когда сети приходилось бы справляться с холмистой местностью.

Я пробовал различные разрешения изображений от 160x224 до 352x800. Несмотря на то, что все можно было легко обучить давать достойные результаты ›89 при FPS› 10, я обнаружил, что слишком сильное уменьшение изображения приводит к плохому обнаружению транспортных средств, когда этикетки были увеличены до исходного разрешения. Кроме того, при высоком разрешении (352x800) мне пришлось слишком сильно снизить сложность сети, чтобы поддерживать высокую частоту кадров. Я нашел хороший баланс между точностью и скоростью, используя изображения ROI с измененным размером от 240x480 до 288x576, и остановился на 256x512.

Полностью сверточная сетевая архитектура

Я решил использовать архитектуру FCN DenseNet, впервые опубликованную Jégou et al [1]. Эта архитектура является адаптацией архитектуры DenseNet, опубликованной Хуангом и др. [2].

Нелинейное преобразование, Hℓ, обычной нейронной сети с прямой связью полагается только на предыдущий уровень в качестве входных данных для следующего уровня: xℓ = Hℓ (xℓ-1). В архитектуре ResNet [3] были добавлены пропуски соединений, чтобы позволить градиенту течь в обратном направлении без исчезновения или взрыва во время обучения: xℓ = Hℓ (xℓ-1) + xℓ-1, что позволяло обучать очень глубокие сети. В архитектуре DenseNet возможность подключения была дополнительно улучшена за счет подключения всех предыдущих карт функций в качестве входных данных для следующего уровня: xℓ = Hℓ ([x0, x1,…, xℓ-1]). Помимо решения проблемы исчезающего / увеличивающегося градиента, это также позволяет сети повторно использовать веса. Количество новых функций, добавляемых в сеть на каждом уровне, называется темпом роста сети и может быть очень небольшим. Эти модификации позволяют получить самые современные результаты классификации изображений со значительно меньшим количеством обучаемых весов по сравнению с архитектурами ResNet. Именно этот высокий уровень точности и небольшое количество параметров сделали этот тип архитектуры привлекательным для решения этой задачи.

Вариант FCN архитектуры DenseNet, который я использовал, использовал пропускаемые соединения, чтобы помочь в увеличении масштаба карт функций, как показано ниже. Каждый уровень в каждом плотном блоке (DB) использует пакетную нормализацию, активацию ReLU, свертку 3x3 (то же самое) и выпадение.

Гиперпараметры сети, которые я варьировал, включали: количество плотных блоков, количество слоев в каждом плотном блоке, скорость роста сети, произошла ли первая понижающая / последняя повышающая дискретизация только с одним слоем BN / ReLU / Conv / dropout. (обозначенный как «Ранний переход» для простоты позже) и степень регуляризации.

Выбор сложности сети

Я экспериментировал с различными комбинациями гиперпараметров, включая количество плотных блоков, количество слоев в блоке и скорость роста. Поскольку окончательная оценка будет снижена за пропускную способность ниже 10 FPS, сложность сети была ограничена. Я обнаружил, что для разумного входного разрешения до 288x576 можно использовать параметры ~ 1M, при этом сохраняя частоту кадров выше 10 FPS. Я исследовал компромисс между глубиной сети (количество плотных блоков / количество слоев в блоке) и шириной сети (фактором роста). Я остановился на 3 плотных блоках, 4 слоя в блоке и коэффициенте роста 14 с ранним переходом.

Обучение и предотвращение переобучения

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

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

Помимо увеличения данных, во всей сети использовались выпадение и регуляризация l2 для предотвращения переобучения. После некоторых экспериментов были выбраны 15% отсева и регуляризация 1E-5 l2, поскольку они предотвращали переоснащение, но не добавляли слишком большого смещения в сеть.

Кроме того, для предотвращения переобучения из CARLA были созданы дополнительные изображения. Симулятор CARLA [4] использовался для создания примерно 400 новых последовательностей по 200 изображений в каждой для обучения / проверки. 10% последовательностей были использованы для проверки. Каждая последовательность была захвачена с использованием случайного количества автомобилей / пешеходов и погодных условий / условий освещения. Кроме того, были сделаны изображения как из города 01, так и из города 02. Выбор количества транспортных средств был смещен в сторону выбора большого количества транспортных средств, так как мне было сложнее идентифицировать пиксели транспортных средств, а не пиксели дороги в соревновании.

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

Выбор порога обнаружения

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

Возможные улучшения в будущем

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

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

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

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

использованная литература

1. Джегу и др., «Сотня слоев тирамису: полностью сверточные плотные сети для семантической сегментации», arXiv: 1611.09326 [cs.CV]

2. Хуанг и др., Плотно связанные сверточные сети, arXiv: 1608.06993 [cs.CV]

3. Он и др., Deep Residual Learning for Image Recognition, arXiv: 1512.03385 [cs.CV]

4. Досовицкий и др., CARLA: открытый симулятор городского вождения, материалы 1-й ежегодной конференции по обучению роботов, 2017

Дополнительные инструкции по созданию изображений CARLA

Я создал большое количество изображений для этого конкурса, но я думаю, что вместо того, чтобы размещать изображения для других, имеет смысл дать четкие инструкции о том, как создавать изображения самостоятельно. Днем вы можете легко сгенерировать более 100 тысяч изображений. Вкратце, что вы можете сделать для создания различных изображений погоды, количества автомобилей и пешеходов с соответствующими сегментами изображения: 1) Установите Карлу отсюда: http://carla.readthedocs.io/en/latest/getting_started/

2) Затем вы можете скопировать мой скрипт python отсюда: https://github.com/JSAustin/Lyft-Challenge/blob/master/generate_segmentation_images.py и поместить его в папку PythonClient распакованного каталога Carla.

3) запустите из корневого каталога Carla в cmd: 'CarlaUE4.exe -carla-server' (если вы хотите сгенерировать изображения с использованием второго города, вместо этого используйте 'CarlaUE4.exe / Game / Maps / Town02 -carla-server' )

4) запустите из каталога PythonClient в cmd: «generate_segmentation_images.py - autopilot - images-to-disk» Это сгенерирует наборы изображений в папке с меткой _out в каталоге PythonClient. Если вы работаете в Linux, замените .exe на .sh и добавьте "./" перед командой. В скрипте python эти строки определяют количество автомобилей / пешеходов и погодные условия. В настоящее время он настроен на создание множества случайных комбинаций, но вы можете отредактировать, если хотите изменить это:

NumberOfVehicles = random.choice ([85, 100, 115, 130, 145, 160, 175, 190, 215, 230, 245])

NumberOfPedestrians = random.choice ([10, 20, 30, 40, 50, 60])

WeatherId = random.choice ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])