Автор: Антон Броиловский

Редактура: Дмитрий Раков

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

Введение

Возвращаемся в 2016 год и вспоминаем о том, что Faster R-CNN — SOTA в задаче детекции на тот момент вышла около года назад. Она показывала хорошее качество, но работала медленно (всего 17 fps у самой быстрой модели). Почему? Использование нескольких последовательных нейросетей и наличие сложного алгоритма обработки ббоксов. Детекцию в 17 fps сложно назвать детекцией в режиме реального времени. С этим нужно было что-то делать. Исследователи из Вашингтонского университета решили создать архитектуру, которая будет быстро и точно решать задачу детекции. И 9-го мая 2016 года они выпустили статью, с которой все началось — You Only Look Once: Unified, Real-Time Object Detection.

Давайте сегодня с вами погрузимся в историю и разберемся со всеми трюками самой первой версии YOLO.

YOLOv1 (You Only Look Once: Unified, Real-Time Object Detection)

Архитектура

Основная цель авторов — сделать быструю модель, которая будет хорошо, но не обязательно лучше всех решать задачу детекции. Для этого они выбрали single shot подход: фактически модель должна решать задачу детекции без стадии предварительного выделения proposals (как было в Faster R-CNN), сразу предсказывать ббоксы и классы.

С этой целью авторы предложили использовать следующую архитектуру:

Рисунок 1. Архитектура YOLO

Рисунок 1. Архитектура YOLO

В ее основе лежит GoogLeNet с небольшими изменениями: модель состоит из 24-х коволюционных и 2-х полносвязных слоев. Архитектуру можно разделить на 2 части:

  1. Классификационная часть представляет собой ****первые 20 сверточных слоев, предобученных на ImageNet 1000-class . На самом деле вместо GoogLeNet могла быть любая другая предобученная архитектура (в статье авторы экспериментируют и с VGG).
  2. Детекционная часть объединяет последние слои сети (4 конволюционных и 2 полносвязных). Эту часть мы будем называть детекционной головой (голова — сленговое название для последних слоев сети). Выходной тензор модели (или feature map) имеет размер 7х7х30. Давайте разбираться почему.

Каждую фичу из выходного тензора можно спроецировать на входное изображение. Такая проекция в литературе называется receptive field. Она показывает область картинки, за которую отвечает конкретный вектор фичей выходного слоя. Давайте мысленно поделим входное изображение на сетку размером 7х7. Тогда каждая ячейка будет размером 64х64. Для каждой такой ячейки YOLOv1 предсказывает целый вектор фичей, внутри которого скрывается описание 2х ббоксов и набор вероятностей. Последний отвечает за класс объекта внутри ббокса. Теперь представим это все схематично:

Рисунок 2. Визуализация размера картинки, за которую “отвечает” один вектор фичей выходного тензора

Рисунок 2. Визуализация размера картинки, за которую “отвечает” один вектор фичей выходного тензора

Важное дополнение: ббоксов было больше одного. Авторы предположили, что использование нескольких ббоксов позволит легче отлавливать объекты разных размеров.

В итоге для каждой ячейки сетки модель предсказывает вектор из 30 фичей:

  1. Первые 10 из них отвечают за положение двух ббоксов:
    1. x, y — координаты центра ббокса внутри ячейки относительно ее границ;
    2. w, h — ширина и высота ббокса, отнормированные по размеру картинки;
    3. c — confidence score, или уверенность модели в наличии центра объекта в этой ячейке или же IOU между предсказанными ббоксом и разметкой.
  2. Остальные 20 содержат вероятности классов объектов внутри ячейки. Почему 20? Это количество классов в датасете Pascal VOC2007.