Dans ce projet, j’ai utilisé un modèle YOLOv8 pour détecter et classifier les avions militaires sur des images et des vidéos. L’objectif est de montrer la puissance de l’Object Detection dans le domaine de la Computer Vision, en particulier pour la reconnaissance d’objets complexes et en mouvement, et notament pour des objets ayant des caractéristiques similaires comme les avions militaires.
Le notebook associé à ce projet est disponible sur ce lien Kaggle.
YOLOv8 est un modèle d’Object Detection basé sur le réseau de neurones YOLO (You Only Look Once). Il s’agit de la huitième version de ce modèle, qui a été amélioré pour être plus rapide et plus précis que ses prédécesseurs. Développé par Ultralytics, YOLOv8 offre des améliorations significatives en termes de précision et de vitesse par rapport à ses prédécesseurs.
En utilisant YOLOv8, ce projet vise à démontrer comment les technologies modernes de vision par ordinateur peuvent être appliquées efficacement pour la détection d’objets spécifiques dans des images et des vidéos, contribuant ainsi à des domaines tels que la sécurité et la surveillance aérienne.
Nous disposons d’un riche ensemble de données comprenant 14 500 images, chacune contenant un ou plusieurs avions. Pour chaque image, un fichier CSV associé fournit des annotations détaillées des avions présents, incluant les coordonnées de leurs positions (xmin, ymin, xmax, ymax) ainsi que leur classification.
filename | width | height | class | xmin | ymin | xmax | ymax |
---|---|---|---|---|---|---|---|
000aa01b25574f28b654718db0700f72 | 2048 | 1365 | F35 | 852 | 177 | 1998 | 503 |
000aa01b25574f28b654718db0700f72 | 2048 | 1365 | JAS39 | 169 | 769 | 549 | 893 |
000aa01b25574f28b654718db0700f72 | 2048 | 1365 | JAS39 | 125 | 908 | 440 | 1009 |
000aa01b25574f28b654718db0700f72 | 2048 | 1365 | B52 | 277 | 901 | 1288 | 1177 |
Ces données fournissent une base solide pour entraîner et tester notre modèle YOLOv8, en permettant de reconnaître avec précision divers types d’avions militaires dans des contextes variés.
Voici quelques exemples d’images du dataset utilisé pour entraîner et tester le modèle YOLOv8, avec leurs annotations correspondantes :
Cette image montre un avion C5 Galaxy, un avion de transport militaire lourd utilisé par l’US Air Force. Les avions militaires peuvent avoir des formes et des tailles variées, ce qui rend leur détection et classification difficiles pour les modèles d’Object Detection.
Cette image montre un avion Mirage 2000 qui est un avion de chasse conçu par la société française Dassault Aviation, à la fin des années 1970. Le Mirage 2000 est principalement utilisé par l’Armée de l’Air française qui en a reçu 315 exemplaires, tandis que 286 autres ont été exportés vers huit pays différents.
Dans le set de données, il y a tous types d’images, des images plus ou moins claires, des images avec un ou plusieurs avions, d’autres avec des avions de différentes classes, etc. Cela permet de tester la capacité du modèle à détecter et classifier les avions dans des contextes variés.
Pour entrainer un modèle YOLOv8, il est essentiel de disposer d’un ensemble de données étiquetées, qui servira de base pour l’apprentissage du modèle. Dans ce projet, nous avons utilisé un ensemble de données comprenant 14 500 images d’avions militaires, chacune étant annotée avec les coordonnées
des avions présents et leur classification
.
Avant de commencer l’entraînement, nous avons divisé notre ensemble de données en trois parties distinctes : un ensemble d’entraînement (70%), un ensemble de validation (15%) et un ensemble de test (15%). Cette division nous permet de vérifier la performance du modèle sur des données inédites et de s’assurer qu’il généralise bien aux images qu’il n’a pas encore vues.
graph TD
B1 -->|70%| B[Ensemble d'entraînement]
C1 -->|15%| C[Ensemble de validation]
D1 -->|15%| D[Ensemble de test]
subgraph Ensemble de données
direction LR
B1[████████████████████████████████████████████████████████████████████████████████████████████████████████]
C1[██████████████████]
D1[██████████████████]
end
Un fichier de configuration YAML est créé pour spécifier :
1
2
3
4
5
train: ../data/train.txt
val: ../data/val.txt
test: ../data/test.txt
nc: 3
names: ['F35', 'JAS39', 'B52']
YOLOv8 utilise une architecture de réseau de neurones convolutifs (CNN) avec plusieurs couches :
Chaque couche est conçue pour capturer des informations spécifiques des images et les combiner pour produire des prédictions précises.
Pendant l’entraînement, le modèle passe par les étapes suivantes :
Après l’entraînement, le modèle est évalué sur l’ensemble de test pour mesurer sa performance. Les métriques suivantes sont utilisées pour évaluer la qualité des prédictions :
Ces métriques permettent d’évaluer la capacité du modèle à détecter et classifier les avions militaires avec précision et rappel, tout en minimisant les fausses détections et les faux négatifs.
1
2
3
4
5
6
!yolo val \
model='/kaggle/input/yolov7-military-plane/yolov8-m-best.pt' \
data='/kaggle/working/ultralytics/data/mad.yaml'\
augment \
batch=12 \
imgsz=1280
Ce code est utilisé pour évaluer le modèle sur l’ensemble de validation, en utilisant le modèle entraîné et les paramètres spécifiés dans le fichier de configuration YAML.
Voici les résultats de l’évaluation du modèle sur l’ensemble de validation :
Class | Images | Instances | Box(P) | R | mAP50 | m |
---|---|---|---|---|---|---|
all | 2024 | 3408 | 0.944 | 0.86 | 0.938 | 0.89 |
A10 | 48 | 82 | 0.961 | 0.927 | 0.953 | 0.902 |
A400M | 46 | 67 | 0.938 | 0.866 | 0.951 | 0.883 |
AG600 | 34 | 35 | 0.994 | 1.0 | 0.995 | 0.981 |
AV8B | 37 | 65 | 0.963 | 0.985 | 0.986 | 0.97 |
B1 | 49 | 67 | 0.929 | 0.91 | 0.951 | 0.912 |
B2 | 52 | 68 | 0.95 | 0.844 | 0.96 | 0.855 |
B52 | 50 | 64 | 0.979 | 0.922 | 0.967 | 0.929 |
Be200 | 32 | 35 | 0.981 | 1.0 | 0.995 | 0.928 |
C130 | 93 | 180 | 0.87 | 0.928 | 0.945 | 0.885 |
C2 | 107 | 146 | 0.966 | 0.966 | 0.991 | 0.973 |
C17 | 59 | 88 | 0.9 | 0.82 | 0.927 | 0.844 |
C5 | 50 | 50 | 0.944 | 0.88 | 0.947 | 0.925 |
E2 | 47 | 67 | 0.938 | 0.905 | 0.936 | 0.898 |
E7 | 16 | 18 | 1.0 | 0.976 | 0.995 | 0.974 |
EF2000 | 56 | 84 | 0.929 | 0.726 | 0.885 | 0.832 |
F117 | 35 | 46 | 1.0 | 0.822 | 0.904 | 0.852 |
F14 | 38 | 68 | 0.922 | 0.824 | 0.884 | 0.843 |
F15 | 102 | 196 | 0.9 | 0.934 | 0.957 | 0.914 |
F16 | 135 | 223 | 0.889 | 0.78 | 0.873 | 0.793 |
F18 | 95 | 207 | 0.945 | 0.865 | 0.948 | 0.869 |
F22 | 56 | 90 | 0.905 | 0.842 | 0.918 | 0.893 |
F35 | 113 | 147 | 0.913 | 0.862 | 0.937 | 0.871 |
F4 | 58 | 86 | 0.944 | 0.849 | 0.916 | 0.854 |
JAS39 | 51 | 81 | 0.935 | 0.852 | 0.943 | 0.885 |
MQ9 | 34 | 36 | 0.898 | 0.732 | 0.899 | 0.852 |
Mig31 | 39 | 65 | 0.947 | 0.825 | 0.938 | 0.897 |
Mirage2000 | 30 | 75 | 0.95 | 0.853 | 0.87 | 0.841 |
P3 | 34 | 63 | 0.971 | 0.529 | 0.799 | 0.756 |
RQ4 | 52 | 65 | 0.918 | 0.864 | 0.948 | 0.869 |
Rafale | 59 | 98 | 0.887 | 0.857 | 0.931 | 0.89 |
SR71 | 25 | 42 | 0.896 | 0.786 | 0.955 | 0.887 |
Su34 | 48 | 62 | 0.937 | 0.871 | 0.953 | 0.907 |
Su57 | 41 | 72 | 0.971 | 0.929 | 0.979 | 0.945 |
Tu160 | 40 | 54 | 0.959 | 0.926 | 0.97 | 0.921 |
Tu95 | 26 | 36 | 0.965 | 0.758 | 0.91 | 0.877 |
Tornado | 43 | 63 | 0.961 | 0.774 | 0.924 | 0.882 |
U2 | 38 | 44 | 0.976 | 0.934 | 0.987 | 0.956 |
US2 | 84 | 90 | 0.981 | 0.944 | 0.981 | 0.942 |
V22 | 68 | 100 | 0.988 | 0.847 | 0.947 | 0.853 |
XB70 | 20 | 20 | 0.98 | 0.9 | 0.938 | 0.88 |
YF23 | 13 | 18 | 0.968 | 0.833 | 0.953 | 0.941 |
Vulcan | 46 | 69 | 0.961 | 0.754 | 0.911 | 0.851 |
J20 | 47 | 76 | 0.906 | 0.776 | 0.896 | 0.856 |
Globalement, les métriques montrent que le modèle a une bonne précision (0.944) et un bon rappel (0.86). Les valeurs de mAP50 et mAP50-95 indiquent une performance élevée pour la plupart des classes d’avions, avec des scores proches ou supérieurs à 0.9, ce qui démontre l’efficacité du modèle à détecter les avions dans les images. Il est important de noter que certaines classes ont des scores plus bas, ce qui peut être dû à des variations dans les données d’entraînement ou à des caractéristiques spécifiques des avions. Ces résultats peuvent être utilisés pour améliorer le modèle en ajustant les hyperparamètres ou en collectant davantage de données pour les classes sous-représentées.
Après l’entraînement et la validation du modèle, nous pouvons le tester sur des images réelles pour évaluer sa performance en conditions réelles. Voici un exemple de code pour tester le modèle sur quelques images du dataset test :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from ultralytics import YOLO
import cv2
import matplotlib.pyplot as plt
import glob
import random
import pandas as pd
# Charger le modèle YOLO
model = YOLO('/kaggle/input/yolov7-military-plane/yolov8-m-best.pt')
# Chemins vers les images et annotations de test
test_image_paths = sorted(glob.glob('/kaggle/working/ultralytics/data/test/images/*.jpg'))
test_annotation_paths = sorted(glob.glob('/kaggle/working/ultralytics/data/test/labels/*.txt'))
# Sélectionner quelques images aléatoires
sampled_indices = random.sample(range(len(test_image_paths)), 5)
sampled_image_paths = [test_image_paths[i] for i in sampled_indices]
sampled_annotation_paths = [test_annotation_paths[i] for i in sampled_indices]
# Faire des prédictions sur les images sélectionnées
results = model(sampled_image_paths)
for img_path, ann_path, result in zip(sampled_image_paths, sampled_annotation_paths, results):
image = cv2.imread(img_path)[:, :, ::-1]
plt.figure(figsize=(10, 10))
plt.imshow(image)
ax = plt.gca()
# Lire et afficher les annotations réelles
with open(ann_path, 'r') as f:
annotations = f.readlines()
print(f"Annotations réelles pour {img_path}:")
for annotation in annotations:
class_num, x_center, y_center, b_width, b_height = map(float, annotation.split())
class_name = model.names[int(class_num)]
print(f"Classe: {class_name}")
# Afficher les prédictions du modèle
for box in result.boxes:
x1, y1, x2, y2 = box.xyxy[0].cpu().numpy() # Déplacer les tenseurs vers la CPU et les convertir en numpy
rect = plt.Rectangle((x1, y1), x2 - x1, y2 - y1, fill=False, color='red')
ax.add_patch(rect)
plt.text(x1, y1, model.names[int(box.cls[0])], color='white', fontsize=12, bbox=dict(facecolor='red', alpha=0.5))
plt.axis('off')
plt.show()
Ce code charge le modèle YOLOv8 entraîné, sélectionne quelques images aléatoires du dataset test, fait des prédictions sur ces images et affiche les résultats. Les annotations réelles sont également affichées dans des prints pour comparer les prédictions du modèle avec les vérités terrain.
En plus des images du dataset test, nous pouvons également tester le modèle sur des images hors échantillon pour évaluer sa capacité à généraliser à de nouvelles données. J’ai choisi une image de Rafale sur google image pour tester le modèle.
Voici l’image de Rafale utilisée pour le test et la prédiction du modèle :
On peut voir que le modèle a correctement détecté et classifié les deux avions Rafale dans l’image, avec des boîtes englobantes précises et des prédictions de classe correctes.
En plus des images, le modèle YOLOv8 peut également être utilisé pour détecter des avions dans des vidéos. J’ai testé le modèle sur une vidéo de présentation du Rafale sur YouTube. Voici le lien de la vidéo : Rafale Video
Après avoir téléchargé la vidéo, j’ai extrait des images de la vidéo à intervalles réguliers et utilisé le modèle YOLOv8 pour détecter les avions dans chaque image. Voici un exemple de code pour détecter les avions dans une vidéo :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import cv2
import numpy as np
from ultralytics import YOLO
F22_video_path = "/kaggle/input/videos/F-22 Raptor with Wall of Fire - Dayton Air Show 72323.mp4"
def process_video(video_path, output_path):
cap = cv2.VideoCapture(video_path)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
new_width = 640
new_height = int(new_width * height / width)
fourcc = cv2.VideoWriter_fourcc(*'VP90') # mp4v pour un format mp4
out = cv2.VideoWriter(output_path, fourcc, fps, (new_width, new_height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
resized_frame = cv2.resize(frame, (new_width, new_height))
results = model(resized_frame)
annotated_frame = results[0].plot()
out.write(annotated_frame)
cap.release()
out.release()
output_path = '/kaggle/working/annotated_F22_video.mp4'
process_video(F22_video_path, output_path)
Voici un exemple de la vidéo annotée avec les détections de YOLOv8 :
La vidéo montre les détections de YOLOv8 sur la vidéo de présentation du Rafale, avec des boîtes englobantes et des prédictions de classe pour chaque avion détecté. Le modèle est capable de détecter les avions en mouvement dans la vidéo, démontrant sa capacité à traiter des séquences vidéo en temps réel.
Cependant, nous pouvons observer que le modèle a parfois des difficultés à détecter les avions lorsqu’ils sont partiellement cachés ou vus de dos. Par exemple, dans la vidéo, le modèle a du mal à détecter les avions Rafale lorsqu’ils sont vus de dos, il a tendance à les confondre avec d’autres avions, notamment avec l’EF2000 et le Tornado.
Cela souligne l’importance de la qualité des données d’entraînement et de la diversité des exemples pour améliorer la performance du modèle dans des conditions variées.
Nous pouvons essayer le modèle sur une autre vidéo où la visibilité des avions est moins bonne pour voir si le modèle arrive à les détecter.
Ceci est un exemple de vidéo annotée avec les détections de YOLOv8 sur une vidéo de présentation du F22. Le modèle a plutôt bien réussi à détecter l’avion dans la vidéo, mais il a rencontré des difficultés à classifier l’avion correctement. Il semble que le modèle ait confondu le F22 avec d’autres avions, notamment le F35. Cela peut être dû à des similitudes dans les caractéristiques visuelles des avions ou à des variations dans les données d’entraînement.
Dans ce projet, j’ai utilisé un modèle YOLOv8 pour détecter et classifier les avions militaires sur des images et des vidéos. Le modèle a été entraîné sur un ensemble de données comprenant 14 500 images d’avions militaires, avec des annotations détaillées pour chaque image.
Après l’entraînement et la validation, le modèle a montré de solides performances en termes de précision et de rappel, avec des scores élevés pour la plupart des classes d’avions. Les tests sur des images et des vidéos réelles ont également démontré que le modèle est capable de détecter les avions dans des conditions variées, bien qu’il puisse parfois rencontrer des difficultés avec des avions partiellement cachés ou lorsqu’ils sont capturés sous des angles inhabituels.