Vous êtes sur la page 1sur 8

Vision appliquée pour la Robotique

Majeure ROBIA

/ module VISION
2023/2024

TP 3
Détection d'images par
Deeplearning.

Mise en oeuvre de Yolo


Partie 1 : Prise en main de yolo dans le module dnn d’opencv
L'idée est de prendre en main le code disponible sous le e-campus

Question 1.1 : Quelles sont les classes reconnues par le réseau ? tester sur au moins
20 images par classes (conserver ces images et les déposer sur le ecampus). Tester
les 2 réseaux yolo et tiny-yolo
Le réseau reconnait 80 classes.

Yolo :
Yolo-Tiny :

Question 1.2 : A quoi sert le ou les thresholds ?


On a deux thresholds :

- Le premier est le seuil de confiance, qui est utilisé pour filtrer les prédictions de l'algorithme de
détection d'objets en fonction de la confiance du modèle dans ces prédictions. Il spécifie la
probabilité minimale requise pour qu'un objet soit considéré comme détecté. On a dans notre code
un threshold de 0.2, il faut donc que la confiance soit supérieure à 20%.

- Le second est le seuil de suppression non maximale (NMS), qui est utilisé pour éliminer les boîtes
englobantes redondantes (celles qui se chevauchent.) Le seuil correspond au chevauchement
minimum à partir duquel la box avec la plus basse confiance est supprimée. Cela évite de détecter
plusieurs fois le même élément.

Question 1.3 : Quels sont les fichiers utilisés liés au réseau de neurones, que
contiennent ils précisément ?
On a 3 fichiers utilisés qui sont liés au réseau de neurones :

- yolov3.weights : Il contient les poids du modèle YOLOv3 pré-entrainé précédemment, qui sont utilisés
pour les opérations de convolution et toutes les opérations nécessaires à la détection d’objets.

- Yolov3.cfg : Il contient la configuration du réseau de neurones, en spécifiant toutes les couches, les
hyperparamètres, les fonctions d’activations et tout ce qui va servir à définir l’architecture du réseau.

- Coco.names : C’est le fichier texte qui contient le nom de toutes les classes que le réseau de neurones
peut détecter.
Question 1.4 : Quelle est l’architecture du réseau yolov3 et yolov3 tiny, expliquer les
différentes couches du réseau. Lesquelles dépendent du nombre de classes ?
On a une série de couches de convolutions et des couches de max-pooling qui permettent d’extraire des
caractéristiques de l’image à différentes échelles.

Les couches yolo effectuent la détection d'objets. Chaque couche yolo prédit les boîtes englobantes et les
classes pour un ensemble spécifique d'anchors (ancres). Les anchors sont des tailles de boîtes prédéfinies qui
sont utilisées pour prédire les boîtes englobantes. On a deux couches YOLO.

Les paramètres de la couche yolo qui dépendent du nombre de classes sont :

- classes : Le nombre total de classes (dans notre cas, classes=80 indique qu'il y a 80 classes différentes
que le modèle peut détecter).

- filters : Le nombre de filtres dans la dernière couche de chaque ensemble YOLO. Pour les deux
ensembles YOLO, le nombre de filtres est 255. Cela inclut les coordonnées des boîtes englobantes, la
confiance et les probabilités de classe pour chaque anchor.

La couche route combine les sorties de deux couches différentes. Par exemple, route layers = -4 signifie que
les données sont concaténées avec les sorties de la 4ème couche en arrière.

La couche upsample effectue une opération de suréchantillonnage pour augmenter la résolution spatiale des
données.

Les couches shortcut ajoutent les sorties de certaines couches précédentes aux sorties de certaines couches
ultérieures. Cela permet au réseau d'apprendre des représentations plus riches et complexes en utilisant des
informations des couches précédentes sans que ces informations soient diluées au fur et à mesure qu'elles
passent à travers les couches ultérieures.

Question 1.5 : Est-ce que vous trouvez d’autres modèles pré entrainés proposés au
téléchargement ? Si oui tester les
Non, je n’en ai pas trouvé.
Partie 2 : Interfaçage Python
Question 2.1 : On désire une option pour n'afficher qu'une liste de classe configurée
en ligne de commande et mettre en place des boîtes englobantes avec un effet de
transparence ou équivalent pour mettre les objets détectés en surbrillance ou
équivalents. Adapter le code pour travailler sur un flux webcam ou des images (En
changeant la ligne de commande).
Mettre le code commenté ici.

On récupère d’abord la liste des classes voulues

arguments = sys.argv[1:] # Stocke les arguments dans un tableau


if len(arguments) > 0:
print("Arguments passés en ligne de commande :")
print(arguments)
else:
print("Aucun argument n'a été passé en ligne de commande.")
On vérifie lors de l’affichage que les éléments à afficher sont les bons.

# Draw bounding boxes and labels on the image


for i in indices:
#i = i[0]
x, y, w, h = boxes[i]
if len(arguments) > 0: # On vérifie qu'il y a des arguments
if classes[class_ids[i]] in arguments :
label = str(classes[class_ids[i]])
confidence = confidences[i]
color = (0, 255, 0) # Green color for the bounding box
cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
cv2.putText(image, f"{label} {confidence:.2f}", (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
else:
label = str(classes[class_ids[i]])
confidence = confidences[i]
color = (0, 255, 0) # Green color for the bounding box
cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
cv2.putText(image, f"{label} {confidence:.2f}", (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
Partie 3 : Préparation à l’entraînement votre propre
classifier
L'idée est maintenant de comprendre comment créer votre propre réseau. L’objectif est de créer votre
classifier sur 3 ou 4 classes (à vous de choisir parmi les objets proposés ou autres). Il faut prévoir idéalement
dans les 200 images labélisées par classe (ne pas hésiter à mixer les fonds et les éclairages) mais on peut avoir
des performances correctes à partir de 40.

Question 3.1
On utilisera le processus suivant :

S’inscrire sur roboflow

• Créer le dataset et le labéliser sur roboflow

• Vous exporterez à la fin le dataset au format yolo et au format tensorflow. Que contienne ses
archives ? (Vous rendrez ces fichiers sur le e-campus)

On trouve dans les archives du dataset les images qui ont servi pour l’entrainement, les images qui servent à
la validation ainsi que les images de tests, ainsi que leurs annotations respectives.

• Vous pourrez ensuite lancer l’apprentissage sur roboflow (vous avez 3 crédits associés à la création
de votre compte). Tester le résultat ? Etes-vous satisfait du résultat, expliquer pourquoi et comment
vous tester.

Non, car le mAP, la Precision et le Recall ne sont pas exceptionnels (environ 70%). Les images ne sont peut-
être pas assez spécifiques, et le dataset pas assez grands (40 images par classe)

• Comment peut-on récupérer le réseau généré ? Comment l’utiliser ? Pourquoi ce choix ?

On ne peut malheureusement pas récupérer le réseau généré, mais il est possible d’utiliser ce réseau à travers
une API. Ce choix a été fait pour forcer les gens à utiliser des jetons pour réaliser l’inférence à travers
roboflow.

• On procédera ensuite à l’export du dataset sous ultralytics puis au training en utilisant le format
YOLOv5lu.

• On testera le résultat sur le site, est ce meilleur ou moins bon que le résultat de roboflow ?

On a une meilleure précision (0.85), c’est un meilleur résultat. Au vu des métrics, la précision serait encore
meilleure en allant au-delà des 100 epochs.

• Dans les options de déploiement de ultralytics, on pourra ensuite générer et télécharger le format
onnx.
• Vous pourrez finalement le tester sous opencv directement. En utilisant le code d’exemple fourni sur
le e-campus. Vous devrez en particulier trouver une solution pour récupérer le nom de vos
classes, expliquer comment ?

Cela est-il fonctionnel, comment procéder à des tests ? Êtes-vous satisfaits ?

Joindre le code et les commandes d’appels, inclure des copies d’écran

Question 3.1 (Bonus)

Il est ensuite demandé de repartir de votre code de la question 2 et de l’adapter en changeant le minimum de
chose pour utiliser votre réseau onnx. Expliquer les modifications qui ont dû être faite et inclure votre
code

Joindre le code et les commandes d’appels, inclure des copies d’écran

Pour info, suite à un bug bientôt corriger du module dnn , seul le yolov5lu semble être reconnu au format onnx
sous opencv. Si il vous reste du temps vous pourrez tester d’autre format pour m’indiquer si ils sont
fonctionnelles

Vous aimerez peut-être aussi