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)- undPANet(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 führt einige bemerkenswerte Verbesserungen gegenüber seinen Vorgängern ein:
- Die
Focus-Struktur aus früheren Versionen wurde durch eine6x6 Conv2d-Struktur ersetzt. Diese Änderung steigert die Effizienz #4825. - Die
SPP-Struktur wurde durchSPPFersetzt. 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.20780706405639648Techniken 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.

-
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.

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

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

-
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.

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

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:
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.
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.
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:
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.
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.
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.
- Wenn das berechnete Verhältnis innerhalb des Schwellenwerts liegt, ordne die Ground-Truth-Box dem entsprechenden Anker zu.
- 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.
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.