Détection d’avions militaires sur des images et vidéos à l’aide de YOLOv8

Introduction

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

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.

Caractéristiques Principales de YOLOv8
Avantages de YOLOv8

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.

Dataset

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.

Exemple de Fichier CSV
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.

Exemple d’Images du Dataset

Voici quelques exemples d’images du dataset utilisé pour entraîner et tester le modèle YOLOv8, avec leurs annotations correspondantes :

C5

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.

Mirage2000

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.

Entrainement du modèle

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.

Train Validation Test Split

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

Etapes de l’Entrainement

1. Configuration du Modèle

Un fichier de configuration YAML est créé pour spécifier :

Exemple de configuration :
1
2
3
4
5
train: ../data/train.txt
val: ../data/val.txt
test: ../data/test.txt
nc: 3
names: ['F35', 'JAS39', 'B52']

2. Architecture du Modèle

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.

3. Processus d’Entraînement

Pendant l’entraînement, le modèle passe par les étapes suivantes :

Validation du Modèle

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.

Voici un exemple de code pour évaluer le modèle sur l'ensemble de test :
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 :

Résultats de l'évaluation du modèle
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.

Test du modèle sur des images

Test sur dataset test

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.

Test sur images réelles

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 :

Rafale

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.

Test du modèle sur des vidéos

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.

Conclusion

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.