kompleksowe wykrywanie obiektów z dopasowaniem szablonów za pomocą Pythona

jak zaimplementować niestandardowe wykrywanie obiektów z dopasowaniem szablonów. Nie wymaga adnotacji!

wykrywanie obiektów-dopasowywanie szablonów
wykrywanie obiektów z dopasowaniem szablonów do wykrywania komponentów

obecnie najnowocześniejsze algorytmy wykrywania obiektów (algorytmy mające na celu wykrywanie obiektów na zdjęciach) wykorzystują sieci neuronowe, takie jak Yolov4.

wyjście wykrywania obiektów
wyjście wykrywania obiektów

dopasowywanie szablonów jest techniką cyfrowego przetwarzania obrazu służącą do znajdowania małych części obrazu, które pasują do obrazu szablonu. Jest to znacznie prostsze rozwiązanie niż sieć neuronowa do prowadzenia detekcji obiektów. Ponadto ma następujące zalety:

  • nie ma potrzeby adnotowania danych (czasochłonne i obowiązkowe zadanie do trenowania sieci neuronowych)
  • obwiedni są dokładniejsze
  • nie ma potrzeby GPU

z mojego doświadczenia wynika, że połączenie sieci neuronowej, takiej jak Yolov4 i wykrywanie obiektów z dopasowaniem szablonów, jest dobrym sposobem na znaczne zwiększenie wydajności sieci neuronowej!

co to jest dopasowanie szablonu?

kiedy używasz dopasowywania szablonów OpenCV, Twój szablon przesuwa piksel po pikselu na obrazie. Dla każdej pozycji obliczana jest metryka podobieństwa między obrazem szablonu a odzyskaną częścią obrazu:

template-matching-example
używanie template matching do wykrywania francuskiego ID w zeskanowanych dokumentach

jeśli metryka podobieństwa jest wystarczająco wysoka dla jednego piksela, to ten piksel jest prawdopodobnie lewym górnym rogu obiektu pasującego do Twojego szablonu!

w związku z tym można uzyskać wykrywanie obiektów za pomocą dopasowania szablonu tylko wtedy, gdy obiekty, które próbujesz wykryć, są wystarczająco podobne —prawie identyczne— w klasie. Nadal można dodawać więcej szablonów do rozwiązywania problemów z różnicami obiektów (rozmiar, kolor, orientacja). Ale zwiększy to czas przewidywania.

na pierwszy rzut oka wydaje się to bardzo restrykcyjne. Ale wiele przypadków wykrywania obiektów można rozwiązać za pomocą dopasowania szablonów:

  • ID w zeskanowanych dokumentach
  • puste miejsce parkingowe z kamery stacjonarnej
  • elementy na linii montażowej…

praktyczny przykład

dobrym przykładem użycia do wykrywania obiektów przy użyciu dopasowania szablonów jest wykrywanie komponentów na obwodach drukowanych, takich jak ten:

obwód drukowany-unsplash
obwód drukowany-fot. Umberto na Unsplash

można sobie wyobrazić linię montażową produkującą takie obwody. Wyobraźmy sobie, że niektóre układy produkowane są brakujące elementy, a tym samym, wadliwe. Możemy zaproponować zainstalowanie kamery na końcu szlaku i nakręcenie każdego obwodu, aby odfiltrować wadliwe produkty. Możemy to osiągnąć dzięki wykrywaniu obiektów z dopasowaniem szablonów!

ze względu na prostotę skupimy się na wykrywaniu kilku komponentów.

pierwszy komponent pojawia się dwa razy:

template-matching-component-1
Component 1

ten pojawił się cztery razy:

template-matching-component-2
Component 2

a ten trzeci pojawia się sześć razy:

template-matching-component-3
Component 3

na koniec wybieramy te trzy obrazy jako szablony. W związku z tym złożoność tego przypadku użycia jest zmniejszona: będziemy łatwo wykryć przynajmniej obiekty wybrane jako szablony.

podstawowe wykrywanie obiektów z dopasowaniem szablonu

Definiowanie szablonu

po pierwsze definiujemy szablony z:

  • ścieżka obrazu,
  • Etykieta,
  • kolor (dla wizualizacji wyniku —obwiedniowe pola i kolor etykiet),
  • i pasujący próg.

po drugie, uważamy, że wszystkie piksele mające metrykę podobieństwa powyżej tego progu wskazują na wykrycie tego szablonu.

oto kod definiujący szablony:

Definiowanie szablonów

wykrywanie obiektu z dopasowaniem szablonu

następnie zapętlamy szablony, aby wykonać detekcję obiektu z dopasowaniem szablonu dla każdego szablonu. Ponieważ używamy progu, wybieramy znormalizowaną metrykę podobieństwa (TM_CCOEFF_NORMED)podczas dopasowywania szablonów. Dlatego możemy wybrać próg między 0 a 1:

wykrywanie obiektów z dopasowaniem szablonu

uważamy, że każdy piksel o wyniku podobieństwa powyżej progu szablonu jest lewym górnym rogu obiektu (z wysokością, szerokością i etykietą szablonu).

wizualizujemy wykryte obiekty

następnie rysujemy przewidywane obwiedniowe pola wykrywania tego obiektu z dopasowaniem szablonu na obrazku wejściowym:

Wyświetl wyniki wykrywania obiektów

na koniec otrzymujemy następujące wyniki:

template-matching-duplicated-detected-objects
Duplicated detected objects

jak wskazuje grubość pól (w kolorze zielonym, żółtym i czerwonym), każdy obiekt został wykryty kilka razy.

Usuń duplikaty

dlaczego otrzymaliśmy duplikaty detekcji? Jak wyjaśniono powyżej, OpenCV template matching zwraca macierz 2-D o wymiarze obrazu wejściowego (jedna komórka— a więc jeden wynik podobieństwa— dla każdego piksela obrazu wejściowego).

w związku z tym, jeśli obiekt zostanie wykryty w jednym miejscu, wszystkie otaczające piksele będą najprawdopodobniej miały ten sam wynik podobieństwa, a tym samym będą uważane za inne obiekty w lewym górnym rogu.

aby rozwiązać ten problem, posortujemy wszystkie detekcje, zmniejszając pasujące wartości. Następnie wybierzemy, czy walidować każde wykrycie. Sprawdzamy wykrywanie, jeśli nie pokrywa się zbytnio z którymkolwiek z już sprawdzonych wykrywań. Na koniec ustalamy, że dwie detekcje nakładają się na siebie, jeśli przecięcie nad związkiem ich obwiedni jest powyżej określonego progu. Proces ten nazywany jest tłumieniem Niemaksymalnym.

oto wizualne wyjaśnienie, czym jest skrzyżowanie nad Unią (IOU) :

skrzyżowanie nad Unią

oto jak to zaimplementowałem (metoda compute IOU wraz z więcej wyjaśnień można znaleźć tutaj):

Nie maksymalne tłumienie

a potem dodałem te dwie linie po pętli detekcji:

Zastosuj NMS

w rezultacie otrzymujemy:

deduplikowane-wykryte-obiekty
deduplikowane wykryte obiekty

dużo czystsze! Teraz wyraźnie widzimy, że wszystkie pierwsze i trzecie składniki są wykrywane bez fałszywie dodatnich (precyzja i przypomnienie 1).

chcemy teraz zmniejszyć liczbę fałszywych alarmów dla komponentu 2. Najprostszym sposobem jest zwiększenie progu dopasowania szablonu używanego dla tej etykiety.

wybór hiperparametrów

oczywiście lepiej jest obliczyć metryki wykrywania obiektów na różnych obrazach, aby wybrać hiperparametry (próg dopasowania szablonu i inny niż maksymalny próg tłumienia). Na razie możemy po prostu zwiększyć próg dla komponentu 2:

wybieramy szablon pasujący do progów

i otrzymujemy:

ostatnie wyjście
ostatnie wyjście

mamy teraz tylko dwa fałszywe alarmy dla komponentu 2, zamiast kilkudziesięciu (precyzja 2/3, przypomnienie 1)! Ponadto komponenty 1 i 2 są nadal doskonale wykrywane (precyzja i wycofanie 1).

aby poprawić nasze wyniki możemy:

  • Dołącz szablony dla komponentów pomylonych z komponentem 2.
  • wypróbuj kilka wskaźników podobieństwa
  • Adnotuj kilka obrazów, aby obliczyć wskaźniki wykrywania i wykonaj wyszukiwanie siatkowe tych parametrów.

podsumowanie

uzyskaliśmy wykrywanie obiektów z dopasowaniem szablonu przez:

  • definiowanie co najmniej jednego szablonu dla każdego obiektu (im więcej szablonów masz dla jednego obiektu, tym większa będzie twoja popularność—a twoja precyzja niska)
  • korzystanie z metody dopasowania szablonów OpenCV na obrazie dla każdego szablonu
  • biorąc pod uwagę, że każdy piksel o wyniku podobieństwa powyżej progu szablonu jest lewym górnym rogu obiektu (z wysokością, szerokością i etykietą tego szablonu)
  • zastosowanie innego niż maksymalne tłumienie otrzymanych detekcji
  • wybór progów szablonów w celu poprawy dokładności wykrywania!

to jest to!

szukasz ekspertów od rozpoznawania obrazów? Nie wahaj się z nami skontaktować!

You might also like

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.