1 of 97

Сomputer Vision

28/01/2025

Детекция

2 of 97

О Себе

2

Преподаватель: Александр Неварко

Альма-Матер: Физтех & Сколтех�Работал: Самолет, Aurorai

Сейчас: Авито x НКБ Технологии

Про НКБ Технологии:

3 of 97

3

План на сегодня

1. Локализация объектов

2. Постановка задачи детекции

3. Двухстадийный подход

4. Одностадийный подход

5. Как подходить к решению задачи?

4 of 97

4

План на сегодня

1. Локализация объектов

2. Постановка задачи детекции

3. Двухстадийный подход

4. Одностадийный подход

5. Как подходить к решению задачи?

5 of 97

Classification

CAT

Classification +

Localization

CAT

Object �Detection

CAT, DOG, DUCK

Instance �Segmentation

CAT, DOG, DUCK

6 of 97

7 of 97

8 of 97

Instance segmentation=detection++

3D detection

9 of 97

Key point detection

10 of 97

10

Как развивается область

11 of 97

11

Как развивается область

❤️

❤️

❤️

❤️

❤️

❤️

❤️

❤️

❤️

🩵

🩵

🩵

🩵

🩵

🩵

12 of 97

Какие датасеты используются

ImageNet1k, 2012

1000 classes

train: 1,281,167

val: 50,000

test: 100,000

PASCAL VOC, 2012

20 classes

train&val: 11,540

test: 10,991

13 of 97

Какие датасеты используются

14 of 97

14

Как развивается область

15 of 97

15

План на сегодня

1. Локализация объектов

2. Постановка задачи детекции

3. Двухстадийный подход

4. Одностадийный подход

5. Как подходить к решению задачи?

16 of 97

16

Как оценивают качество одной детекции: IoU

17 of 97

17

Как оценивают качество одной детекции: IoU

TP – bbox, для которого IoU(bbox, gt) > th

FP – bbox, для которого IoU(bbox, gt) < th

FN – gt, для которого не нашлось bbox c IoU(bbox, gt) > th

18 of 97

18

Как оценивают качество всех детекций: mAP

Мы оцениваем два пункта:

  1. правильно ли мы предсказали класс бокса
  2. как хорошо бокс локализовали

�Стандартная метрика - mean Average Precision или mAP. Mean работает в задаче многоклассовой детекции - усредняя AP всех классов, таким образом делая их равноправными вне зависимости от размера.

Как считаем AP для одного класса?

�Процедура такая:

  1. Сортируем по score все наши bbox-ы
  2. Берем детекцию с самым большим скором, пробуем матчить её с gt-боксами по IoU с ними
  3. Если IoU(det, gt) > th, то эту детекцию записываем в TP, а gt помечаем как занятой и больше его в матчинге не используем (если IoU с несколькими gt > th, то занимаем тот gt с которым IoU наибольший)
  4. Так же проверяем все остальные детекции по убыванию score-а - они пытаются матчиться со свободными gt, если не получится, то пишутся в FP
  5. Таким образом про все детекции мы поняли норм они (TP) или нет (FP), а также у нас могли остаться невостребованные gt – они стали FN
  6. Теперь по нашему отранжированному списку bbox (и TP, и FP) для каждого ранга считаем Precision/Recall.

19 of 97

19

Как оценивают качество всех детекций: mAP

Пусть у нас было 5 gt и 10 bbox

20 of 97

Как оценивают качество всех детекций: mAP

Average Precision - это площадь под такой интерполированной кривой. Лежит она в диапазоне [0, 1], как и сами Precision/Recall.

21 of 97

Как оценивают качество всех детекций: mAP

22 of 97

22

Как оценивают качество: mAP

23 of 97

23

Как оценивают качество: COCO

24 of 97

24

План на сегодня

1. Локализация объектов

2. Постановка задачи детекции

3. Двухстадийный подход

4. Одностадийный подход

5. Как подходить к решению задачи?

25 of 97

25

HOG

26 of 97

26

План на сегодня

1. Локализация объектов

2. Постановка задачи детекции

3. Двухстадийный подход

4. Одностадийный подход

5. Как подходить к решению задачи?

27 of 97

27

R-CNN

Идеи:

1. Как-то нагенерим регионы (штук 2000, разных размеров и форм) где МОГУТ быть объекты (их зовем regions of interest),

2. Ресайзнем и подадим КАЖДЫЙ в CNN (AlexNet например) для получения дескриптора этого региона (4096 фич),

3. Для всех векторов-дескрипторов применим binary SVM для классификации, для каждого класса свой

4. Для боксов используем регрессию, чтобы уточнить локализацию positive examples - тех, что приматчились по IoU > 0.3 к gt боксам (тут также используются векторы-дескрипторы)

5. Отфильтруем слишком пересекающиеся боксы вокруг одного и того же объекта (NMS)

28 of 97

28

R-CNN: Selective Search

29 of 97

29

R-CNN: NMS

30 of 97

30

R-CNN: NMS

Hard-NMS

1. берем детекцию с наибольшим скором - best и сразу кладем в финальный список (она там первая)

2. считаем IoU best со всеми остальными детекциями которые пока в списке претендентов. Если для какой то детекции P IoU best_P > threshold, то выкидываем P насовсем. Так жестоко поступаем со всеми детекциями!

3. если в первоначальном листе что то осталось, снова берем самую крутую best детекцию (с наибольшим скором) и кладем в финальный список

4. теперь её сравниваем с бывшими подружками из списка претендентов (считаем IoU со всеми и выкидываем тех что выше порога)

5. повторяем пока список претендентов не будет пуст

�Понятно что у неё есть недостаток - если объекты различны, но слишком близки не получится подобрать оптимально threshold на IoU, чтобы не оставлять и не выкидывать лишнее.

Есть вариант использовать soft-NMS, когда мы не выкидываем сильно сматченные детекции, а понижаем у сматченного с меньшим score этот score пропорционально IoU, то есть они понижают позицию в списке претендентов.

31 of 97

31

R-CNN: summary

- SOTA, и с отрывом

- у системы много компонент - и CNN учи, и кучу SVM учи, и регрессию учи - очень долго учиться

- на инференсе не лучше - selective search медленный! для каждого из 2000 регионов запускать CNN и проделывать все трюки медленно!

- в оригинальной статье приводятся замеры - 10 to 45 seconds per image on a GPU (!!!) в зависимости от сложности CNN для дескрипторов

32 of 97

32

Fast R-CNN

Идеи:

1. избавимся от кучи отдельных компонент (CNN/SVM/Regression), пусть обе задачи делает сетка с несколькими выходами! а учить мы её сможем end2end (loss состоит их 2х частей)

2. не будем запускать на регионах сеть 2000 раз (!!!!) а будем подавать на вход мощной сетки (VGG16) изображение целиком 1 раз, получать feature map, как-то проецировать на неё первоначальные регионы и получать признаковые представления для каждого RoI сразу.

33 of 97

33

Fast R-CNN

34 of 97

34

Fast R-CNN: RoI projection

Для VGG16 нам надо бы все размеры RoI уменьшить в 32 раза и уложить на новую сетку.

�Скорее всего спроецированный RoI не будет ложиться идеально по нашим блокам feature map. Ну ничего, округлим до меньшего.

35 of 97

35

Fast R-CNN: RoI pooling

Мы спроецировали регионы в признаковое пространство, но они разного размера, а дескрипторы для них надо получить одинаковые (у нас дальше fc слои, они по-другому не умеют), поэтому используется RoI pooling.

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

36 of 97

36

Fast R-CNN: summary

- снова SOTA

- осталось 2 компонента: Selective Search и Fast RCNN

- пропускаем через CNN-сеть изображение целиком 1 раз, а RoI проецируются на полученную feature map

- признаки из разных регионов приводятся в одну размерность с помощью помощью RolPooling

- поэтому обучение быстрее в 9.8 раз, в инференс в 213 раз на одной из модификаций

37 of 97

Faster R-CNN

Идеи:

- Selective Search всё ещё отстой, давайте и его заменим сеткой (RPN - Region Proposal Net)

- А всё остальное норм - Fast R-CNN, которая использует картинку и RoI и работает как классификатор и регрессор, оставляем

38 of 97

Faster R-CNN: RPN

Что происходит в RPN?

1. Взяли картинку и прогнали через свертки - получили feature maps

2. На этих feature maps и будем учиться искать RoI! А когда получим боксы, будем их же использовать в сетке классификаторе-регрессоре.

3. Выберем k якорей - базовые формы bbox-ов, которые будем искать и дальше уточнять регрессором

4. Для каждой точки на feature map фиксируем k заготовок для будущих боксов - якорей (в статье их 9) с центром в ней (для feature map H*W*C получим H*W*k якорей, по краям feature map они просто обрезаются), для каждого их них далее будем получать вероятности содержания объектов и уточнения расположения с помощью регрессии

5. Пробегаем сверткой по feature map и получаем новое представление, а затем на верх навешиваем fc слои для классификации и регрессии (здесь каждый нейрон в fc слоях отвечает за какой-то свой заранее установленный якорь)

6. Берем 6k лучших заготовок (где вероятнее всего объекты), делаем отсев по NMS

7. Выжившие регрессированные боксы отправляем дальше - на RoI Pooling по feature maps c 1 шага, а также на финальную классификацию и регрессию. Делаем внутри классов ещё отсев по NMS

39 of 97

Faster R-CNN: RPN

40 of 97

Faster R-CNN: summary

- ого, у нас снова SOTA

- при этом весь подход свёрточный

- по скорости достигли 5 fps, а в самой легкой модификации 17 fps

- обучается два отдельных модуля: сперва RPN, потом Fast R-CNN, снова RPN на основе обновленных feature maps, и опять Fast R-CNN, что сложно и неприятно

- сеть довольно быстрая и точная, сильный бейзлайн надолго

41 of 97

41

План на сегодня

1. Локализация объектов

2. Постановка задачи детекции

3. Двухстадийный подход

4. Одностадийный подход

5. Как подходить к решению задачи?

42 of 97

Мотивация

  • Задачи в реальном времени
  • Масштабирование на большое количество камер
  • Запуск на низкопроизводительных устройствах (телефоны, одноплатники)
  • End-to-end обучение

42

43 of 97

Сравнение скорости работы

43

Модель

Pascal 2007 mAP

Скорость

Расстояние (скорость машины - 60 км/ч)

DPM v5 (2-stage)

33.7

.07 FPS

14 s/img

233 м

R-CNN (2-stage)

66.0

.05 FPS

20 s/img

333 м

Fast R-CNN (2-stage)

70.0

.5 FPS

2 s/img

33 м

Faster R-CNN (2-stage)

73.2

7 FPS

140 ms/img

2.3 м

YOLO (1-stage)

63.4

45 FPS

22 ms/img

36 см

44 of 97

44

YOLO v1

45 of 97

Подход: на примере

Модель, обученная на большом датасете, например ImageNet (>14 млн. картинок)

Картинки отсюда: https://www.jeremyjordan.me/object-detection-one-stage/

45

46 of 97

Подход: на примере

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

46

47 of 97

Подход: на примере

Каждый пиксель карты активаций может быть сопоставлен с областью исходной картинки (в данном примере - это ячейка сетки 7х7).

47

48 of 97

Подход: на примере

Исходя из разметки, назначим ячейку, в которой находится центр бокса “ответственно” за данный объект.

48

49 of 97

Подход: на примере

Добавим свёрточный слой, который будет предсказывать наличие объекта в ячейке исходя из всех 512 соответствующих слоёв активаций

49

50 of 97

Подход: на примере

Чтобы детектировать несколько объектов на картинке, определим:

  • Вероятность нахождения объекта в ячейке: p_obj
  • Вероятность принадлежности объекта классу (при условии наличия объекта) : c_1, c_2, c_3, … c_n
  • Параметры бокса - положение центра, ширина и высота: t_x, t_y, t_w, t_h
  • Также учтём, что в одной и той же ячейке могут быть центры нескольких объектов

Таким образом, один бокс описывается вектором длины 5 + С (кол-во классов):

50

51 of 97

Подход: на примере

Итоговый выходной тензор имеет размерность: NxNxB(C+5), где

  • N - размерность сетки, на примере = 7
  • C - количество классов, на примере = 4
  • B - максимальное количество объектов с центром в одной ячейке, на примере = 2

51

52 of 97

Отбор предсказаний

На выходе мы получили предсказания для фиксированного количества боксов (N * N * B). Что делать, если на картинке меньше объектов?

  1. Фильтруем пустые ячейки по величине p_obj
  2. Что делать с несколькими кандидатами для одного объекта? p_obj у них будет выше порогового значения -> NMS

52

53 of 97

Обучение

Имея разметку, сформируем её в виде, похожем на вид тензора, описывающего наши боксы:

53

54 of 97

Обучение

Выделим ячейку, ответственную за конкретный бокс

54

55 of 97

Обучение

Присвоим этой ячейке вероятность соответствующего класса равной 1

55

56 of 97

Обучение

Выберем предсказания модели, соответствующие этой клетке

56

57 of 97

Обучение

Посчитаем IoU предсказаний с GT (ground-truth)

57

58 of 97

Обучение

Сопоставим бокс с наивысшим IoU

58

59 of 97

Обучение

С помощью функции потерь, будем повышать p_obj у наиболее близкого предсказания, а также регрессируем параметры бокса (t_x, t_y, t_w, t_h)

59

60 of 97

Обучение

Будем понижать p_obj у неправильного бокса, не накладывая функцию ошибки на параметры бокса.

60

61 of 97

Обучение

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

61

62 of 97

Обучение

  • Предобучение backbone на ImageNet
  • Аугментации данных
  • SGD со затухающим learning rate
  • Подробности в оригинальной статье и лонгридах.

62

63 of 97

63

YOLO v1

64 of 97

64

YOLO v1

65 of 97

65

YOLO v1: summary

- первый one-stage детектор, wow

- в каждой ячейке feature map центры максимум 2х классов

- поэтому всего можем найти max 98 объектов

- поэтому проблема с детекцией маленьких объектов и толпы

- квадратичная ошибка для всего (для координат и скоров!)

- быстрая 45 fps, Fast YOLO – 155 fps, хотя качество и хуже SOTA

66 of 97

66

SSD

67 of 97

67

SSD

68 of 97

68

SSD

69 of 97

69

SSD

70 of 97

70

SSD: summary

- очень быстро ~YOLO

- с крутым качеством >Faster R-CNN, >>YOLO

- детектирование на разных масштабах

- большое число anchor boxes на разных масштабах

- поэтому можем находить тысячи объектов

71 of 97

71

YOLO vs SSD

72 of 97

72

YOLO evolution

История развития YOLO моделей. The Ultimate Guide to YOLO (You Only Look Once) (opencv.ai) / YOLO comparison

73 of 97

73

FPN

74 of 97

74

FPN

75 of 97

75

Retina-Net

ssd-like detector + FPN + focal-loss

76 of 97

Focal Loss

  • Хорош при дисбалансе классов

76

77 of 97

77

План на сегодня

1. Локализация объектов

2. Постановка задачи детекции

3. Двухстадийный подход

4. Одностадийный подход

5. Как подходить к решению задачи?

78 of 97

78

Где брать и как выбирать детекторы

accuracy

speed

Портирование для инференса

Легко на любые платформы

Легко на NVIDIA/Intel

Сложно

SSD-like

YOLOv5, YOLOX

Segmentation-based

YOLOv8

MMDet nets

PaddlePaddle nets

DETR

SWIN

DINOv2

79 of 97

79

Где брать и как выбирать детекторы

User-friendly: 10/10

80 of 97

80

Где брать и как выбирать детекторы

User-friendly: 7/10

Open licence

  1. YoloX
  2. Yolo v7
  3. Damo Yolo
  4. Ultralytics forks

81 of 97

Где брать и как выбирать детекторы

User-friendly: 3/10

82 of 97

82

Где брать данные?

User-friendly: 7/10

  1. Специфичные датасеты из поисковика (CrowdHuman, VisDrone, DOTA, etc.)
  2. Roboflow universe - много шумных перезалитых данных, нужны быть аккуратным
  3. Baidu и прочие китайские ресурсы - могут быть проблемы с доступом

83 of 97

83

Где размечать?

User-friendly: 7/10

  • CVAT - opensource, один из стандартов с прицелом под картинки и видео
  • LabelStudio - активно поддерживается, позволяет размечать не только картинки, но и тексты
  • Roboflow universe - облачный сервис, выставляет данные в публичный доступ

84 of 97

84

Closing words

  • Как правило, при работе с детекторами у нас есть куча инженерной работы, и репозитории для них очень тяжеловесные
  • У нас есть two-stage и one-stage детекторы, первые скорее всего вы никогда использовать не будете
  • Но Faster R-CNN всё ещё довольно сильный бейзлайн по точности
  • При работе с детекторами у нас ещё больше чем раньше параметров для настройки – и в метрике, и в NMS, везде сплошные гиперпараметры
  • Детекторы как правило имеют пирамидальную структуру и используют признаки с разных уровней для предсказаний
  • Плюс эти признаки обычно ещё переагрегируются в FPN-like манере
  • Якоря – в целом стандарт для начального приближения боксов в детекторах, и их конфигурацию хорошо подбирать под вашу задачу
  • Последние годы при этом появляются в основном безъякорные методы (потому что якоря – боль)
  • Если вам надо быстренько завести детектор, то берите YOLOv5 и не парьтесь, всё будет красиво и быстро, но получите не лучшие возможные результаты

85 of 97

85

Что ещё

  1. Семинар
  2. Выступление автора оригинальной Yolo
  3. Изучить DETR и семейство трансформерных подходов
  4. Посмотреть на Mask-RCNN, yolo-segm, yolo-pose из ultralytics

86 of 97

86

Mask R-CNN

87 of 97

87

Mask R-CNN

88 of 97

88

Mask R-CNN: RoI Align

В RoI pooling при некратных размерах RoI, мы теряли данные, а далее резали как придется, что было приемлемо для bbox-ов (ну скривим бокс немного, не очень страшно), но стало причиной проблем, когда авторы начали делать попиксельную сегментацию.

Что делаем?

Не будем отрезать края, если RoI ложится не точно по блокам feature map, не будем внутри получившейся зоны резать на кривые области. Накинем на зону ровную сетку, внутри блока сетки берем 4 точки (ровно делят бокс на ещё на одну сетку 3*3), для каждой из них используя билинейную интерполяцию считаем значение на основании ближайших к ней клеток feature map. Далее из этих 4 значений выбираем максимальное - фактически делаем MaxPooling и получаем элемент финальной сетки. Все то же самое делаем для каждого канала, ведь Pooling не снижает их размерность.

89 of 97

89

Mask R-CNN: RoI Align

90 of 97

90

Mask R-CNN: summary

- вот и всё, наслаждаемся инстанс сегментацией

- ещё и точность детектирования авторы подняли за счет трех пунктов: RoI Align, MultiTask Learning, ResNeXt в бэкбоне

91 of 97

91

Mask R-CNN

92 of 97

92

CenterNet

93 of 97

93

CenterNet

94 of 97

94

CenterNet

95 of 97

95

CenterNet

96 of 97

96

CenterNet

97 of 97

97

CenterNet: summary

- больше никаких якорей, юху

- больше никакого NMS (только MaxPool по feature map для точек), юху

- сравнимо по качеству со всеобщими любимчиками

- из этой идеи выросли ещё прикольные архитектуры типа FCOS, 2019