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 |
---|---|---|
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 :
- Charge un modèle YOLOv8 et ouvre ton fichier vidéo.
- Initialise le
Analytics
avec le type "ligne". - 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.
- 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 :
- 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.
- Facilité d'utilisation: l'API et les fonctions simples permettent de mettre en œuvre et de visualiser facilement les données.
- Personnalisation: Personnalise les titres, les étiquettes, les couleurs et plus encore pour répondre à tes besoins spécifiques.
- 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 :
- 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.
- API conviviale: Simple Ă mettre en place et Ă utiliser avec un minimum de code.
- Personnalisable: Diverses options de personnalisation pour les couleurs, les Ă©tiquettes et plus encore.
- 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 :
- 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.
- Facilité d'utilisation: L'API conviviale permet une mise en œuvre et une intégration rapides sans codage approfondi.
- Performance en temps réel: Optimisé pour une inférence à grande vitesse, adapté aux applications en temps réel.
- 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.
- 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)