Written by 11:33 am Deep Learning

Wykrywanie obiektów na obrazie – ML Gdańsk

O wykrywaniu obiektów na obrazie. Metody z 2020 roku, opowiadane w tymże roku, więc tutaj uczulam, że nie wszystkie miałem okazję przetestować osobiście. Niektóre tylko wymienię, że istnieją, bo są ciekawe. Wpis ten powstał na podstawie wystąpienia na 97 ML Gdańsk z 14.12.2020.

Obecnie (2022Q1) warto spojrzeć na YOLOR i Swin Transformer.

Jak rozumiemy wykrywanie obiektów?

Mając taki pojedynczy obraz możemy się zastanawiać, jaką etykietę możemy do niego przypisać, dla całego obrazu. I wtedy to zagadnienie nazywa się klasyfikacją obrazu, rozpoznawaniem obrazu. Tutaj mamy wyniki z Google Cloud’s Vision i widzimy, że dla takiego zdjęcia możemy przypisać jedną z wielu etykiet. Jak na przykład miasto, ulica i urban area. Różne propozycje.

Natomiast pytanie, czy to jest dla nas wystarczająca informacja w takim przypadku? Wydaje się, że potrzebujemy czegoś więcej. Na przykład informacji o tym, jakie obiekty znajdują się na drodze przed pojazdem. Możemy sobie wyobrazić różne zastosowania.

Problem rozwiązuje zagadnienie object detection, wykrywanie obiektów, gdzie odpowiedzią sieci neuronowej jest lista. Lista ramek, czyli informacji o czterech współrzędnych. Czterech współrzędnych, czyli na przykład środek oraz szerokość i wysokość, albo współrzędne dwóch narożników. Oczywiście, oprócz tego piąta informacja, czyli klasa dla każdego obiektu. 

Tu link do mojego kanału na YouTube. Tam jest sporo sieci przetestowanych, więc można zobaczyć jakościowo, jak różnego rodzaju sieci sobie radzą przede wszystkim z jednym filmem. 

youtube.com/karolmajek

Kolejnym zagadnieniem, jeśli chodzi o analizę obrazu, jest segmentacja instancji. Tu mamy troszeczkę lepszą informację, bo oprócz tych ramek uzyskujemy precyzyjne kontury obiektu. Co do tej precyzji to różnie z tym bywa, natomiast jest coraz lepiej w coraz nowszych rozwiązaniach.

Jeżeli potrzebujemy otrzymać etykietę dla każdego piksela obrazu, możemy wykorzystać segmentację semantyczną i wtedy owszem, będziemy mieli każdy piksel z etykietą jako odpowiedź modelu. Natomiast nie będziemy mogli rozróżnić, które obiekty, gdzie się kończą, zatem nie będziemy mogli ich zliczyć. Tutaj na przykład nie wiemy, ile jest pojazdów. Ilu jest ludzi? Moglibyśmy policzyć, bo akurat nie ma tutaj żadnego nakładania się. Zwykle nie możemy, możemy natomiast się dowiedzieć, co jest po prostu widoczne, w którym miejscu. I można by powiedzieć, że ta informacja jest wystarczająca, ale nie zawsze.

Tutaj pojawia się zagadnienie panoptic segmentation wprowadzone w 2018 roku, więc z jednej strony dawno, a z drugiej strony niedawno. To zależy, jak na to patrzymy. To zagadnienie łączy dwa poprzednie. Czyli segmentację semantyczną, tę etykietę per piksel, na przykład dla nieba, dla budynków i tutaj nie rozróżniamy, ile jest tych budynków. Ale jednocześnie mamy informację o samochodach wraz z konturami, więc my wiemy, gdzie są te samochody, wiemy, ile ich jest. Możemy wywnioskować, że jest podział na cztery zagadnienia. I tego się staram trzymać, natomiast wiadomo, mamy jeszcze inne jak choćby klasyfikacja, wykrywanie keypointów, itd.

Możemy estymować położenie punktów charakterystycznych. Na przykład pozę człowieka, w jakim położeniu znajduje się ręka, w jakim położeniu znajdują się inne kończyny. Ale tutaj chcę się skupić przede wszystkim na tych czterech zagadnieniach. 

4 ze sposobów wykrywania obiektów; Oczywiście to nie jest wszystko!

Czas na historię wykrywania obiektów

Jeśli chodzi o metodę wykrywania obiektów oraz ten rok, 2020. Powstała bardzo fajna publikacja, która podsumowuje 20 lat wykrywania obiektów. Od 1998 do 2018. I widać tutaj liczbę publikacji związaną z wykrywaniem obiektów. To stale rośnie, z roku na rok. Ta publikacja to jest Object Detection in 20 Years: A Survey. I to powstało w 2019, więc można powiedzieć, że to już jest nieaktualne.

Bardzo dużo w tym roku powstało rozwiązań i to coraz lepszych. I też zmieniających trochę paradygmat, ale o tym też za chwilę. Jeżeli spojrzymy na oś czasu, jak to wyglądało, to do pewnego momentu mieliśmy rozwiązania nieopierające się na sieciach neuronowych. Tak naprawdę zaczęliśmy stosować uczenie filtrów do nauki wzorców od 2012 roku. Wcześniej algorytmy zakładały wykorzystanie technik hand-crafted, gdzie my definiowaliśmy filtry. Tudzież metod maszyn learningowych. Bardzo fajnie się sprawdzał HOG – Histogram of Oriented Gradients. Też miałem okazję wykorzystywać, ale to tak bardziej właśnie w okolicach, powiedzmy, tego 2012 roku. W 2014 wystąpiły pierwsze prace odnośnie wykorzystywania głębokich sieci do wykrywania obiektów. A w 2016 mieliśmy pierwsze wyniki i tu było rozdwojenie, bo w wykrywaniu obiektów mamy detektory One-stage i Two-stage. I te pierwsze właśnie były Two-stage. W dwóch krokach mieliśmy detekcję, czyli w pierwszym kroku my wykrywaliśmy, gdzie są obiekty, w drugim kroku je klasyfikowaliśmy. Natomiast potem powstały też rozwiązania, które robią wszystko w jednym kroku, przez to są szybsze.

To, czego możemy oczekiwać po metodach Two-stage, że będzie większa dokładność. Znajdziemy mniejsze obiekty i uzyskamy większe precyzje. Więc jeśli chodzi o metody Two-stage, ich nie jest dużo. Więcej niż ja tu wymieniłem. Natomiast one mają to do siebie, w sumie te jednoetapowe też, że my możemy w takich sieciach wymieniać backbone, czyli sieć do ekstrakcji cech z obrazu. Sieć np. konwolucyjną, na której będziemy bazować. Na przykład na początku to były często sieci VGG, ostatnio bardziej ResNety, ale jeszcze bardziej ostatnio to rozwiązania typu ResNest i pochodne. O SSD tylko wspomnę, o YOLO więcej powiem, CornerNet – bardzo ciekawe rozwiązanie.

A jak to się zaczęło? Zaczęliśmy w 2012. To była taka solidna podstawa, bo Selective Search pozwalał znaleźć obiekty, które potem mogliśmy zacząć klasyfikować. Mając już nasze sieci neuronowe do klasyfikacji, które były tak naprawdę już w 2012. Selective Search polegał na grupowaniu pikseli o podobnych właściwościach, o podobnym otoczeniu i w ten sposób powstały takie większe regiony, które można było analizować jako prostokątne ramki.

R-CNN, Fast R-CNN, Faster R-CNN

To właśnie z selective search pojawiały się propozycje bounding boxów, które później trafiały tutaj do R-CNN, pierwszej sieci Region CNN. Otrzymujemy dla obrazu 2000 proposali, ramek zawierających potencjalnie obiekty. Dla każdego z tych proposali zamieniamy taki obszar w kwadrat, wykonujemy predykcję siecią neuronową i klasyfikujemy. To pierwsze rozwiązanie nie było takie super proste do wytrenowania. Tam były klasyfikatory dla każdej z klas. SVM-y per klasę. Dodatkowo stosowano regresję by poprawić wielkość i lokalizację obiektu. Ten trening trwał bardzo długo, nie był pojedynczy trening. Później pojawiła się sieć Fast RCNN, architektura, która założyła, że możemy tak naprawdę odwrócić ten proces. Czyli my nie robimy klasyfikacji 2 000 regionów, które często się pokrywają. Najpierw robimy ekstrakcję cech, a potem wybieramy regiony. Ta zmiana zdecydowanie przyśpieszyła korzystanie z modelu. Tu wciąż jeszcze korzystamy z proposali. Natomiast ostatecznym rozwiązaniem to było Faster RCNN, w którym pozbyliśmy się proposali z zewnątrz i mamy sieć, która generuje proposale. Całość jest już trenowana w jednym procesie uczenia.

W tym czasie, w 2016 roku, powstała również sieć SSD, Single Shot Multibox Detector, która już nie rozdzielała tych dwóch etapów, a wszystko się działo tak naprawdę w jednej detekcji. W SSD zawsze otrzymamy 8 732 predykcje dla każdej z klas. Output był zdefiniowany na stałe. Wynik modelu wymagał postprocessingu. Na początku sieci wydać backbone, VGG-16 oryginalnie. Później było to zamienione na przykład na MobileNety różnego rodzaju 1, 2, 3 w celu poprawy wyników.

YOLO (2016)

Natomiast to, na czym chciałbym się skupić to są sieci YOLO, czyli You Only Look Once. I tutaj od początku, czyli 2016 rok, tam była wersja 1, potem wersja 2, zwana także 9000. Predykcja 9000 kategorii. Po czym w 2018 wersja 3. Tu akurat miałem okazję jechać na zawody samochodów autonomicznych i wtedy na lotnisku testowałem to rozwiązanie, bo wtedy było właśnie wydane. Więc tam po kilku godzinach już miałem okazję przetestować. I wersja 4 to był ten rok – 2020. Kwiecień tego roku. To też jest ciekawe, bo to akurat wyszło w momencie, kiedy robiłem szkolenie z wykrywania obiektów i chciałem pokazać, że najnowsza wersja jest v3. I wtedy wyszło następne, pokazuję i tam była v4. No i v5, która wyszła niecały miesiąc później. Co też było ciekawe, bo miałem wrażenie, że będziemy mieli tak naprawdę taki cykl releasów co miesiąc, albo trzy tygodnie. [Okazało się, że nie; zob. YOLOR, YOLOP, YOLOX, czy YOLOv7] W kolejnych sieciach było sporo zmian, jeśli chodzi o architekturę. Także jeśli chodzi o regresję położenia bounding boxów. W pierwszej sieci, w wersji 1 było sporo błędów z uwagi na błędy lokalizacji tych bounding boxów, bo małe błędy dla dużych boxów były małoznaczne, ale tej samej wielkości błędy dla małych boxów, bardzo wpływały na Intersection over Union i metryki. Nie było to w żaden sposób uwzględnione. Był taki znany problem – z niemieckiego – cecha. Natomiast to już było poprawione w wersji 2 i 3, bo pojawiła się nieliniowa reprezentacja i offsety do predykcji tych bounding boxów. Natomiast w v4 już jest właśnie zaimplementowane, Complete IoU i Distance IoU, do wyboru. Trenując możemy wybrać, który chcemy wykorzystać.

YOLOv3 (2018)

W 2018, wersja 3, którą testowałem na lotnisku nie wyszła, jako artykuł naukowy, lecz jako taki tech report, więc tam jest wiele takich rzeczy niekonwencjonalnych. Choćby wykres. Dorysowane statystyki dla YOLOv3, po lewej stronie poza tym wykresem. Mimo znacznego przyśpieszenia nie traci mocno na tych metrykach średniej precyzji. Tu też jest dyskusja, bo tu jest średnia precyzja ujęta według COCO, to nie jest według Pascala. Ale to jest temat, który pomijam dzisiaj.

Natomiast sam autor YOLO – Joseph Redmon zrezygnował w ogóle z prac badawczych w widzeniu maszynowym z uwagi na etyczne sprawy, bo tego się nie da kontrolować. W sensie wykorzystania później algorytmów. I może niekoniecznie związany z tym jego odejściem przykład, natomiast coś, co w sumie szokuje to to, że w Chinach już w sumie od 2018 roku można było kupić kamery, które mające funkcję wykrywania mniejszości etnicznych. I potem okazuje się, że właśnie rząd Chin takie kamery stosuje, żeby zautomatyzować dyskryminację mniejszości i później ludzie są wysyłani do obozów resocjalizacyjnych. Redmon skończył badania w Computer Vision, bo właśnie nie da się już dłużej ignorować tego wpływu. Spójrzmy tylko na to, że to jest z 20 lutego 2020 informacja. On tak naprawdę w miarę zakończył rozwój na tej wersji 3. Natomiast wersja 4 powstała już bez Josepha, bez oryginalnego autora. Przejął to rozwiązanie, utrzymanie tego Alexey Bochkovskiy. I tu widać w wersji 4 w porównaniu z wersją 3 w międzyczasie, w którym powstał EfficientDet. Ja w ogóle o EfficentDet nie będę tutaj mówił, natomiast można by powiedzieć, że trudno go zignorować, ale ja go tu zignoruję.

YOLOv4 (2020.04)

W YOLOv4, co się zmieniło? Została architektura detektora, czyli YOLOv3. Mamy wciąż rozwiązanie Dense Prediction, czyli One-Stage Detector, jednoetapowe wykrywanie. Wciąż mamy YOLOv3 jako architekturę head. Natomiast zmieniło się backbone, czyli ta sieć do ekstrakcji cech. Teraz jest to CSPDarknet53. I jeśli chodzi o neck to jest wybór, albo SPP, albo PAN. W artykule bardzo fajnie porównano, wpływ różnych technik, na przykład data augmentation, gdzie sprawdzono MixUp, CutMix, czy Mosaic.

MixUp to jest połączenie dwóch zdjęć z przenikaniem i w zależności od tego, jak to przenikanie zrobimy, takich oczekujemy predykcji.

CutMix, mamy po prostu wycięte fragmenty jednego obrazu, wklejone.

Mosaic, czyli łączymy cztery obrazy w jeden.

Ostatecznie CutMix pomagał i Mosaic też.

Label Smoothing, czyli wygładzanie etykiet, czyli tracimy tak naprawdę pewność, zamieniamy te etykiety z wartości One-Hot Encoding, czyli z 1 i reszta 0 na wartości takie, że zamiast 1 będzie 0.9, a reszta tak, żeby się sumowała do 1. To pomaga w przypadku, kiedy mamy błędne etykiety, a zwykle mamy.

YOLOv5 (2020.05)

YOLOv5 zostało udostępnione miesiąc później niż v4. Pierwsze było pytanie: o co chodzi? I okazuje się, że YOLOv5 to jest też YOLOv4, jeśli chodzi o genezę, bo również powstało na podstawie v3. Powstało równolegle przez inny zespół, przez firmę. Oni się nie wyrobili, też chcieli to nazwać YOLOv4, więc nazwali YOLOv5. To wywołało trochę oburzenie community [dość duże]. Natomiast jeśli chodzi o taki approval, taką pieczątkę od oryginalnego autora, Josepha Redmona, dostał Alexey ze swoją wersją v4. Jeśli się przyjrzymy, YOLOv4 w porównaniu do YOLOv5, to okazuje się, że mimo większego obrazu wejściowego YOLOv5 L uzyskuje gorszą średnią precyzję niż v4. YOLOv5 jest też wolniejsze. V3 przy tej samej wielkości wejścia co v5 uzyskuje 45,5% średnią precyzję, to jest więcej. Wielkości wag dla YOLOv4 to 245 MB, czyli pomiędzy YOLOv5 L,a YOLOv5 X.

Co do średniej precyzji to tutaj v4 wygrywa z v5. I jeśli chodzi o czas inferencji, też v4 wygrywa.

Jeśli chodzi o pomiary wydajność, to w v5 zamieszanie, bo było to porównane przy dużym batchu, to już pominę. Podsumowując dużo kontrowersji.

Facebook DETR

Co się stało w międzyczasie? W międzyczasie Facebook opublikował detection transformer, czyli wykorzystanie transformera do wykrywania obiektów, co w ogóle zmienia podejście całkowicie do tego zagadnienia. Bo już nie ma nadmiaru wykryć na koniec, które musimy eliminować za pomocą NMS, czyli Non-Max Suppression, tylko uzyskujemy precyzyjnie tyle etykiet, ile sobie zażyczyliśmy. Tak naprawdę zmienione jest zagadnienie. Czyli my nie wyszukujemy etykiet na obrazie tylko mamy etykiety, jako zbiór. Chcemy dopasować zbiór do zbioru trenując sieć. Ograniczenie jest takie, że my musimy założyć, że na obrazie będzie nie więcej obiektów niż. Tutaj to ograniczenie jest niskie na przykład 100 i tyle będziemy mieli obiektów na danym obrazie, zawsze. Dzięki zastosowaniu transformera uzyskujemy predykcje. Mamy tyle dokładnie obiektów, ile sobie tam założyliśmy, czyli te 100. I każdy z tych obiektów jest przypisywany do jednej z klas, albo do braku klasy, gdy mamy obiekt nadmiarowy. Jeżeli mamy tylko 2 obiekty na obrazie to pozostałe 98 jest przypisane do klasy no-object. I jeśli chodzi o porównanie tego oryginalnego DETR-a do na przykład sieci Faster RCNN to widzimy, że DETR ma dość niską średnią precyzję na małych obiektach i to jest jego największy problem [no i długo się trenuje…]. Natomiast ten problem został ostatnio, w tym roku również, poprawiony [Deformable DETR].

Dzięki zastosowaniu transformera dla każdego piksela mamy informację, który fragment obrazu jest dla niego ważny. Więc na podstawie tych map atencji wiemy, od razu mamy panoptic segmentation. Jest to fajny efekt uboczny. 

Tutaj taka krótka reklama. Można wejść na deepdrive.pl, tam są dwa wpisy, które pokazują po prostu, jak krok po kroku uruchomić DETR-a właśnie albo do wykrywania obiektów albo do segmentacji.

PP-YOLO (2020.08)

Natomiast co się wydarzyło w sierpniu? Powstała kolejna architektura z serii YOLO, powiedzmy. Bo na podstawie v4 Baidu opracowało PP-YOLO, PP od frameworku paddle-paddle. PP-YOLO, jest lepsze niż v4. Natomiast o tym tylko krótko, bo mi się tego nie udało jeszcze przetestować. Natomiast jest tam szereg zmian, sygnalizuję, że jest coś takiego i że być może warto to rozważyć. Jeśli chodzi o porównanie, to PP-YOLO, ma tutaj gorszą statystykę dla małych obiektów, natomiast uzyskujemy lepsze wyniki dla tej średniej precyzji metryki COCO. [Później pojawiło się jeszcze PP-YOLOv2]

Scaled YOLOv4 (2020.11)

I to, co się stało później jeszcze, Scaled-YOLOv4. To jest coś, do czego ostatnio zaczynam się przymierzać, czyli właśnie z listopada sieć, która w ogóle przewyższa tutaj parametrami v4. [Sprawdziłem, było super do większych zdjęć, małych obiektów] Dodam, jako ciekawostkę, że największa architektura to YOLOv4-P7. Ono ma już rozdzielczość wejściową 1536×1536. I do wytrenowania czegoś takiego trzeba karty Tesli A100 z 40GB RAM-u. W sensie te 40 wystarcza, bo są też 80GB, ale nie wiem, czy to jest w chmurze już dostępne. Także warto, polecam. 

Linki

Close