Skip to content

L'analyse Ă  l'aide de Ultralytics YOLOv8

Introduction

Ce guide donne un aperçu complet de trois types fondamentaux de visualisations de données : les graphiques linéaires, les diagrammes à barres et les diagrammes circulaires. Chaque section comprend des instructions étape par étape et des extraits de code sur la façon de créer ces visualisations à l'aide de Python.

Échantillons visuels

Graphique linéaire Tracé des barres Diagramme circulaire
Graphique linéaire Tracé des barres Diagramme circulaire

Pourquoi les graphiques sont-ils importants ?

  • Les graphiques linĂ©aires sont idĂ©aux pour suivre les changements sur des pĂ©riodes courtes ou longues et pour comparer les changements de plusieurs groupes sur la mĂŞme pĂ©riode.
  • Les diagrammes en barres, en revanche, conviennent pour comparer les quantitĂ©s entre diffĂ©rentes catĂ©gories et montrer les relations entre une catĂ©gorie et sa valeur numĂ©rique.
  • Enfin, les diagrammes circulaires sont efficaces pour illustrer les proportions entre les catĂ©gories et montrer les parties d'un tout.

Exemples d'analyses

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="line",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)
total_counts = 0
frame_count = 0

while cap.isOpened():
    success, frame = cap.read()

    if success:
        frame_count += 1
        results = model.track(frame, persist=True, verbose=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            for box in boxes:
                total_counts += 1

        analytics.update_line(frame_count, total_counts)

        total_counts = 0
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
out = cv2.VideoWriter("multiple_line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="line",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
    max_points=200,
)

frame_count = 0
data = {}
labels = []

while cap.isOpened():
    success, frame = cap.read()

    if success:
        frame_count += 1

        results = model.track(frame, persist=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            track_ids = results[0].boxes.id.int().cpu().tolist()
            clss = results[0].boxes.cls.cpu().tolist()

            for box, track_id, cls in zip(boxes, track_ids, clss):
                # Store each class label
                if model.names[int(cls)] not in labels:
                    labels.append(model.names[int(cls)])

                # Store each class count
                if model.names[int(cls)] in data:
                    data[model.names[int(cls)]] += 1
                else:
                    data[model.names[int(cls)]] = 0

        # update lines every frame
        analytics.update_multiple_lines(data, labels, frame_count)
        data = {}  # clear the data list for next frame
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("pie_chart.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="pie",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True, verbose=True)
        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()
            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

            analytics.update_pie(clswise_count)
            clswise_count = {}

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("bar_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="bar",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True, verbose=True)
        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()
            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

            analytics.update_bar(clswise_count)
            clswise_count = {}

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("area_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="area",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}
frame_count = 0

while cap.isOpened():
    success, frame = cap.read()
    if success:
        frame_count += 1
        results = model.track(frame, persist=True, verbose=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()

            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

        analytics.update_area(frame_count, clswise_count)
        clswise_count = {}
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Argument Analytics

Voici un tableau avec les Analytics arguments :

Nom Type DĂ©faut Description
type str None Type de données ou d'objets.
im0_shape tuple None Forme de l'image initiale.
writer cv2.VideoWriter None Objet permettant d'écrire des fichiers vidéo.
title str ultralytics Titre de la visualisation.
x_label str x Étiquette pour l'axe des x.
y_label str y Étiquette pour l'axe des ordonnées.
bg_color str white Couleur d'arrière-plan.
fg_color str black Couleur d'avant-plan.
line_color str yellow Couleur des lignes.
line_width int 2 Largeur des lignes.
fontsize int 13 Taille de la police du texte.
view_img bool False Drapeau pour afficher l'image ou la vidéo.
save_img bool True Drapeau pour enregistrer l'image ou la vidéo.
max_points int 50 Pour plusieurs lignes, le nombre total de points dessinés sur l’image, avant de supprimer les points initiaux.
points_width int 15 Surligneur de la largeur des points de ligne.

Arguments model.track

Nom Type DĂ©faut Description
source im0 None répertoire source pour les images ou les vidéos
persist bool False persistance des pistes entre les images
tracker str botsort.yaml MĂ©thode de suivi 'bytetrack' ou 'botsort'
conf float 0.3 Seuil de confiance
iou float 0.5 Seuil de reconnaissance de dette
classes list None filtre les résultats par classe, c'est-à-dire classes=0, ou classes=[0,2,3]
verbose bool True Affiche les résultats du suivi des objets

Conclusion

Comprendre quand et comment utiliser les différents types de visualisation est crucial pour une analyse efficace des données. Les graphiques linéaires, les diagrammes à barres et les diagrammes circulaires sont des outils fondamentaux qui peuvent t'aider à transmettre l'histoire de tes données de façon plus claire et plus efficace.

FAQ

Comment créer un graphique linéaire à l'aide de Ultralytics YOLOv8 Analytics ?

Pour créer un graphique linéaire à l'aide de Ultralytics YOLOv8 Analytics, suis les étapes suivantes :

  1. Charge un modèle YOLOv8 et ouvre ton fichier vidéo.
  2. Initialise le Analytics avec le type "ligne".
  3. Fais défiler les images vidéo, en mettant à jour le graphique linéaire avec des données pertinentes, telles que le nombre d'objets par image.
  4. Enregistre la vidéo de sortie affichant le graphique linéaire.

Exemple :

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="line", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        total_counts = sum([1 for box in results[0].boxes.xyxy])
        analytics.update_line(frame_count, total_counts)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Pour plus de détails sur la configuration du Analytics visite le site de la classe Analytics en utilisant Ultralytics YOLOv8 📊 section.

Quels sont les avantages de l'utilisation de Ultralytics YOLOv8 pour créer des diagrammes à barres ?

L'utilisation de Ultralytics YOLOv8 pour créer des diagrammes à barres offre plusieurs avantages :

  1. Visualisation des données en temps réel: Intègre de façon transparente les résultats de la détection d'objets dans des diagrammes à barres pour des mises à jour dynamiques.
  2. Facilité d'utilisation: l'API et les fonctions simples permettent de mettre en œuvre et de visualiser facilement les données.
  3. Personnalisation: Personnalise les titres, les étiquettes, les couleurs et plus encore pour répondre à tes besoins spécifiques.
  4. Efficacité: Traite efficacement de grandes quantités de données et mets à jour les tracés en temps réel pendant le traitement des vidéos.

Utilise l'exemple suivant pour générer un diagramme à barres :

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("bar_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="bar", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        clswise_count = {
            model.names[int(cls)]: boxes.size(0)
            for cls, boxes in zip(results[0].boxes.cls.tolist(), results[0].boxes.xyxy)
        }
        analytics.update_bar(clswise_count)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Pour en savoir plus, visite la section Tracé des barres du guide.

Pourquoi devrais-je utiliser Ultralytics YOLOv8 pour créer des diagrammes circulaires dans mes projets de visualisation de données ?

Ultralytics YOLOv8 est un excellent choix pour créer des diagrammes circulaires car :

  1. Intégration avec la détection d'objets: Intègre directement les résultats de la détection d'objets dans les diagrammes circulaires pour une compréhension immédiate.
  2. API conviviale: Simple Ă  mettre en place et Ă  utiliser avec un minimum de code.
  3. Personnalisable: Diverses options de personnalisation pour les couleurs, les Ă©tiquettes et plus encore.
  4. Mises à jour en temps réel: Traite et visualise les données en temps réel, ce qui est idéal pour les projets d'analyse vidéo.

Voici un petit exemple :

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("pie_chart.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="pie", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        clswise_count = {
            model.names[int(cls)]: boxes.size(0)
            for cls, boxes in zip(results[0].boxes.cls.tolist(), results[0].boxes.xyxy)
        }
        analytics.update_pie(clswise_count)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Pour plus d'informations, reporte-toi Ă  la section Graphique en camembert du guide.

Ultralytics YOLOv8 peut-il être utilisé pour suivre les objets et mettre à jour dynamiquement les visualisations ?

Oui, Ultralytics YOLOv8 peut être utilisé pour suivre des objets et mettre à jour dynamiquement les visualisations. Il prend en charge le suivi de plusieurs objets en temps réel et peut mettre à jour diverses visualisations telles que des graphiques linéaires, des diagrammes à barres et des diagrammes circulaires en fonction des données des objets suivis.

Exemple de suivi et de mise à jour d'un graphique linéaire :

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="line", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        total_counts = sum([1 for box in results[0].boxes.xyxy])
        analytics.update_line(frame_count, total_counts)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Pour en savoir plus sur l'ensemble des fonctionnalités, consulte la section sur le suivi.

Qu'est-ce qui différencie Ultralytics YOLOv8 des autres solutions de détection d'objets comme OpenCV et TensorFlow?

Ultralytics YOLOv8 se distingue des autres solutions de détection d'objets comme OpenCV et TensorFlow pour de multiples raisons :

  1. Précision de pointe: YOLOv8 offre une précision supérieure dans les tâches de détection, de segmentation et de classification des objets.
  2. Facilité d'utilisation: L'API conviviale permet une mise en œuvre et une intégration rapides sans codage approfondi.
  3. Performance en temps réel: Optimisé pour une inférence à grande vitesse, adapté aux applications en temps réel.
  4. Applications diverses: Prend en charge diverses tâches, notamment le suivi d'objets multiples, la formation de modèles personnalisés et l'exportation vers différents formats tels que ONNX, TensorRT, et CoreML.
  5. Documentation complète: Une documentation complète et des ressources de blog pour guider les utilisateurs à chaque étape.

Pour des comparaisons et des cas d'utilisation plus détaillés, explore notre blogUltralytics .



Créé le 2024-05-23, Mis à jour le 2024-07-05
Auteurs : glenn-jocher (4), IvorZhu331 (1), RizwanMunawar (3)

Commentaires