### Wprowadzenie do YOLO YOLO (You Only Look Once) to popularny algorytm detekcji obiektów w czasie rzeczywistym. W przeciwieństwie do tradycyjnych metod, które wykonują wiele przebiegów przez obraz (np. R-CNN), YOLO przetwarza cały obraz tylko raz, przewidując jednocześnie granice obiektów (bounding boxes) i ich klasy. Dzięki temu jest znacznie szybszy, co czyni go idealnym do zastosowań wymagających niskiej latencji. #### Główne cechy: - **Szybkość:** Przetwarza obrazy z dużą prędkością, często w czasie rzeczywistym. - **Jednolitość:** Wykonuje detekcję jako pojedynczy problem regresji, bezpośrednio z pikseli obrazu do współrzędnych pola ograniczającego i prawdopodobieństw klas. - **Uczenie się cech globalnych:** Widzi cały obraz podczas treningu i testowania, dzięki czemu może kodować informacje kontekstowe o klasach, co zmniejsza liczbę błędów tła. ### Jak działa YOLO? YOLO dzieli obraz wejściowy na siatkę $S \times S$. Dla każdej komórki siatki przewiduje: 1. **B bounding boxów:** Każdy bounding box zawiera 5 przewidywań: $(x, y, w, h, \text{confidence})$. - $(x, y)$: współrzędne środka bounding boxa względem komórki siatki. - $(w, h)$: szerokość i wysokość bounding boxa względem rozmiaru całego obrazu. - $\text{confidence}$: pewność, że w danym bounding boxie znajduje się obiekt i jak dokładny jest ten box. Jest to $P(\text{Obiekt}) \times \text{IOU}_{\text{pred}}^{\text{true}}$. 2. **Prawdopodobieństwa klas:** Dla każdej komórki siatki przewiduje $C$ warunkowych prawdopodobieństw klas, $P(\text{Klasa}_i | \text{Obiekt})$. Te prawdopodobieństwa są wspólne dla wszystkich $B$ bounding boxów w danej komórce. #### Proces detekcji: 1. **Podział obrazu:** Obraz jest dzielony na siatkę $S \times S$. 2. **Przewidywanie:** Każda komórka siatki przewiduje $B$ bounding boxów i $C$ prawdopodobieństw klas. 3. **Filtracja:** Odrzucane są bounding boxy o niskim wskaźniku pewności (confidence score). 4. **Non-Maximum Suppression (NMS):** Eliminowanie zduplikowanych bounding boxów dla tego samego obiektu. NMS wybiera box o najwyższej pewności i usuwa wszystkie inne boxy, które mają wysoki współczynnik Jaccarda (IOU) z wybranym boxem. ### Architektura Sieci Architektura YOLO jest inspirowana siecią GoogLeNet. Składa się z: - **Warstw konwolucyjnych:** Uczą się cech z obrazu. Zazwyczaj używa się naprzemiennie warstw konwolucyjnych 3x3 i 1x1. - **Warstw połączonych całkowicie (fully connected):** Wykonują przewidywania bounding boxów i prawdopodobieństw klas. #### Przykładowa struktura (YOLOv1): - 24 warstwy konwolucyjne - 2 warstwy połączone całkowicie - Użycie aktywacji Leaky ReLU - Dropout dla zapobiegania przeuczeniu #### Wyjście sieci: Wyjście sieci YOLO to tensor o wymiarach $S \times S \times (B \times 5 + C)$. - $S \times S$: Rozmiar siatki. - $B \times 5$: $B$ bounding boxów, każdy z 5 parametrami ($x, y, w, h, \text{confidence}$). - $C$: Liczba klas. ### Funkcja Straty (Loss Function) Funkcja straty w YOLO jest złożona i składa się z kilku części, aby skutecznie trenować sieć do jednoczesnej predykcji lokalizacji i klasyfikacji. $$ \begin{aligned} \text{Loss} &= \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \right] \\ &\quad + \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] \\ &\quad + \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} (C_i - \hat{C}_i)^2 \\ &\quad + \lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{noobj}} (C_i - \hat{C}_i)^2 \\ &\quad + \sum_{i=0}^{S^2} \mathbb{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} (p_i(c) - \hat{p}_i(c))^2 \end{aligned} $$ Gdzie: - $\mathbb{1}_{ij}^{\text{obj}}$: 1, jeśli $j$-ty bounding box w komórce $i$ jest odpowiedzialny za wykrycie obiektu, 0 w przeciwnym razie. - $\mathbb{1}_{ij}^{\text{noobj}}$: 1, jeśli $j$-ty bounding box w komórce $i$ nie zawiera obiektu, 0 w przeciwnym razie. - $\lambda_{\text{coord}}$ i $\lambda_{\text{noobj}}$: Wagi dla strat związanych z lokalizacją i brakiem obiektu, odpowiednio (zazwyczaj $\lambda_{\text{coord}} > \lambda_{\text{noobj}}$). - $(x_i, y_i, w_i, h_i)$: Przewidywane parametry bounding boxa. - $(\hat{x}_i, \hat{y}_i, \hat{w}_i, \hat{h}_i)$: Rzeczywiste parametry bounding boxa. - $C_i$: Przewidywana pewność (confidence). - $\hat{C}_i$: Rzeczywista pewność (IOU prawdziwego boxa z przewidywanym). - $p_i(c)$: Przewidywane prawdopodobieństwo klasy $c$. - $\hat{p}_i(c)$: Rzeczywiste prawdopodobieństwo klasy $c$. #### Składniki funkcji straty: 1. **Błąd lokalizacji (Bounding Box Regression Loss):** Mierzy błąd w przewidywaniach $(x, y, w, h)$. Waga $\lambda_{\text{coord}}$ jest używana, aby nadać większe znaczenie błędom lokalizacji. Zauważ, że dla $w$ i $h$ używa się pierwiastków kwadratowych, aby małe odchylenia w dużych boxach miały mniejszy wpływ niż w małych. 2. **Błąd pewności (Confidence Loss):** - Dla komórek zawierających obiekt ($\mathbb{1}_{ij}^{\text{obj}}$): Mierzy, jak dobrze sieć przewiduje IOU między przewidywanym a prawdziwym bounding boxem. - Dla komórek bez obiektu ($\mathbb{1}_{ij}^{\text{noobj}}$): Mierzy, jak dobrze sieć przewiduje, że w danym boxie nie ma obiektu. Waga $\lambda_{\text{noobj}}$ jest stosowana, ponieważ większość komórek siatki nie zawiera obiektów, co mogłoby zdominować trening. 3. **Błąd klasyfikacji (Classification Loss):** Mierzy błąd w przewidywaniach klas dla komórek zawierających obiekt. Ta złożona funkcja straty pozwala YOLO na precyzyjne przewidywanie zarówno lokalizacji, jak i klas obiektów w obrazie. ### Zalety i Wady YOLO #### Zalety: - **Szybkość:** Jest jednym z najszybszych algorytmów detekcji obiektów, często działającym w czasie rzeczywistym. - **Globalne rozumienie:** Widzi cały obraz, co pozwala mu lepiej rozumieć kontekst i redukować błędy tła. - **Uogólnianie:** Dobrze uogólnia na nowe dziedziny, ponieważ uczy się ogólnych reprezentacji obiektów. #### Wady: - **Niska precyzja dla małych obiektów:** Każda komórka siatki przewiduje ograniczoną liczbę bounding boxów, co utrudnia detekcję wielu małych obiektów blisko siebie (np. stada ptaków). - **Błędy lokalizacji:** Wczesne wersje YOLO miały tendencję do popełniania większych błędów w lokalizacji bounding boxów niż metody dwuetapowe (np. Faster R-CNN). - **Ograniczenia liczby obiektów:** Każda komórka siatki może przewidzieć tylko jeden obiekt danej klasy, co jest problemem, gdy jeden obiekt zajmuje wiele komórek lub gdy wiele obiektów znajduje się w jednej komórce. ### Ewolucja YOLO Od czasu pierwszej wersji YOLO (YOLOv1), algorytm przeszedł wiele ulepszeń: - **YOLOv2 (YOLO9000):** Wprowadził kotwice (anchor boxes), batch normalization, wyższą rozdzielczość obrazów wejściowych i bardziej zaawansowany trening. Pozwolił na detekcję ponad 9000 kategorii obiektów. - **YOLOv3:** Zastosował architekturę Darknet-53, przewidywanie bounding boxów na trzech różnych skalach oraz bardziej zaawansowaną funkcję straty binarnych klasyfikatorów dla każdej klasy. - **YOLOv4:** Zoptymalizował architekturę sieci (CSPDarknet53), wprowadził techniki takie jak Mosaic data augmentation, Mish aktywacja, a także ulepszenia w post-processingu (m.in. CIoU loss). - **YOLOv5:** Lekka i szybka implementacja w PyTorchu, często używana ze względu na łatwość użycia i dobre wyniki. Wprowadził dalsze optymalizacje w architekturze i procesie treningowym. - **YOLOv6, YOLOv7, YOLOv8...:** Ciągłe udoskonalenia w zakresie szybkości, dokładności i efektywności, często wprowadzane przez różne zespoły badawcze i firmy. Każda kolejna wersja dąży do poprawy kompromisu między szybkością a precyzją.