- MEKONGO ABANDA Yannick - IT5 ILC
- TONFE TCHATAT DAPHNIE - IT5 ILC
NB : Pour tester l'agorithme, vous aurez besoin de récupérer le modèle enregistré en cliquant sur --> : model_with_25_epoch.model
Ce projet avait pour objectif principal de nous familiariser avec les concepts d’apprentissage automatique, dans le domaine de l’intelligence artificiel. Il était question pour nous de concevoir un algorithme de détection du port de masque. Cet algorithme devait donc être capable de détecter si un individu porte bien son masque, porte mal ou ne porte pas de masque. Avant de présenter notre travail, il est important de présenter les outils/Framework que l’on a utilisé pour arriver à la solution finale.
Les trois scripts python utilisés sont :
- classification.py : Notre script à exécuter pour le lancement de l'algorithme. c'est dans ce script que s'effectue notre entraînement
- live_detection.py : C'est via ce script que se lance la prédiction temps réel .Il se lance à partir du fichier ci dessus.
- (extractXmlToDataset.py) : qui permet de classifier notre Dataset en parcourant les annotations des images et en sauvegardant chaque visage dans son dossier correspondant. Vous pouvez retrouver un exemple d'une image et son annotation (extension .xml) dans le dossier "images".
- Pour la préparation et l’entraînement de notre modèle nous avons utilisé KERAS + TensorFlow :
- Pour la détection des visages nous avons utilisés CaffeModell via openCV :
Nous avons opté pour une classification de nos données. A la base nous avions un dossier image contenant des images et leur annotations respectives en .xml. Ainsi nous avons écrit un script python (extractXmlToDataset.py) qui parcours les annotations (.XML), récupère les données de visages associées (et leur label) à l’image correspondante à celle-ci, puis sauvegarde chaque visage en tant qu’image avec pour nom son label + un numéro d’itération. Ainsi on a des données moins volumineuses dans notre espace de stockage. A la fin nous avons donc 03 sous-dossiers (mask_weared_incorrect, with_mask et without_mask) contenant les visages correspondants. A noter que les visages ont pour taille 224x224
Dans un dossier nommé « dataset » nous avons 03 classes donc 03 dossiers :
-
Mask_weared_incorrect
-
With_mask
-
Without_mask
Nous avons défini quelques paramètres pour le chargeur :
· Batch_size = 32
· Dimensions de l’image = 224x224
· Nous avons utilisé une séparation de validation lors du développement de notre modèle.
· Nous utilisons 80% des images pour la formation et 20% pour la validation.
train_ds =tf.keras.preprocessing.image_dataset_from_directory( # Nos paramètres d'entrainement
dataset_dir,
validation_split=0.2,
subset="training",
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
val_ds = tf.keras.preprocessing.image_dataset_from_directory( # Nos paramètres de validation
dataset_dir,
validation_split=0.2,
subset="validation",
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
Nous générons un petit échantillon de nos données d’entraînement pour vérifier que chaque image est bien identifiée par son label :
Après avoir eu plusieurs tentatives d’entrainement nous avons opté pour l’augmentation des données et le dropOut :
- Statistiques sans augmentation des données et sans DropOut : Regardez l’image ci-dessous, on remarque que notre modèle n’est pas tout à fait au point car la précision de l’entrainement et de la validation sont largement faussées.
-
Statistiques après augmentation des données et sans DropOut Après avoir fait du surraprentissage à savoir l’augmentation des données et le dropOut on remarque que notre entraînement produit de bons résultats. Déjà l'augmentation des données se présente comme suit:
data_augmentation = keras.Sequential( [layers.experimental.preprocessing.RandomFlip("horizontal", input_shape (img_height, img_width, 3)), layers.experimental.preprocessing.RandomRotation(0.1), layers.experimental.preprocessing.RandomZoom(0.1), ] )
On obtient un résulatat tout à fait correct :
Nous avons pu tester la prédiction de notre modèle en temps réel puis avec une image statique :
Voici quelques exemples de résultats :