Сomputer Vision
28/01/2025
Детекция
О Себе
2
Преподаватель: Александр Неварко
Альма-Матер: Физтех & Сколтех�Работал: Самолет, Aurorai
Сейчас: Авито x НКБ Технологии
Про НКБ Технологии:
3
План на сегодня
1. Локализация объектов
2. Постановка задачи детекции
3. Двухстадийный подход
4. Одностадийный подход
5. Как подходить к решению задачи?
4
План на сегодня
1. Локализация объектов
2. Постановка задачи детекции
3. Двухстадийный подход
4. Одностадийный подход
5. Как подходить к решению задачи?
Classification
CAT
Classification +
Localization
CAT
Object �Detection
CAT, DOG, DUCK
Instance �Segmentation
CAT, DOG, DUCK
Instance segmentation=detection++
3D detection
Key point detection
10
Как развивается область
11
Как развивается область
❤️
❤️
❤️
❤️
❤️
❤️
❤️
❤️
❤️
🩵
🩵
🩵
🩵
🩵
🩵
Какие датасеты используются
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
Какие датасеты используются
14
Как развивается область
15
План на сегодня
1. Локализация объектов
2. Постановка задачи детекции
3. Двухстадийный подход
4. Одностадийный подход
5. Как подходить к решению задачи?
16
Как оценивают качество одной детекции: IoU
17
Как оценивают качество одной детекции: IoU
TP – bbox, для которого IoU(bbox, gt) > th
FP – bbox, для которого IoU(bbox, gt) < th
FN – gt, для которого не нашлось bbox c IoU(bbox, gt) > th
18
Как оценивают качество всех детекций: mAP
Мы оцениваем два пункта:
�Стандартная метрика - mean Average Precision или mAP. Mean работает в задаче многоклассовой детекции - усредняя AP всех классов, таким образом делая их равноправными вне зависимости от размера.
�Как считаем AP для одного класса?
�Процедура такая:
�
19
Как оценивают качество всех детекций: mAP
Пусть у нас было 5 gt и 10 bbox
Как оценивают качество всех детекций: mAP
Average Precision - это площадь под такой интерполированной кривой. Лежит она в диапазоне [0, 1], как и сами Precision/Recall.
Как оценивают качество всех детекций: mAP
22
Как оценивают качество: mAP
23
Как оценивают качество: COCO
24
План на сегодня
1. Локализация объектов
2. Постановка задачи детекции
3. Двухстадийный подход
4. Одностадийный подход
5. Как подходить к решению задачи?
26
План на сегодня
1. Локализация объектов
2. Постановка задачи детекции
3. Двухстадийный подход
4. Одностадийный подход
5. Как подходить к решению задачи?
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
R-CNN: Selective Search
29
R-CNN: NMS
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
R-CNN: summary
- SOTA, и с отрывом
- у системы много компонент - и CNN учи, и кучу SVM учи, и регрессию учи - очень долго учиться
- на инференсе не лучше - selective search медленный! для каждого из 2000 регионов запускать CNN и проделывать все трюки медленно!
- в оригинальной статье приводятся замеры - 10 to 45 seconds per image on a GPU (!!!) в зависимости от сложности CNN для дескрипторов
32
Fast R-CNN
Идеи:
1. избавимся от кучи отдельных компонент (CNN/SVM/Regression), пусть обе задачи делает сетка с несколькими выходами! а учить мы её сможем end2end (loss состоит их 2х частей)
2. не будем запускать на регионах сеть 2000 раз (!!!!) а будем подавать на вход мощной сетки (VGG16) изображение целиком 1 раз, получать feature map, как-то проецировать на неё первоначальные регионы и получать признаковые представления для каждого RoI сразу.
33
Fast R-CNN
34
Fast R-CNN: RoI projection
Для VGG16 нам надо бы все размеры RoI уменьшить в 32 раза и уложить на новую сетку.
�Скорее всего спроецированный RoI не будет ложиться идеально по нашим блокам feature map. Ну ничего, округлим до меньшего.
35
Fast R-CNN: RoI pooling
Мы спроецировали регионы в признаковое пространство, но они разного размера, а дескрипторы для них надо получить одинаковые (у нас дальше fc слои, они по-другому не умеют), поэтому используется RoI pooling.
�Пусть нам надо для региона на выходе получить выход размера 2*2, так мы берем да делим наш регион на 2 секции по вертикали и на 2 по горизонтали. В полученных областях делаем привычный выбор максимума - и готово.
36
Fast R-CNN: summary
- снова SOTA
- осталось 2 компонента: Selective Search и Fast RCNN
- пропускаем через CNN-сеть изображение целиком 1 раз, а RoI проецируются на полученную feature map
- признаки из разных регионов приводятся в одну размерность с помощью помощью RolPooling
- поэтому обучение быстрее в 9.8 раз, в инференс в 213 раз на одной из модификаций
Faster R-CNN
Идеи:
- Selective Search всё ещё отстой, давайте и его заменим сеткой (RPN - Region Proposal Net)
- А всё остальное норм - Fast R-CNN, которая использует картинку и RoI и работает как классификатор и регрессор, оставляем
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
Faster R-CNN: RPN
Faster R-CNN: summary
- ого, у нас снова SOTA
- при этом весь подход свёрточный
- по скорости достигли 5 fps, а в самой легкой модификации 17 fps
- обучается два отдельных модуля: сперва RPN, потом Fast R-CNN, снова RPN на основе обновленных feature maps, и опять Fast R-CNN, что сложно и неприятно
- сеть довольно быстрая и точная, сильный бейзлайн надолго
41
План на сегодня
1. Локализация объектов
2. Постановка задачи детекции
3. Двухстадийный подход
4. Одностадийный подход
5. Как подходить к решению задачи?
Мотивация
42
Сравнение скорости работы
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
YOLO v1
Подход: на примере
Модель, обученная на большом датасете, например ImageNet (>14 млн. картинок)
Картинки отсюда: https://www.jeremyjordan.me/object-detection-one-stage/
45
Подход: на примере
Отрежем классификационные слои. Выходной тензор содержит карту активаций значимых признаков оригинального изображения.
46
Подход: на примере
Каждый пиксель карты активаций может быть сопоставлен с областью исходной картинки (в данном примере - это ячейка сетки 7х7).
47
Подход: на примере
Исходя из разметки, назначим ячейку, в которой находится центр бокса “ответственно” за данный объект.
48
Подход: на примере
Добавим свёрточный слой, который будет предсказывать наличие объекта в ячейке исходя из всех 512 соответствующих слоёв активаций
49
Подход: на примере
Чтобы детектировать несколько объектов на картинке, определим:
Таким образом, один бокс описывается вектором длины 5 + С (кол-во классов):
50
Подход: на примере
Итоговый выходной тензор имеет размерность: NxNxB(C+5), где
51
Отбор предсказаний
На выходе мы получили предсказания для фиксированного количества боксов (N * N * B). Что делать, если на картинке меньше объектов?
52
Обучение
Имея разметку, сформируем её в виде, похожем на вид тензора, описывающего наши боксы:
53
Обучение
Выделим ячейку, ответственную за конкретный бокс
54
Обучение
Присвоим этой ячейке вероятность соответствующего класса равной 1
55
Обучение
Выберем предсказания модели, соответствующие этой клетке
56
Обучение
Посчитаем IoU предсказаний с GT (ground-truth)
57
Обучение
Сопоставим бокс с наивысшим IoU
58
Обучение
С помощью функции потерь, будем повышать p_obj у наиболее близкого предсказания, а также регрессируем параметры бокса (t_x, t_y, t_w, t_h)
59
Обучение
Будем понижать p_obj у неправильного бокса, не накладывая функцию ошибки на параметры бокса.
60
Обучение
Для предсказаний в ячейках без бокса в разметке просто будем понижать p_obj, не накладывая лосс на вероятности классов и параметризацию боксов
61
Обучение
62
63
YOLO v1
64
YOLO v1
65
YOLO v1: summary
- первый one-stage детектор, wow
- в каждой ячейке feature map центры максимум 2х классов
- поэтому всего можем найти max 98 объектов
- поэтому проблема с детекцией маленьких объектов и толпы
- квадратичная ошибка для всего (для координат и скоров!)
- быстрая 45 fps, Fast YOLO – 155 fps, хотя качество и хуже SOTA
66
SSD
67
SSD
68
SSD
69
SSD
70
SSD: summary
SSD: Single Shot MultiBox Detector, 2016
SSD object detection: Single Shot MultiBox Detector for real-time processing
- очень быстро ~YOLO
- с крутым качеством >Faster R-CNN, >>YOLO
- детектирование на разных масштабах
- большое число anchor boxes на разных масштабах
- поэтому можем находить тысячи объектов
71
YOLO vs SSD
72
YOLO evolution
История развития YOLO моделей. The Ultimate Guide to YOLO (You Only Look Once) (opencv.ai) / YOLO comparison
73
FPN
74
FPN
75
Retina-Net
ssd-like detector + FPN + focal-loss
Focal Loss
76
77
План на сегодня
1. Локализация объектов
2. Постановка задачи детекции
3. Двухстадийный подход
4. Одностадийный подход
5. Как подходить к решению задачи?
78
Где брать и как выбирать детекторы
accuracy
speed
Портирование для инференса
Легко на любые платформы
Легко на NVIDIA/Intel
Сложно
SSD-like
YOLOv5, YOLOX
Segmentation-based
YOLOv8
MMDet nets
PaddlePaddle nets
DETR
SWIN
DINOv2
79
Где брать и как выбирать детекторы
User-friendly: 10/10
80
Где брать и как выбирать детекторы
User-friendly: 7/10
Open licence
Где брать и как выбирать детекторы
User-friendly: 3/10
82
Где брать данные?
User-friendly: 7/10
83
Где размечать?
User-friendly: 7/10
84
Closing words
85
Что ещё
86
Mask R-CNN
87
Mask R-CNN
88
Mask R-CNN: RoI Align
В RoI pooling при некратных размерах RoI, мы теряли данные, а далее резали как придется, что было приемлемо для bbox-ов (ну скривим бокс немного, не очень страшно), но стало причиной проблем, когда авторы начали делать попиксельную сегментацию.
�Что делаем?
Не будем отрезать края, если RoI ложится не точно по блокам feature map, не будем внутри получившейся зоны резать на кривые области. Накинем на зону ровную сетку, внутри блока сетки берем 4 точки (ровно делят бокс на ещё на одну сетку 3*3), для каждой из них используя билинейную интерполяцию считаем значение на основании ближайших к ней клеток feature map. Далее из этих 4 значений выбираем максимальное - фактически делаем MaxPooling и получаем элемент финальной сетки. Все то же самое делаем для каждого канала, ведь Pooling не снижает их размерность.
89
Mask R-CNN: RoI Align
90
Mask R-CNN: summary
- вот и всё, наслаждаемся инстанс сегментацией
- ещё и точность детектирования авторы подняли за счет трех пунктов: RoI Align, MultiTask Learning, ResNeXt в бэкбоне
91
Mask R-CNN
92
CenterNet
93
CenterNet
94
CenterNet
95
CenterNet
96
CenterNet
97
CenterNet: summary
- больше никаких якорей, юху
- больше никакого NMS (только MaxPool по feature map для точек), юху
- сравнимо по качеству со всеобщими любимчиками
- из этой идеи выросли ещё прикольные архитектуры типа FCOS, 2019