Ultralytics YOLOv5-Architektur#
YOLOv5 (v6.0/6.1) ist ein leistungsfähiger Algorithmus zur Objekterkennung, der von Ultralytics entwickelt wurde. Dieser Artikel bietet einen detaillierten Einblick in die YOLOv5-Architektur, Strategien zur Datenerweiterung, Trainingsmethoden und Techniken zur Berechnung des Verlusts. Dieses umfassende Verständnis hilft dir dabei, die praktische Anwendung der Objekterkennung in verschiedenen Bereichen zu verbessern, darunter Überwachung, autonome Fahrzeuge und Bilderkennung.
1. Modellstruktur#
Die Architektur von YOLOv5 besteht aus drei Hauptbestandteilen:
- Backbone: Dies ist der Hauptteil des Netzwerks. Für YOLOv5 wurde das Backbone mithilfe der Struktur
CSPDarknet53entwickelt, einer Anpassung der in früheren Versionen verwendeten Darknet-Architektur. - Neck: Dieser Teil verbindet Backbone und Head. In YOLOv5 werden die Strukturen
SPPF(Spatial Pyramid Pooling – Fast) undPANet(Path Aggregation Network) verwendet. - Head: Dieser Teil ist für die Erzeugung der endgültigen Ausgabe zuständig. YOLOv5 verwendet dafür
YOLOv3 Head.
Die Struktur des Modells ist in der folgenden Abbildung dargestellt. Details zur Modellstruktur findest du in models/yolov5l.yaml.

YOLOv5 führt im Vergleich zu seinen Vorgängern einige bemerkenswerte Verbesserungen ein:
- Die in früheren Versionen verwendete Struktur
Focuswird durch eine Struktur6x6 Conv2dersetzt. Diese Änderung steigert die Effizienz #4825. - Die Struktur
SPPwird durchSPPFersetzt. Dadurch wird die Verarbeitung bei gleichbleibender Ausgabe mehr als doppelt so schnell.
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
from torch import 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.207807064056396482. Techniken zur Datenerweiterung#
YOLOv5 verwendet verschiedene Techniken zur Datenerweiterung, um die Verallgemeinerungsfähigkeit des Modells zu verbessern und Überanpassung zu reduzieren. Dazu gehören:
-
Mosaic-Datenerweiterung: Eine Bildverarbeitungstechnik, die vier Trainingsbilder zu einem Bild kombiniert, sodass Modelle zur Objekterkennung besser mit verschiedenen Objektgrößen und Verschiebungen umgehen können.

-
Copy-Paste-Datenerweiterung: Eine innovative Methode zur Datenerweiterung, bei der zufällige Ausschnitte aus einem Bild kopiert und in ein anderes zufällig ausgewähltes Bild eingefügt werden, wodurch effektiv ein neues Trainingsbeispiel entsteht.

-
Zufällige affine Transformationen: Dazu gehören zufällige Drehungen, Skalierungen, Verschiebungen und Scherungen der Bilder.

-
MixUp-Datenerweiterung: Eine Methode, bei der durch eine lineare Kombination aus zwei Bildern und den zugehörigen Beschriftungen zusammengesetzte Bilder erzeugt werden.

-
Albumentations: Eine leistungsfähige Bibliothek zur Bilderweiterung, die eine große Vielfalt an Techniken zur Datenerweiterung unterstützt. Erfahre mehr über die Verwendung von Albumentations-Erweiterungen.
-
HSV-Datenerweiterung: Zufällige Änderungen an Farbton, Sättigung und Helligkeit der Bilder.

-
Zufälliges horizontales Spiegeln: Eine Methode zur Datenerweiterung, bei der Bilder zufällig horizontal gespiegelt werden.

3. Trainingsstrategien#
YOLOv5 verwendet mehrere ausgefeilte Trainingsstrategien, um die Leistung des Modells zu steigern. Dazu gehören:
- Training mit mehreren Maßstäben: Die Eingabebilder werden während des Trainings zufällig auf das 0,5- bis 1,5-Fache ihrer ursprünglichen Größe skaliert.
- AutoAnchor: Diese Strategie optimiert die vorher festgelegten Ankerboxen so, dass sie den statistischen Eigenschaften der Ground-Truth-Boxen in deinen benutzerdefinierten Daten entsprechen.
- Warmup und Cosine-LR-Scheduler: Eine Methode zur Anpassung der Lernrate, um die Modellleistung zu verbessern.
- Exponentiell gleitender Mittelwert (EMA): Eine Strategie, die den Mittelwert der Parameter aus vergangenen Schritten verwendet, um den Trainingsprozess zu stabilisieren und den Generalisierungsfehler zu reduzieren.
- Training mit gemischter Präzision: Eine Methode, bei der Operationen im Halb-präzisionsformat ausgeführt werden, wodurch der Speicherbedarf reduziert und die Rechengeschwindigkeit erhöht wird.
- Hyperparameter-Evolution: Eine Strategie zur automatischen Abstimmung der Hyperparameter, um eine optimale Leistung zu erzielen. Erfahre mehr über die Abstimmung von Hyperparametern.
4. Zusätzliche Funktionen#
4.1 Verluste berechnen#
Der Verlust in YOLOv5 wird als Kombination aus drei einzelnen Verlustkomponenten berechnet:
- Klassenverlust (BCE Loss): Der Verlust der binären Kreuzentropie misst den Fehler bei der Klassifizierungsaufgabe.
- Objekthaftigkeitsverlust (BCE Loss): Ein weiterer Verlust der binären Kreuzentropie, der den Fehler bei der Erkennung berechnet, ob in einer bestimmten Gitterzelle ein Objekt vorhanden ist oder nicht.
- Lokalisierungsverlust (CIoU Loss): Der vollständige IoU-Verlust misst den Fehler bei der Lokalisierung des Objekts innerhalb der Gitterzelle.
Die gesamte Verlustfunktion wird dargestellt durch:
4.2 Verluste ausgleichen#
Die Objekthaftigkeitsverluste der drei Vorhersageschichten (P3, P4, P5) werden unterschiedlich gewichtet. Die Ausgleichsgewichte sind jeweils [4.0, 1.0, 0.4]. Dadurch wird sichergestellt, dass Vorhersagen auf unterschiedlichen Maßstabsebenen angemessen zum Gesamtverlust beitragen.
4.3 Gitterempfindlichkeit beseitigen#
Die YOLOv5-Architektur nimmt im Vergleich zu früheren YOLO-Versionen wichtige Änderungen an der Strategie zur Boxvorhersage vor. In YOLOv2 und YOLOv3 wurden die Boxkoordinaten direkt mithilfe der Aktivierung der letzten Schicht vorhergesagt.
In YOLOv5 wurde die Formel zur Vorhersage der Boxkoordinaten jedoch aktualisiert, um die Gitterempfindlichkeit zu reduzieren und zu verhindern, dass das Modell unbeschränkte Boxdimensionen vorhersagt.
Die überarbeiteten Formeln zur Berechnung der vorhergesagten Begrenzungsbox lauten:
Vergleiche den Versatz des Mittelpunkts vor und nach der Skalierung. Der Wertebereich des Mittelpunktversatzes wird von (0, 1) auf (-0.5, 1.5) angepasst. Dadurch kann der Versatz problemlos 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 vollständig unbeschränkt, da sie einfach als out=exp(in) berechnet werden. Das ist gefährlich, weil es zu außer Kontrolle geratenen Gradienten, Instabilitäten, NaN-Verlusten und letztlich zum vollständigen Abbruch des Trainings führen kann. Weitere Einzelheiten findest du in diesem Issue.
4.4 Zielwerte erstellen#
Der Prozess zum Erstellen der Zielwerte ist in YOLOv5 entscheidend für die Trainingseffizienz und die Modell-Genauigkeit. Dabei werden Ground-Truth-Boxen den passenden Gitterzellen in der Ausgabekarte zugewiesen und mit den entsprechenden Ankerboxen abgeglichen.
Dieser Prozess umfasst die folgenden Schritte:
- Berechne das Verhältnis der Dimensionen der Ground-Truth-Box zu den Dimensionen jeder Ankervorlage.
- Wenn das berechnete Verhältnis innerhalb des Schwellenwerts liegt, gleiche die Ground-Truth-Box mit dem entsprechenden Anker ab.
- Weise den abgeglichenen Anker den passenden Zellen zu. Beachte dabei, dass eine Ground-Truth-Box aufgrund des überarbeiteten Mittelpunktversatzes mehr als einem Anker zugewiesen werden kann, da der Wertebereich des Mittelpunktversatzes von (0, 1) auf (-0.5, 1.5) angepasst wurde und dadurch zusätzliche Abgleiche möglich sind.
Auf diese Weise stellt der Prozess zum Erstellen der Zielwerte sicher, dass jedes Ground-Truth-Objekt während des Trainingsprozesses ordnungsgemäß zugewiesen und abgeglichen wird, sodass YOLOv5 die Aufgabe der Objekterkennung effektiver erlernen kann.
Fazit#
YOLOv5 stellt einen wichtigen Schritt in der Entwicklung der Objekterkennung in Echtzeit dar. Die Architekturentscheidungen, Trainingsstrategien und technischen Verbesserungen liefern im Vergleich zu früheren YOLO-Versionen eine hohe Leistung und Effizienz.
Zu den wichtigsten Verbesserungen in YOLOv5 gehören die Verwendung einer dynamischen Architektur, ein umfangreiches Spektrum an Techniken zur Datenerweiterung, innovative Trainingsstrategien sowie wichtige Anpassungen bei der Verlustberechnung und beim Erstellen der Zielwerte. All diese Innovationen verbessern die Genauigkeit und Effizienz der Objekterkennung erheblich und bewahren zugleich ein hohes Maß an Geschwindigkeit – ein Markenzeichen der YOLO-Modelle.