Следующий пост является частью курса нейронных сетей в Тартуском университете и создан тремя студентами: Индреком Полдингом, Андреасом Пеэтером Леттом и Лизетт Паюла. Целью нашего проекта было впервые познакомиться с 2D-обнаружением и опробовать различные подходы с использованием Waymo Open Dataset. Для этого мы поэкспериментировали с алгоритмом обнаружения объектов под названием YOLO (версии 3 и 5) в Google Colab.

Введение

Набор данных

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

Поскольку наш проект ориентирован на 2D-обнаружение, единственные данные, которые мы фактически используем, - это изображения с камеры. Набор данных содержит около 10 миллионов аннотаций камеры, все вручную аннотированы для 1150 сцен. Каждый объект (автомобили, пешеходы, велосипедисты и знаки) аннотируется плотно подогнанным двухмерным ограничивающим прямоугольником изображения с разрешением 4-DOF, выровненным по оси. Метка кодируется как (cx, cy, l, w) с уникальным идентификатором отслеживания, где cx и cy представляют центральный пиксель прямоугольник l представляет длину прямоугольника по горизонтальной (x) оси в кадре изображения, а w представляет ширину прямоугольника по вертикали (y) ось в кадре изображения.

Еще до того, как мы начали этот проект, было ясно, что этот набор данных слишком велик, чтобы с ним могли справиться такие новички, как мы, в данный период времени. На веб-странице Waymo видно, что размер всего набора данных составляет почти 2 ТБ. Однако он разделен на блоки по 25 ГБ, поэтому мы решили начать с одного из них.

Еще одна большая проблема с этим набором данных - его довольно сложная структура. Чтобы действительно использовать его с моделями YOLO v3 и v5, нам сначала нужно было адаптировать его формат.

Корректировка данных

Мы изменили сценарий adapter.py, чтобы преобразовать тип данных с .tfrecord в файлы .jpg и .txt, чтобы его можно было использовать больше легко с моделями YOLO.

Модификации исходного скрипта включали в себя исключение ненужной информации (мы сохранили только 4 из 14 информативных переменных), изменение масштаба координат метки между 0 и 1 и изменение имен классов на целые числа для облегчения использования.

(источник: https://github.com/Yao-Shao/Waymo_Kitti_Adapter/blob/master/adapter.py)

Алгоритмы обнаружения и оценки 2D

ЙОЛО

YOLO или You Only Look Once - это быстрая система обнаружения объектов в реальном времени. Он чрезвычайно быстрый и точный, на основе испытательного набора COCO он имеет наилучшее соотношение между скоростью и точностью. YOLO применяет одну нейронную сеть ко всему изображению. Эта NN делит изображения на области и прогнозирует ограничивающие рамки и вероятности для каждой области. Эти ограничивающие прямоугольники взвешиваются по прогнозируемым вероятностям.

Модель YOLO имеет ряд преимуществ перед системами на основе классификаторов. Он смотрит на все изображение во время тестирования, поэтому его прогнозы основываются на глобальном контексте изображения. Он также делает прогнозы с одной оценкой сети, в отличие от таких систем, как R-CNN, которые требуют тысячи для одного изображения. Это делает его чрезвычайно быстрым, более чем в 1000 раз быстрее, чем R-CNN, и в 100 раз быстрее, чем Fast R-CNN.

YOLOv3

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

Сеть DarkNet-53 является основой YOLOv3. Его архитектуру можно увидеть ниже.

YOLOv5

YOLOv5 - это новейшая версия алгоритма YOLO, которая была публично выпущена 27 мая 2020 года. Его природа очень похожа на YOLOv4, который имеет большую точность, больше подходит для обучения с одним графическим процессором и быстрее, чем YOLOv3. Но более новая версия YOLOv5 имеет ряд преимуществ перед YOLOv4.

Во-первых, YOLOv5 изначально реализован в PyTorch, он извлекает выгоду из устоявшейся экосистемы PyTorch: проще поддержка и проще развертывание. Более того, как более широко известная исследовательская структура, итерация YOLOv5 может быть проще для более широкого исследовательского сообщества. Это также упрощает развертывание на мобильных устройствах, поскольку модель может быть легко скомпилирована в ONNX и CoreML.

Во-вторых, YOLOv5 быстр - невероятно быстр. В ноутбуке YOLOv5 Colab, работающем на Tesla P100, было достигнуто время логического вывода до 140 кадров в секунду (FPS)! Напротив, YOLOv4 достиг 50 FPS после преобразования в ту же библиотеку Ultralytics PyTorch.

В-третьих, YOLOv5 точен. Тесты набора данных по подсчету и обнаружению клеток крови (BCCD) достигли примерно 0,895 средней точности (mAP) после обучения 100 эпох. Алгоритм имеет сопоставимую производительность с EfficientDet и YOLOv4, но редко можно увидеть такие общие улучшения производительности без потери точности.

В-четвертых, YOLOv5 маленький. В частности, файл весов YOLOv5 почти на 90 процентов меньше, чем YOLOv4. Это означает, что YOLOv5 гораздо проще развернуть на встроенных устройствах.

Метрики оценки

Одним из наиболее распространенных показателей, используемых для оценки производительности детектора объектов, является средняя точность (AP) или средняя средняя точность (mAP), если взять среднее значение по всем классам.

Чтобы вычислить это, нам нужно посмотреть на кривую точности (доля правильно предсказанных положительных результатов среди всех прогнозов) и вспомнить (доля правильно предсказанных положительных результатов среди всех основных истин). Детектор объектов определенного класса считается хорошим, если его точность остается высокой по мере увеличения запоминания. Чтобы сравнить характеристики детекторов объектов, мы смотрим на область под кривой точности-отзыва (AUC). На практике AP - это усредненная точность для всех значений отзыва от 0 до 1. Формула для AP приведена ниже:

AP = ∫p (r) dr, где p (r) - кривая точного отзыва.

Основной оценочной метрикой для задачи обнаружения объектов Waymo 2D также является средняя точность каждого класса. Для нашего проекта мы использовали следующий репозиторий для расчета метрик: https://github.com/rafaelpadilla/Object-Detection-Metrics. Мы выбрали именно этот, поскольку он предполагает, что файлы меток (.txt) содержат строку class_name, left, top, right, bottom для каждого объекта, и наше форматирование было уже довольно похоже. Тем не менее, нам нужно было переписать все файлы меток наземной достоверности и адаптировать сценарий detect.py для вывода в том же формате.

Из-за большого размера набора для тестирования Waymo (~ 200 ГБ) мы не будем отправлять образец заявки на официальную проверку, чтобы получить окончательную метрику оттуда, а вместо этого мы загрузим меньший помеченный набор тестов и вычислим метрики по нему.

Применение алгоритмов YOLO v3 и v5 на практике

В этой главе мы поделимся своими успехами и неудачами в применении моделей YOLOv3 и YOLOv5 на практике. Практическая часть нашей работы состоит из четырех подходов:

А) применение YOLOv3 с предварительно натренированными весами;

Б) Применение YOLOv5 с предварительно натренированными весами;

C) Точная настройка весов YOLOv3 в наборе данных Waymo Open;

D) Точная настройка весов YOLOv5 в наборе данных Waymo Open.

Начальный прогресс и проблемы

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

К счастью, мы обнаружили эту ошибку и сумели исправить ее, пока не стало слишком поздно.

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

Сравнение обнаружения изображений

Предварительно обученная сеть YOLOv3 очень хороша в обнаружении объектов. Он обучен на наборе данных COCO с 80 классами, но задача Waymo предполагает только четыре класса объектов. У использования предварительно обученных моделей YOLO (без точной настройки) также есть некоторые недостатки:

  • единственный «знак», по которому их обучили, - это «знак остановки»;
  • они могут обнаруживать велосипеды, но задача обнаружения Waymo рассчитана на велосипедистов (велосипед + человек).

Пример обнаружения с предварительно обученными весами представлен ниже.

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

  • Человек - ›ПЕШЕХОД;
  • автомобиль, автобус, грузовик, поезд, самолет, мотоцикл - ›ТРАНСПОРТ; (*)
  • знак остановки - ›ЗНАК;
  • велосипед - ›ВЕЛОСИПЕД.

Основываясь на предыдущих модификациях, следует помнить о некоторых вещах. Из-за модификаций классов VEHICLE, CYCLIST и SIGN значение показателя достоверности теряет некоторую ценность. Допустим, модель обнаруживает грузовик с достоверностью 0,45, поэтому мы представляем это как АВТОМОБИЛЬ с уверенностью 0,45, хотя модель могла бы быть намного более уверенной в том, что объект является транспортным средством (просто не уверен, грузовик это или автобус. или машина и т.д…). Это, в свою очередь, также может повлиять на окончательные значения AP (и mAP).

Однако мы не уделяли особого внимания этой проблеме, поскольку она присутствует в обоих случаях (при использовании v3 и v5).

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

Согласно файлу этикетки от Waymo, на этом изображении есть:

  • 9 предметов из класса АВТОМОБИЛЬ;
  • 14 предметов из класса PEDESTRIAN;
  • 9 объектов из класса SIGN;
  • 1 объект из класса CYCLIST.

Посмотрим, насколько хорошо наши модели обнаруживают объекты.

A) Применение YOLOv3 с предварительно натренированными весами

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

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

Б) Применение YOLOv5 с предварительно натренированными весами

Предварительно обученная модель YOLOv5 дает аналогичные результаты, но, судя по этому конкретному примеру, выглядит немного хуже - она ​​не обнаружила ни одного из 3 транспортных средств на переднем плане.

C) Точная настройка весов YOLOv3 в наборе данных Waymo Open

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

D) Точная настройка весов YOLOv5 в наборе данных Waymo Open

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

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

Итоговые показатели

Окончательные метрики были рассчитаны на проверочном наборе. Причина использования данных проверки вместо данных тестирования заключается в том, что наборы данных довольно большие, и у нас закончилось место на Google Диске, поэтому мы не могли использовать отдельные тестовые данные.

Задача обнаружения Waymo 2D предполагает, что модели будут рассчитывать AP для классов ПЕШЕХОД, ТРАНСПОРТ, ЗНАК и ВЕЛОСИПЕД. Из этих классов также рассчитывается МАР. Однако, поскольку мы используем предварительно обученные модели для прогнозов, мы не можем сравнивать наши результаты с использованием класса SIGN, поскольку предварительно обученные модели YOLOv3 и YOLOv5 были обучены только по классу «стоп-сигнал». Также для этих случаев будет справедливо не использовать AP класса CYCLIST.

Из-за этого мы сравниваем только AP (истинное положительное значение считается, если IOU ≥50%) для первых двух классов, и имея только те для сравнения, нет смысла представлять среднее значение (mAP). Результаты можно увидеть из следующей таблицы.

Пример кривых прецизионного возврата для классов 0 (АВТО) и 1 (ПЕШЕХОД) в случае доработанной модели YOLOv5:

Результаты

Как видно из предыдущей таблицы, результаты не слишком хороши. Хотя с моделями было указано много проблем, для нас это не очень удивительно. Еще одним фактором, который, вероятно, сыграл роль в результатах точной настройки моделей, было то, что мы использовали только 25 ГБ обучающих данных из 2 ТБ. Из этих 25 ГБ мы использовали только изображения с камеры, которые были обращены вперед или по диагонали в стороны.

Это означает, что у нас было около 9000 изображений для обучения, и очень многие из них были похожи, поскольку данные были собраны как последовательные изображения из машины, едущей по улице. Не говоря уже о том, что для всех сцен у нас было два изображения, которые захватили стороны (по диагонали), и одно, которое захватило фронт, но сама сцена была точно такой же. Это не допускало большой вариативности общего пейзажа изображений. Таким образом, обучение моделей, как правило, приводило к переобучению наших обучающих данных, как видно из диагностических графиков, выводимых нашей моделью:

Что касается того, почему предварительно обученные модели YOLO, судя по нашим оценкам AP, выглядят очень плохо, то мы пока не совсем уверены. Например, на наш взгляд, класс ПЕШЕХОД должен был обнаруживаться намного лучше, но по какой-то причине мы получили очень низкий AP для этого класса. Возможный ответ может заключаться в том, что в наших сценариях форматирования данных или обнаружения все еще есть некоторые ошибки, и поэтому вычисленная точка доступа на самом деле неверна. К сожалению, из-за нехватки времени мы пока не можем продолжить расследование.

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

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

Газета ЁЛОв3. Https://pjreddie.com/media/files/papers/YOLOv3.pdf

Код Adapter.py. Https://github.com/Yao-Shao/Waymo_Kitti_Adapter/blob/master/adapter.py

Метрики обнаружения объектов. Https://github.com/rafaelpadilla/Object-Detection-Metrics

YOLOv3. Https://pjreddie.com/darknet/yolo/

Открытый набор данных Waymo. Https://arxiv.org/pdf/1912.04838.pdf

YOLOv5. Https://blog.roboflow.ai/yolov5-is-here/

YOLOv3 для новичков. Https://towardsdatascience.com/dive-really-deep-into-yolo-v3-a-beginners-guide-9e3d2666280e