YOLO history (Part 2)
Введение
В двух словах о предыдущей статье
Ранее мы подробно рассмотрели архитектуру YOLOv1. Это первый single-shot детектор, способный работать в режиме реального времени (45 FPS). Такой скорости удалось добиться благодаря небольшой модели с GoogLeNet в основании (около 50 миллионов параметров), особой структуре выходного тензора и лосс-функции, позволившей учитывать и положение ббоксов, и классы.
Выходной тензор имел размер 7х7х30. Каждый вектор из 30 фичей отвечал за конкретную часть изображения и содержал информацию о размерах 2-х ббоксов, confidence score для каждого из ббоксов и 20 вероятностей классов.
В итоге получилось создать самый быстрый, но не самый качественный детектор. Он показывал качество 66.4% против 73.2% у Faster R-CNN с VGG-16.
Подробнее об этом читайте в нашей прошлой статье 🙂
Авторы YOLO подвели итоги первой версии модели и подробно разобрали все ее слабые места. Анализ предсказаний показал, что модель плохо локализует маленькие объекты и отделяет друг от друга группы объектов, следовательно, recall модели страдает. Анализ ошибок помог авторам найти способы улучшения модели и всего через полгода (в декабре 2016 года) выпустить следующую версию YOLO — YOLO9000. Она во всем превосходила предшественника, да еще могла распознавать 9000 классов (отсюда и название).
Что позволило авторам значительно улучшить качество модели и при этом не потерять в точности? Давайте разбираться.
YOLOv2 (YOLO9000: Better, Faster, Stronger)
В двух словах об изменениях модели
- Авторы создали полносверточную сеть, заменив полносвязные слои у детекционной головы на сверточные. Это позволило модели обучаться на картинках разного размера и значительно повышать итоговое качество.
- Они полностью переосмыслили способ предсказания ббоксов: перешли на анкерный метод (Anchor Boxes), стали предсказывать смещения относительно ячеек, а не координаты, добавили предсказание классов для каждого из анкеров.
- Они также заменили GoogLeNet на Darknet-19 — более маленькую сеть из 19 сверточных слоев и 5 пуллингов, что помогло увеличить размер выходного тензора с 7х7 до 14х14 (на самом деле в итоге он будет 13х13, об этом подробней скажем ниже).
- Главное нововведение: авторы научились обучать модель сразу на задачу классификации и детекции. Для соединения классов из двух датасетов авторы использовали древовидную структуру WordTree. Во время обучения для картинок из детекционного датасета учитывалась ошибка и детекции, и классификации, а для картинок из классификационного — ошибка классификации ббокса с самым большим confidence score и ошибка детекции этого ббокса в предположении, что он пересекается с реальным на 0.3 IOU.
Можно выделить два основных достижения этой работы:
- авторы не просто сделали новую SOTA-модель для задачи детекции, а сделали ее более быстрой в сравнении с YOLOv1, Faster R-CNN и SSD;
- авторы придумали метод обучения модели задачам детекции (на датасете COCO) и классификации (ImageNet) одновременно.
Общие изменения
- Добавили batch normalization и удалили dropout.
- Изменили подход к обучению классификационной модели: дообучили классификатор на увеличенных изображениях (448х448 вместо 224х224 в YOLOv1).
- Заменили GoogLeNet на Darknet-19 — еще более маленькую сеть, которая состояла всего из 19 сверточных слоев и 5 пуллингов. Это позволило сохранить большой FPS модели, несмотря на значительные изменения в детекционной голове.
Изменения детекционной головы
В YOLOv1 детекционная голова состояла из нескольких полносвязных слоев. В этой версии авторы решили удалить все полносвязные слои и заменить их на сверточные, а также удалить один пуллинг слой, чтобы увеличить размер выходного тензора в 2 раза. Еще они заметили, что большие объекты обычно располагаются в центре изображения, и если сделать нечетное количество ячеек, то в центре объекта будет всего одна ячейка вместо 4-х. Поэтому вход модели был изменен с 448х448 на 416х416 для уменьшения выходного тензора с 14х14 до 13х13.
Помимо увеличения пространственной размерности выходного тензора авторы решили уйти от общего предсказания классов для всех ббоксов к предсказаниям вероятностей для каждого ббокса по отдельности. Таким образом, для обучения на VOC выходной тензор увеличился до 13х13х125, где для каждого ббокса предсказывается 5 чисел координат, конфиденс и 20 классов. Всего ббоксов 5 (чуть дальше будет объяснение), поэтому 25 * 5 = 125.
Для улучшения распознавания маленьких объектов был добавлен скипконнекшен со слоя размером фичей 26х26 к последнему слою модели. Такой скипконекшен называется passthrough layer. Он не имеет сверточных слоев. Для соблюдения размерностей исходные фичи размером 26х26 делятся на 4 части и добавляются в конец к фичам, полученным после предпоследнего слоя модели. Затем полученный вектор отправляется в последний сверточный слой.
Изменения в подходе к детекции
На этот раз авторы решили вдохновиться способом предсказания ббоксов у прямого конкурента, которого не удалось одолеть в первый раз — у Faster R-CNN. Так, вместо прямого предсказания ббоксов было решено использовать метод предсказания анкеров (anchor boxes).
Этот метод отличается ручной выборкой исходных размеров ббоксов, а не инициализацией случайными размерами, как в YOLOv1. Более того, если в YOLOv1 предсказывались координаты внутри ббокса + его ширина/высота, то в анкерном методе нужно предсказывать по координатам и по размерам то расстояние, на которое необходимо сдвинуть исходный ббокс. Такой подход работает более плавно и надежно.
Сразу возникает два новых вопроса. Как выбрать исходные ббоксы? Что это за расстояние такое и как оно работает? Давайте разбираться.
Выбор формы и количества ббоксов
Чтобы не тыкать пальцем в небо, авторы решили обратиться к тому, что у них было под руками — к ббоксам из тренировочных выборок COCO и VOC датасетов. Они взяли все размеры ббоксов и запустили на них k-means, тем самым разбили исходный набор на заданное количество кластеров. Для определения количества необходимых для использования ббоксов авторы фиксировали количество кластеров, вычисляли в каждом кластере усредненный по размерам ббокс и считали IOU между ббоксами из кластеров и исходными ббоксами.
В итоге они выбрали то количество кластеров, после которого IOU переставал сильно расти — 5 ббоксов.
Предсказание положения ббоксов
Итак, мы разобрались с количеством кластеров и исходными размерами, теперь посмотрим на то, как модель руководит изменением размеров и положением ббоксов.
Вообще, исходный способ определения координат (Секция Region Proposal Networks, в статье про Faster R-CNN) предсказанного ббокса основывается на предсказании значений
\( x=(t_x*w_a)-x_a\\ y=(t_y*h_a)-y_a \)
Допустим, модель предсказала \( t_x=1 \), тогда ббокс сместится вправо на ширину исходного анкера (\( w_a, h_a, x_a, y_a \) — ширина, высота и координаты анкера соответственно). Поскольку предсказания никак не ограничены, ббокс может переместиться в любую часть картинки независимо от ячейки, для которой он предсказывается. Вместе со случайной инициализацией модели это приводило к тому, что ей нужно было очень много времени для стабилизации предсказаний.
Чтобы облегчить обучение, авторы решили воспользоваться идеями из YOLOv1. И тоже использовать смещения. Но если в YOLOv1 авторы предсказывали смещение относительно центра ячейки, то сейчас, было решено использовать чуть более сложную формулу:
\( b_x=\sigma(t_x)+c_x\\ b_y=\sigma(t_y)+c_y\\b_w=p_we^{t_w}\\ b_h=p_he^{t_h}\\ \)
Где \( t_x, t_y, t_w, t_h \) — предсказания модели, \( c_x,c_y \) — координаты левого верхнего угла ячейки, \( p_w, p_h \) — априорные значения высоты и ширины анкера, \( \sigma \) — сигмойда.
На самом деле такой подход к предсказанию ббоксов немного уменьшил mAP на Pascal VOC2007 (c 69.5% до 69.2%), зато значительно повысил recall модели (с 81% до 88%). Это важно отметить, ведь у YOLOv1 как раз были проблемы с recall.
Изменения в обучении
Так как мы перешли к парадигме работы с анкерами, у нас появляется новый этап, который называется label and anchor assignment. На этом этапе необходимо определить 2 вещи:
- Какая ячейка будет отвечать за конкретный объект на картинке? Проще говоря, у какой ячейки конфиденс будет равен 1.
- Какой из предсказанных ббоксов будет отвечать за “предсказание” и учитываться в лоссе?
Предлагаем вам подумать пару минут самостоятельно и только потом читать ответ
- За объект будет отвечать ячейка, расположенная в его центре.
- Ббокс с самым большим IOU с таргетом. Такой же способ выбора использовался в YOLOv1.
Следующее изменение стало возможно благодаря тому что YOLOv2 — полносверточная модель, которая не зависит от размера входных изображений. Поэтому авторы решили повысить ее устойчивость и итоговую точность за счет обучения на картинках разного размера. С этой целью каждые 10 итераций случайным образом выбирался новый размер картинок от 320х320 до 608х608 с шагом 32. Число 32 было выбрано не случайно: в 32 раза уменьшается пространственная размерность после прохождения сети (а из описания выше мы уже знаем изначальный размер картинок — 416х416, а размер выходного тензора — 13х13, следовательно, 416 / 13 = 32).
YOLO9000, или как решать две задачи одновременно
Окей, а теперь настало время повернуться к слону в комнате, к названию архитектуры. Вы же помните, что YOLOv2 называется YOLO9000? Так как же авторы обучили сеть детектировать 9000 классов?
Для начала разберемся с тем, откуда взялись эти 9000 классов. На самом деле это просто 9000 самых встречаемых классов в полной версии ImageNet (в нем всего 22000 классов) + набор классов из COCO.
Просто взять и объединить классы этих датасетов не получится: классы ImageNet намного подробней классов COCO. Все собаки в COCO будут иметь класс “dog”, а в ImageNet для каждой собаки будет указана порода типа “Norfolk terrier” или “Yorkshire terrier”.
Для объединения датасетов авторы построили дерево на основе отношений классов из языковой базы данных WordNet (из нее брались лейблы для ImageNet). Это дерево называется WordTree. Оно показывает иерархические отношения классов.
Получается, при обучении модели стало возможным понимание правильности предсказания сетью класса объекта на картинке как из COCO, так и из ImageNet.
Обучение
Для обучения модели на датасете с таким большим набором классов авторы уменьшили количество анкеров до 3-х, чтобы сократить пространственную размерность выходного тензора. Они объединили датасеты, а для нивелирования разницы в объеме выборок (ImageNet сильно больше COCO) авторы семплили картинки из COCO в 4 раза чаще.
Еще они по-разному считали лосс для картинок из разных датасетов. Если картинка была из COCO, то авторы учитывали полный лосс модели: и лосс детекции (положения ббокса) и лосс классификации. А для картинок из ImageNet брали за основу ббокс с самым большим конфиденсом, в лоссе учитывалась только информация из этого ббокса — предсказанный класс (в классификационной части лосса) + положение ббокса (в детекционной). Предсказанный ббокс учитывался в предположении, что его пересечение с истинным ббоксом не меньше 0.3 IOU.
Инференс
Так как в объединенном датасете присутствуют лейблы разных уровней из WordTree, нужно уметь предсказывать классы не только листьев дерева, но и узлов. Вместо применения одного софтмакса ко всему выходному вектору и выбора максимального значения авторы решили группировать классы по уровням и брать софтмакс от групп лейблов. И затем идти от верхнего узла дерева до тех пор, пока значение максимальной вероятности на заданном уровне будет больше трешхолда, обычно равного 0.5.
Итоги
- Авторы смогли скомбинировать анкерный метод из Faster R-CNN с YOLOv1, приправить все это дело новыми идеями и получить в итоге самый быстрый и один из самых точных детекторов!
- Более того, авторы разработали метод обучения детекционной модели распознаванию огромного количества классов и доказали на практике его работоспособность.
- В результате модель смогла показать mAP в 78.4% (против 63.4% у YOLOv1) на датасете PASCAL VOC2007 со скоростью 40 FPS.
- Авторам удалось добиться mAP в 73.4% на PASCAL VOC2007, обогнав все топовые архитектуры того времени. Но на COCO YOLOv2 уступила SSD512 и SSD300, показав mAP 21.6% против 26.8% и 23.2% соответственно.
Забавный факт: авторы заметили, что модель значительно лучше определяет животных в сравнении с элементами одежды, поэтому вы почти всегда на примерах увидите именно их. А все потому, что в COCO есть классы для разных животных, но нет для одежды (там только класс “person”, то есть человек). Модели было очень сложно догадаться о том, что именно от нее хотят.
Заключение
С выпуском YOLOv2 авторы закрепили успехи старшего брата по скорости и значительно подтянули качество детекции. Проанализировав ошибки первой части и вдохновившись подходами предшественников, они смогли уверенно занять SOTA на обоих датасетах VOC.
В следующих частях мы узнаем, чем завершилась трилогия статей от создателей YOLO и как развивалась история легендарной архитектуры. Оставайтесь с нами, будет интересно 🙂
Ссылки
Статьи:
- https://arxiv.org/abs/1506.02640 — YOLOv1;
- https://deepschool-pro.notion.site/YOLO-history-Part-1-ab32eb38799949c2ab4765ecc379b93a — наш обзор на YOLOv1;
- https://arxiv.org/abs/1612.08242 — YOLOv2.
Датасеты:
- http://host.robots.ox.ac.uk/pascal/VOC/voc2007/ — VOC 2007;
- http://host.robots.ox.ac.uk/pascal/VOC/voc2012/ — VOC 2012;
- https://cocodataset.org/#home — COCO.
Полезные ссылки:
- https://en.wikipedia.org/wiki/Jaccard_index — описание IOU;
- https://ml.i-neti.ru/map-mean-average-precision/ — описание mAP.