HyperAI

Entraînement De YOLOv8 Avec Des Données Personnalisées

Dans cet article de blog, nous explorerons les nouvelles fonctionnalités du nouveau modèle d'Ultralytics, YOLOv8, examinerons de plus près les changements architecturaux par rapport à YOLOv5 et démontrerons le nouveau modèle en testant ses capacités d'API Python pour la détection sur notre ensemble de données de basket-ball.

La détection d’objets reste l’un des cas d’utilisation les plus populaires et les plus simples de la technologie de l’IA. Depuis la publication de la première version dans le travail révolutionnaire de Joseph Redman et al. En 2016, « You Only Look Once: Unified, Real-Time Object Detection », la famille de modèles YOLO a été à la pointe de la tendance. Ces modèles de détection d'objets ont ouvert la voie à l'étude de l'utilisation de modèles DL pour effectuer une reconnaissance en temps réel des entités, des sujets et des emplacements dans les images.

Dans cet article, nous allons revisiter les bases de ces techniques, discuter des nouvelles fonctionnalités de la dernière version d'Ultralytics, YOLOv8, et parcourir les étapes pour affiner un modèle YOLOv8 personnalisé à l'aide de RoboFlow et Paperspace Gradient et de la nouvelle API Ultralytics. À la fin de ce didacticiel, les utilisateurs devraient être en mesure d’adapter rapidement et facilement un modèle YOLOv8 à n’importe quel ensemble d’images étiquetées.

Comment fonctionne YOLO ?

source

Tout d’abord, discutons des bases du fonctionnement de YOLO. Voici une courte citation de l’article original de YOLO décomposant la somme des capacités du modèle :

Un réseau convolutif unique prédit simultanément plusieurs boîtes englobantes et leurs probabilités de classe. YOLO est entraîné sur des images complètes et optimise directement les performances de détection. Ce modèle unifié présente plusieurs avantages par rapport aux méthodes traditionnelles de détection d'objets. (source

Comme mentionné ci-dessus, le modèle est capable de prédire l’emplacement de plusieurs entités dans une image et d’identifier son sujet, étant donné qu’il a été formé sur ces caractéristiques. Il le fait en une seule étape en divisant l'image en N grilles, chacune de taille s*s. Ces régions sont analysées simultanément pour détecter et localiser tous les objets qu’elles contiennent. Le modèle prédit ensuite les coordonnées de la boîte englobante B dans chaque cellule de la grille et prédit les étiquettes et les scores de prédiction pour les objets qu'elle contient.

Ultralytics YOLOv5, Classification, Détection d'objets, Segmentation

En mettant tout cela ensemble, nous obtenons une technique capable d’effectuer des tâches de classification d’objets, de détection d’objets et de segmentation d’images. Étant donné que la technique de base de YOLO reste la même, nous pouvons en déduire que cela s’appliquera également à YOLOv8. Pour une analyse plus complète du fonctionnement de YOLO, assurez-vous de consulter nos articles précédents sur YOLOv5 et YOLOv7, nos benchmarks avec YOLOv6 et YOLOv7, ainsi que le document YOLO original.Ici).

Quoi de neuf dans YOLOv8 ?

Étant donné que YOLOv8 vient d'être publié, aucun article n'a encore été publié couvrant ce modèle. Les auteurs ont l'intention de le publier bientôt, mais pour l'instant, nous ne pouvons que suivre la publication officielle, déduire les changements à partir de l'historique des commits et essayer de déterminer par nous-mêmes l'étendue des changements entre YOLOv5 et YOLOv8.

Architecture

Source de l'image :RangeKing

selonSortie officielle, YOLOv8 adopte un nouveau réseau fédérateur, une tête de détection sans ancrage et une fonction de perte. L'utilisateur de Github RangeKing a partagé un aperçu de l'infrastructure du modèle YOLOv8, montrant la structure principale et la structure principale du modèle mises à jour. En comparant ce chiffre avec YOLOv5 , RangeKing dans leurArticlesLes changements suivants ont été identifiés dans :

C2f Module, Source de l'image : RoboFlow (source)

  • Ils utilisent C2f Module remplacé C3 module. exister C2f Dans, de Bottleneck(deux 3×3 avec connexions résiduelles convs) sont connectés ensemble, mais dans C3 Seul le dernier est utilisé Bottleneck Sortir. (source)

La première Conv de chaque version. Source de l'image :RangeKing

  • Ils sont Backbone Utilisez-en un 3x3 Conv Le bloc remplace le premier 6x6 Conv
  • Ils ont supprimé deux Conv(10e et 14e dans la configuration YOLOv5)

Comparaison des deux backbones modèles. Source de l'image :RangeKing

  • Ils sont Bottleneck Utilisez-en un 3x3 Conv Remplacé le premier 1x1 Conv
  • Ils sont passés aux en-têtes découplés et ont supprimé objectness succursales

Veuillez revenir une fois que le document YOLOv8 sera publié, nous mettrons à jour cette section avec plus d'informations. Pour une analyse détaillée des changements ci-dessus, veuillez consulter l'article RoboFlow qui présente YOLOv8 Libérer.

Accessibilité

En plus de l'ancienne méthode de clonage du référentiel Github et de configuration manuelle de l'environnement, les utilisateurs peuvent désormais accéder à YOLOv8 pour la formation et l'inférence à l'aide de la nouvelle API Ultralytics. Veuillez voir ci-dessous Entraîner le modèle section pour plus de détails sur la configuration de l'API.

Pas de boîte englobante d'ancrage

Selon un article de blog du partenaire d'Ultralytics, RoboFlow YOLOv8, YOLOv8 dispose désormais de boîtes englobantes sans ancre. Dans la version initiale de YOLO, les utilisateurs devaient identifier manuellement ces boîtes d'ancrage afin de faciliter le processus de détection d'objets. Ces cadres de délimitation prédéfinis ont une taille et une hauteur prédéterminées, capturant l'échelle et le rapport hauteur/largeur de catégories d'objets spécifiques dans l'ensemble de données. Les décalages entre ces limites et les objets prédits aident le modèle à mieux identifier l’emplacement des objets.

Dans YOLOv8, ces boîtes d'ancrage sont automatiquement prédites au centre de l'objet.

Arrêtez l'augmentation de la mosaïque avant la fin de l'entraînement

À chaque époque d'entraînement, YOLOv8 voit une version légèrement différente de l'image qui lui est fournie. Ces changements sont appelés améliorations. L'un d'eux,Amélioration de la mosaïque, est le processus de combinaison de quatre images ensemble, forçant le modèle à apprendre l'identité des objets dans de nouveaux emplacements où ils sont partiellement bloqués les uns des autres par l'occlusion, avec une plus grande variation dans les pixels environnants. Il a été démontré que l’utilisation de cette augmentation tout au long de la formation peut avoir un effet néfaste sur la précision de la prédiction, donc YOLOv8 peut arrêter ce processus pendant les dernières époques de la formation. Cela permet d'exécuter le meilleur modèle de formation sans passer à l'échelle de l'exécution entière.

Efficacité et précision

Notre principale raison ici est d’améliorer la précision et l’efficacité des performances lors de l’inférence et de la formation. Les auteurs d’Ultralytics nous ont fourni quelques exemples de données utiles que nous pouvons utiliser pour comparer la nouvelle version de YOLO avec d’autres versions. Comme le montrent les graphiques ci-dessus, lors de la formation, YOLOv8 surpasse YOLOv7, YOLOv6-2.0 et YOLOv5-7.0 en termes de précision moyenne, de taille et de latence.

Sur leurs pages Github respectives, nous pouvons trouver un tableau de comparaison statistique des modèles YOLOv8 de différentes tailles. D'après le tableau ci-dessus, nous pouvons voir qu'à mesure que la taille des paramètres, la vitesse et les FLOP augmentent, le mAP augmente également. Le plus grand modèle YOLOv5, YOLOv5x, a une valeur mAP maximale de 50,7. L’augmentation de 2,2 unités de la valeur mAP représente une amélioration significative des capacités. Cela est valable pour toutes les tailles de modèles, le nouveau modèle YOLOv8 surpassant systématiquement le YOLOv5, comme indiqué ci-dessous.

Dans l’ensemble, nous pouvons voir que YOLOv8 est une avancée significative par rapport à YOLOv5 et à d’autres frameworks concurrents.

Réglage fin de YOLOv8

Pour exécuter le didacticiel :Commencez à fonctionner sur OpenBayes

Le processus de réglage fin d’un modèle YOLOv8 peut être divisé en trois étapes : création et étiquetage d’un ensemble de données, formation du modèle et déploiement du modèle. Dans ce tutoriel, nous passerons en revue les deux premières étapes en détail et montrerons comment utiliser notre nouveau modèle sur n'importe quel fichier ou flux vidéo entrant.

Configuration du jeu de données

Nous allons recréer l'expérience YOLOv7 que nous avons utilisée pour comparer les deux modèles, nous reviendrons donc à l'ensemble de données de basket-ball sur Roboflow. Veuillez consulter la section « Configuration d’un ensemble de données personnalisé » de l’article précédent pour obtenir des instructions détaillées sur la configuration de l’ensemble de données, son étiquetage et son extraction de RoboFlow dans notre bloc-notes.

Étant donné que nous utilisons un ensemble de données précédemment créé, il nous suffit maintenant d’extraire les données. Vous trouverez ci-dessous les commandes utilisées pour extraire les données dans l’environnement Notebook. Pour votre propre ensemble de données étiqueté, utilisez le même processus, mais remplacez les valeurs de l'espace de travail et du projet par les vôtres pour accéder à votre ensemble de données de la même manière.

Assurez-vous de modifier la clé API par la vôtre si vous souhaitez suivre la démonstration dans le notebook à l'aide du script ci-dessous.

!pip install roboflow

from roboflow import Roboflow
rf = Roboflow(api_key="")
project = rf.workspace("james-skelton").project("ballhandler-basketball")
dataset = project.version(11).download("yolov8")
!mkdir datasets
!mv ballhandler-basketball-11/ datasets/

Entraîner le modèle

En utilisant la nouvelle API Python, nous pouvons utiliser ultralytics La bibliothèque effectue tout le travail facilement dans l'environnement Gradient Notebook. Nous allons construire à partir de zéro en utilisant la configuration et les poids fournis YOLOv8n Modèle. Nous utiliserons ensuite l’ensemble de données que nous venons de charger dans notre environnement en utilisant model.train() Affiner la méthode.

from ultralytics import YOLO

# 加载模型
model = YOLO("yolov8n.yaml")  # 从头构建新模型
model = YOLO("yolov8n.pt")  # 加载预训练模型(建议用于训练)

# 使用模型
results = model.train(data="datasets/ballhandler-basketball-11/data.yaml", epochs=10)  # 训练模型

Tester le modèle

results = model.val()  # 在验证集上评估模型性能

Nous pouvons utiliser model.val() 方法 Définissez le nouveau modèle à évaluer sur l'ensemble de validation. Cela affichera un joli tableau dans la fenêtre de sortie montrant les performances de notre modèle. Étant donné que nous n'avons été entraînés ici que pendant dix époques, ce mAP relativement faible de 50 à 95 est à prévoir.

À partir de là, soumettre n’importe quelle photo est simple. Il générera des prédictions pour les boîtes englobantes, superposera ces boîtes sur l'image et les téléchargera dans le dossier « runs/detect/predict ».

from ultralytics import YOLO
from PIL import Image
import cv2

# from PIL
im1 = Image.open("assets/samp.jpeg")
results = model.predict(source=im1, save=True)  # 保存绘制的图像
print(results)
display(Image.open('runs/detect/predict/image0.jpg'))

Nous obtenons les prédictions pour les boîtes englobantes et leurs étiquettes comme suit :

[Ultralytics YOLO <class 'ultralytics.yolo.engine.results.Boxes'> masks
type: <class 'torch.Tensor'>
shape: torch.Size([6, 6])
dtype: torch.float32
 + tensor([[3.42000e+02, 2.00000e+01, 6.17000e+02, 8.38000e+02, 5.46525e-01, 1.00000e+00],
        [1.18900e+03, 5.44000e+02, 1.32000e+03, 8.72000e+02, 5.41202e-01, 1.00000e+00],
        [6.84000e+02, 2.70000e+01, 1.04400e+03, 8.55000e+02, 5.14879e-01, 0.00000e+00],
        [3.59000e+02, 2.20000e+01, 6.16000e+02, 8.35000e+02, 4.31905e-01, 0.00000e+00],
        [7.16000e+02, 2.90000e+01, 1.04400e+03, 8.58000e+02, 2.85891e-01, 1.00000e+00],
        [3.88000e+02, 1.90000e+01, 6.06000e+02, 6.58000e+02, 2.53705e-01, 0.00000e+00]], device='cuda:0')]

Appliquez-les ensuite à l’image, comme indiqué dans l’exemple suivant :

Source de l'image originale

Comme nous pouvons le voir, notre modèle léger et entraîné montre qu'il peut identifier les joueurs sur le terrain à partir des joueurs sur le terrain et des joueurs et spectateurs sur la touche, à l'exception d'un coin. Une formation supplémentaire est presque certainement nécessaire, mais il est facile de voir que le modèle acquiert très rapidement une compréhension de la tâche.

Si nous sommes satisfaits de la formation du modèle, nous pouvons alors exporter le modèle dans le format souhaité. Dans ce cas, nous exporterons une version ONNX.

success = model.export(format="onnx")  # 将模型导出为 ONNX 格式

Résumer

Dans ce tutoriel, nous avons exploré les nouvelles fonctionnalités du nouveau modèle puissant d'Ultralytics, YOLOv8, examiné en profondeur les changements architecturaux par rapport à YOLOv5 et testé la fonctionnalité de l'API Python du nouveau modèle en le testant sur notre ensemble de données Ballhandler. Nous avons pu montrer que cela représente une avancée significative dans la simplification du processus de réglage fin du modèle de détection d’objets YOLO et avons démontré la capacité du modèle à distinguer les possessions de balle dans les matchs NBA à l’aide de photos en jeu.