Ultralytics YOLOv5-Architektur

YOLOv5 (v6.0/6.1) ist ein leistungsstarker Objekterkennungsalgorithmus, der von Ultralytics entwickelt wurde. Dieser Artikel befasst sich eingehend mit der YOLOv5-Architektur, den Strategien zur Datenerweiterung, den Trainingsmethoden und den Techniken zur Verlustberechnung. Dieses umfassende Verständnis hilft dir dabei, deine praktische Anwendung der Objekterkennung in verschiedenen Bereichen zu verbessern, einschließlich Überwachung, autonomer Fahrzeuge und Bilderkennung.

Modellstruktur

Die Architektur von YOLOv5 besteht aus drei Hauptteilen:

  • Backbone: Dies ist der Hauptteil des Netzwerks. Für YOLOv5 wurde der Backbone unter Verwendung der CSPDarknet53-Struktur entworfen, einer Modifikation der Darknet-Architektur aus früheren Versionen.
  • Neck: Dieser Teil verbindet das Backbone mit dem Head. In YOLOv5 werden SPPF (Spatial Pyramid Pooling - Fast)- und PANet (Path Aggregation Network)-Strukturen verwendet.
  • Head: Dieser Teil ist für die Erstellung der endgültigen Ausgabe verantwortlich. YOLOv5 verwendet dafür den YOLOv3 Head.

Die Struktur des Modells ist in der Abbildung unten dargestellt. Die Details zur Modellstruktur findest du in models/yolov5l.yaml.

YOLOv5-Architektur mit Backbone, Neck und Head

YOLOv5 führt einige bemerkenswerte Verbesserungen gegenüber seinen Vorgängern ein:

  1. Die Focus-Struktur aus früheren Versionen wurde durch eine 6x6 Conv2d-Struktur ersetzt. Diese Änderung steigert die Effizienz #4825.
  2. Die SPP-Struktur wurde durch SPPF ersetzt. Diese Änderung verdoppelt die Verarbeitungsgeschwindigkeit bei gleichbleibender Ausgabe.

Um die Geschwindigkeit von SPP und SPPF zu testen, kann der folgende Code verwendet werden:

SPP vs SPPF speed profiling example (click to open)
import time

import torch
import torch.nn as nn

class SPP(nn.Module):
    def __init__(self):
        """Initializes an SPP module with three different sizes of max pooling layers."""
        super().__init__()
        self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
        self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
        self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)

    def forward(self, x):
        """Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
        o1 = self.maxpool1(x)
        o2 = self.maxpool2(x)
        o3 = self.maxpool3(x)
        return torch.cat([x, o1, o2, o3], dim=1)

class SPPF(nn.Module):
    def __init__(self):
        """Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
        super().__init__()
        self.maxpool = nn.MaxPool2d(5, 1, padding=2)

    def forward(self, x):
        """Applies sequential max pooling and concatenates results with input tensor."""
        o1 = self.maxpool(x)
        o2 = self.maxpool(o1)
        o3 = self.maxpool(o2)
        return torch.cat([x, o1, o2, o3], dim=1)

def main():
    """Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
    input_tensor = torch.rand(8, 32, 16, 16)
    spp = SPP()
    sppf = SPPF()
    output1 = spp(input_tensor)
    output2 = sppf(input_tensor)

    print(torch.equal(output1, output2))

    t_start = time.time()
    for _ in range(100):
        spp(input_tensor)
    print(f"SPP time: {time.time() - t_start}")

    t_start = time.time()
    for _ in range(100):
        sppf(input_tensor)
    print(f"SPPF time: {time.time() - t_start}")

if __name__ == "__main__":
    main()

Ergebnis:

True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648

Techniken zur Datenerweiterung

YOLOv5 verwendet verschiedene Techniken zur Datenerweiterung, um die Verallgemeinerungsfähigkeit des Modells zu verbessern und Overfitting zu reduzieren. Diese Techniken umfassen:

  • Mosaic-Erweiterung: Eine Bildverarbeitungstechnik, die vier Trainingsbilder kombiniert, um Objekterkennungsmodelle dazu anzuregen, verschiedene Objektgrößen und Verschiebungen besser zu verarbeiten.

    YOLOv5 Mosaic-Datenerweiterung, die vier Bilder kombiniert

  • Copy-Paste-Erweiterung: Eine innovative Methode zur Datenerweiterung, bei der zufällige Ausschnitte aus einem Bild kopiert und auf ein anderes zufällig ausgewähltes Bild eingefügt werden, wodurch effektiv ein neuer Trainingsdatensatz erzeugt wird.

    YOLOv5 Copy-Paste-Erweiterung für Instanzsegmentierung

  • Zufällige affine Transformationen: Dies umfasst zufällige Rotation, Skalierung, Verschiebung und Scherung der Bilder.

    Zufällige affine Transformationen von YOLOv5 für das Training

  • MixUp-Erweiterung: Eine Methode, die zusammengesetzte Bilder durch eine lineare Kombination aus zwei Bildern und deren zugehörigen Labels erstellt.

    YOLOv5 MixUp-Datenerweiterung, die zwei Bilder mischt

  • Albumentations: Eine leistungsstarke Bild-Erweiterungsbibliothek, die eine Vielzahl von Erweiterungstechniken unterstützt. Erfahre mehr über die Verwendung von Albumentations-Erweiterungen.

  • HSV-Erweiterung: Zufällige Änderungen an Farbton (Hue), Sättigung (Saturation) und Helligkeit (Value) der Bilder.

    Beispiele für YOLOv5 HSV-Farbraumerweiterung

  • Zufällige horizontale Spiegelung: Eine Erweiterungsmethode, bei der Bilder zufällig horizontal gespiegelt werden.

    YOLOv5 zufällige horizontale Spiegelung als Erweiterung

Trainingsstrategien

YOLOv5 wendet verschiedene hochentwickelte Trainingsstrategien an, um die Modellleistung zu steigern. Dazu gehören:

  • Multiscale-Training: Die Eingabebilder werden während des Trainingsprozesses zufällig in einem Bereich vom 0,5- bis 1,5-fachen ihrer ursprünglichen Größe skaliert.
  • AutoAnchor: Diese Strategie optimiert die Prior-Ankerboxen, um sie an die statistischen Merkmale der Ground-Truth-Boxen in deinen benutzerdefinierten Daten anzupassen.
  • Warmup und Cosine LR Scheduler: Eine Methode zur Anpassung der Lernrate, um die Modellleistung zu steigern.
  • Exponential Moving Average (EMA): Eine Strategie, die den Durchschnitt der Parameter über vergangene Schritte verwendet, um den Trainingsprozess zu stabilisieren und den Generalisierungsfehler zu verringern.
  • Gemischte Präzision-Training: Eine Methode, um Berechnungen im Halb-Präzisionsformat durchzuführen, was die Speichernutzung reduziert und die Rechengeschwindigkeit erhöht.
  • Hyperparameter-Evolution: Eine Strategie zur automatischen Abstimmung von Hyperparametern, um eine optimale Leistung zu erzielen. Erfahre mehr über Hyperparameter-Tuning.

Zusätzliche Funktionen

4.1 Verlustberechnung

Der Verlust in YOLOv5 wird als Kombination aus drei einzelnen Verlustkomponenten berechnet:

  • Klassenverlust (BCE Loss): Binary Cross-Entropy-Verlust; misst den Fehler für die Klassifizierungsaufgabe.
  • Objekt-Verlust (BCE Loss): Ein weiterer Binary Cross-Entropy-Verlust; berechnet den Fehler bei der Erkennung, ob ein Objekt in einer bestimmten Rasterzelle vorhanden ist oder nicht.
  • Positionsverlust (CIoU Loss): Complete IoU-Verlust; misst den Fehler bei der Lokalisierung des Objekts innerhalb der Rasterzelle.

Die gesamte Verlustfunktion wird dargestellt durch:

YOLOv5 Gesamtverlustfunktionsformel

4.2 Verlustausgleich

Die Objektverluste der drei Vorhersageschichten (P3, P4, P5) werden unterschiedlich gewichtet. Die Ausgleichsgewichte betragen [4.0, 1.0, 0.4]. Dieser Ansatz stellt sicher, dass die Vorhersagen in verschiedenen Skalen angemessen zum Gesamtverlust beitragen.

YOLOv5 Objektverlust-Ausgleichsformel

4.3 Gitterempfindlichkeit eliminieren

Die YOLOv5-Architektur nimmt einige wichtige Änderungen an der Strategie zur Box-Vorhersage im Vergleich zu früheren YOLO-Versionen vor. Bei YOLOv2 und YOLOv3 wurden die Box-Koordinaten direkt mithilfe der Aktivierung der letzten Schicht vorhergesagt.

Formel für die x-Koordinaten-Vorhersage der Begrenzungsbox Formel für die y-Koordinaten-Vorhersage der Begrenzungsbox Formel für die Breiten-Vorhersage der Begrenzungsbox Formel für die Höhen-Vorhersage der Begrenzungsbox

YOLOv5 grid computation

In YOLOv5 wurde die Formel für die Vorhersage der Box-Koordinaten jedoch aktualisiert, um die Gitterempfindlichkeit zu reduzieren und zu verhindern, dass das Modell unbegrenzte Box-Dimensionen vorhersagt.

Die überarbeiteten Formeln zur Berechnung der vorhergesagten Begrenzungsbox lauten wie folgt:

YOLOv5 überarbeitete Formel für die x-Koordinate der Begrenzungsbox YOLOv5 überarbeitete Formel für die y-Koordinate der Begrenzungsbox YOLOv5 überarbeitete Formel für die Breite der Begrenzungsbox YOLOv5 überarbeitete Formel für die Höhe der Begrenzungsbox

Vergleiche den Mittelpunkt-Offset vor und nach der Skalierung. Der Bereich des Mittelpunkt-Offsets wird von (0, 1) auf (-0,5, 1,5) angepasst. Daher kann der Offset leicht 0 oder 1 erreichen.

YOLOv5 grid scaling

Vergleiche das Skalierungsverhältnis von Höhe und Breite (relativ zum Anker) vor und nach der Anpassung. Die ursprünglichen yolo/darknet-Boxgleichungen weisen einen schwerwiegenden Fehler auf. Breite und Höhe sind völlig unbegrenzt, da sie einfach out=exp(in) entsprechen, was gefährlich ist, da dies zu ausufernden Gradienten, Instabilitäten, NaN-Verlusten und letztendlich zu einem vollständigen Trainingsausfall führen kann. Beziehe dich auf dieses Issue für weitere Details.

YOLOv5 unbounded scaling

4.4 Ziele erstellen

Der Prozess der Zielerstellung in YOLOv5 ist entscheidend für die Trainingseffizienz und die Modell-Genauigkeit. Er umfasst die Zuweisung von Ground-Truth-Boxen zu den entsprechenden Gitterzellen in der Ausgabekarte und deren Abgleich mit den passenden Ankerboxen.

Dieser Prozess folgt diesen Schritten:

  • Berechne das Verhältnis der Dimensionen der Ground-Truth-Box und der Dimensionen jeder Anker-Vorlage.

Formel für das Verhältnis von Ground-Truth- zu Ankerbreite

Formel für das Verhältnis von Ground-Truth- zu Ankerhöhe

Formel für das maximale Breitenverhältnis

Formel für das maximale Höhenverhältnis

Formel für das gesamte maximale Verhältnis

Formel für den Anker-Matching-Schwellenwert

YOLOv5 IoU computation
  • Wenn das berechnete Verhältnis innerhalb des Schwellenwerts liegt, ordne die Ground-Truth-Box dem entsprechenden Anker zu.
YOLOv5 grid overlap
  • Weise den passenden Anker den entsprechenden Zellen zu, wobei zu beachten ist, dass aufgrund des überarbeiteten Mittelpunkt-Offsets eine Ground-Truth-Box mehr als einem Anker zugewiesen werden kann, da der Bereich des Mittelpunkt-Offsets von (0, 1) auf (-0,5, 1,5) angepasst wurde, was zusätzliche Übereinstimmungen ermöglicht.
YOLOv5 anchor selection

Auf diese Weise stellt der Prozess der Zielerstellung sicher, dass jedes Ground-Truth-Objekt während des Trainingsprozesses korrekt zugewiesen und zugeordnet wird, wodurch YOLOv5 die Objekterkennung effektiver erlernen kann.

Fazit

YOLOv5 stellt einen bedeutenden Schritt in der Entwicklung der Echtzeit-Objekterkennung dar. Seine architektonischen Entscheidungen, Trainingsstrategien und technischen Verfeinerungen liefern im Vergleich zu früheren YOLO-Versionen eine starke Leistung und Effizienz.

Die primären Verbesserungen in YOLOv5 umfassen den Einsatz einer dynamischen Architektur, eine breite Palette an Datenerweiterungstechniken, innovative Trainingsstrategien sowie wichtige Anpassungen bei der Berechnung von Verlusten und beim Prozess der Zielerstellung. All diese Innovationen verbessern die Genauigkeit und Effizienz der Objekterkennung erheblich, während sie das hohe Maß an Geschwindigkeit beibehalten, das das Markenzeichen der YOLO-Modelle ist.

Kommentare