Whatsapp Telegram Telegram Call Anrufen

Wie YOLO funktioniert


YOLO (You Only Look Once) ist ein revolutionärer Ansatz zur Objekterkennung, der es ermöglicht, Objekte in Bildern und Videos in Echtzeit zu erkennen. Im Folgenden werden die wichtigsten Konzepte und Mechanismen von YOLOv8 erläutert:

1. Bildraster und Begrenzungsrahmen (Bounding Boxes)

YOLO unterteilt das Eingabebild in ein Raster von Zellen. Jede Zelle ist dafür verantwortlich, Objekte zu erkennen, deren Mittelpunkt in diese Zelle fällt. Jede Zelle macht Vorhersagen für Begrenzungsrahmen (Bounding Boxes) und ihre Zuversichtswerte (Confidence Scores).

Beispiel: Angenommen, wir haben ein 416x416 Bild, das in ein 13x13 Raster aufgeteilt wird. Jede Zelle im Raster macht Vorhersagen über:

  • Die Position der Bounding Boxes (x, y)
  • Die Größe der Bounding Boxes (w, h)
  • Den Zuversichtswert, der angibt, wie sicher das Modell ist, dass eine Box ein Objekt enthält
  • Die Wahrscheinlichkeit, dass das Objekt einer bestimmten Klasse angehört
import torch
from ultralytics import YOLO

# Laden Sie das YOLOv8-Modell
model = YOLO('yolov8.pt')

# Laden Sie das Bild
image = cv2.imread("image.jpg")

# Vorhersage
results = model.predict(image)

# Ausgabe der Ergebnisse
results.show()

Ausgabe: Das Bild wird angezeigt, wobei die erkannten Objekte mit Bounding Boxes und Klassenbeschriftungen markiert sind.

2. Intersection Over Union (IoU)

IoU ist eine Metrik, die verwendet wird, um die Überlappung zwischen zwei Bounding Boxes zu berechnen. Es ist das Verhältnis der Fläche des Schnittpunkts der Boxen zur Fläche der Vereinigung der Boxen. IoU-Werte liegen zwischen 0 und 1, wobei 1 eine vollständige Überlappung bedeutet.

Formel: IoU=Fla¨che des SchnittpunktsFla¨che der Vereinigung\text{IoU} = \frac{\text{Fläche des Schnittpunkts}}{\text{Fläche der Vereinigung}}

Beispiel: Angenommen, wir haben zwei Bounding Boxes:

  • Box A: (x1, y1, x2, y2) = (100, 100, 200, 200)
  • Box B: (x1, y1, x2, y2) = (150, 150, 250, 250)

Die IoU wird wie folgt berechnet:

def calculate_iou(boxA, boxB):
    xA = max(boxA[0], boxB[0])
    yA = max(boxA[1], boxB[1])
    xB = min(boxA[2], boxB[2])
    yB = min(boxA[3], boxB[3])

    interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)
    boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)
    boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1)

    iou = interArea / float(boxAArea + boxBArea - interArea)
    return iou

boxA = [100, 100, 200, 200]
boxB = [150, 150, 250, 250]
iou = calculate_iou(boxA, boxB)
print("IoU:", iou)

Ausgabe: IoU: 0.14285714285714285

3. Non-Maximum Suppression (NMS)

NMS ist eine Technik, die verwendet wird, um mehrere überschneidende Bounding Boxes für dasselbe Objekt zu reduzieren. Der Prozess wählt die Box mit dem höchsten Zuversichtswert aus und unterdrückt alle anderen Boxen, deren IoU-Wert mit dieser Box über einem bestimmten Schwellenwert liegt.

Beispiel:

import numpy as np

def non_maximum_suppression(boxes, scores, iou_threshold):
    indices = np.argsort(scores)[::-1]
    keep = []

    while len(indices) > 0:
        current = indices[0]
        keep.append(current)
        rest = indices[1:]

        suppress = []
        for i in rest:
            if calculate_iou(boxes[current], boxes[i]) > iou_threshold:
                suppress.append(i)

        indices = [i for i in rest if i not in suppress]

    return keep

# Beispiel-Boxen und Scores
boxes = [[100, 100, 200, 200], [150, 150, 250, 250], [120, 120, 220, 220]]
scores = [0.9, 0.8, 0.75]

# NMS anwenden
iou_threshold = 0.3
kept_indices = non_maximum_suppression(boxes, scores, iou_threshold)
print("Behaltene Boxen:", [boxes[i] for i in kept_indices])

Ausgabe: Behaltene Boxen: [[100, 100, 200, 200], [150, 150, 250, 250]]

4. Ankerboxen

Ankerboxen sind vordefinierte Bounding Boxes mit unterschiedlichen Seitenverhältnissen und Größen, die als Referenz für die Vorhersagen des Modells dienen. YOLOv8 verwendet diese Ankerboxen, um die Vorhersagen der Bounding Boxes zu verbessern.

Beispiel:

# Beispielhafte Definition von Ankerboxen
anchor_boxes = [
    [116, 90], [156, 198], [373, 326],  # Große Ankerboxen
    [30, 61], [62, 45], [59, 119],      # Mittlere Ankerboxen
    [10, 13], [16, 30], [33, 23]        # Kleine Ankerboxen
]

# Ein Beispielbild
image = np.zeros((416, 416, 3), dtype=np.uint8)

# Zeichnen der Ankerboxen auf das Bild
for (w, h) in anchor_boxes:
    x_center = image.shape[1] // 2
    y_center = image.shape[0] // 2
    x1 = x_center - w // 2
    y1 = y_center - h // 2
    x2 = x_center + w // 2
    y2 = y_center + h // 2
    cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)

# Anzeigebild mit Ankerboxen
cv2.imshow("Image with Anchor Boxes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()


Ausgabe: Das Bild zeigt die verschiedenen Ankerboxen, die in der Mitte des Bildes gezeichnet sind.

Fazit

YOLOv8 ist ein leistungsfähiges Modell für die Echtzeit-Objekterkennung. Durch die Verwendung von Bildraster und Bounding Boxes, Intersection Over Union (IoU), Non-Maximum Suppression (NMS) und Ankerboxen wird eine effiziente und genaue Objekterkennung ermöglicht. Die oben genannten Beispiele und Erklärungen bieten einen tiefen Einblick in die Funktionsweise von YOLOv8.


CEO Image

Ali Ajjoub

info@ajjoub.com

Adresse 0049-15773651670

Adresse Jacob-winter-platz,1 01239 Dresden

Buchen Sie jetzt Ihren Termin für eine umfassende und individuelle Beratung.

Termin Buchen

Kontaktieren Sie uns

Lassen Sie uns K o n t a k t aufnehmen!