diff --git a/collect_imgs.py b/collect_imgs.py index dfaf01d592bf0353270bbd76501756dd48bdb977..597eee4682c145880fe67f9f5110c375e79d16e7 100644 --- a/collect_imgs.py +++ b/collect_imgs.py @@ -3,30 +3,30 @@ import os import cv2 -DATA_DIR = './data' -if not os.path.exists(DATA_DIR): +DATA_DIR = './data' # Rep de stockage +if not os.path.exists(DATA_DIR): # Création si il n'existe pas os.makedirs(DATA_DIR) -nombre_de_classe = 3 -taille_du_dataset= 100 +nombre_de_classe = 3 #Nombre different d'elements que le modèle devra connaitre +taille_du_dataset= 100 #Nombre d'image d'entrainement pour une classe -cap = cv2.VideoCapture(0) -for j in range(nombre_de_classe): +cap = cv2.VideoCapture(0) #On recupere la caméra +for j in range(nombre_de_classe): # Pour chaque classe je crée un réptoire pour stocker les images if not os.path.exists(os.path.join(DATA_DIR, str(j))): os.makedirs(os.path.join(DATA_DIR, str(j))) print('Collecte image pour la classe {}'.format(j)) done = False - while True: + while True: #Lancement de la vidéo ret, frame = cap.read() cv2.putText(frame, 'Appuyez sur Q :)', (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 255, 0), 3, cv2.LINE_AA) cv2.imshow('frame', frame) - if cv2.waitKey(25) == ord('q'): + if cv2.waitKey(25) == ord('q'): break - counter = 0 + counter = 0 # si il appuye sur Q alors le programme sauvegarde n frame de la vidéo selon la variable taille_du_dateset while counter < taille_du_dataset: ret, frame = cap.read() cv2.imshow('frame', frame) diff --git a/create_dataset.py b/create_dataset.py index cf3aebd9adf4baeb28c7c8eb7bf5923f02e44586..c701aea5bbad87500ce98c7f3da4f9b48243cb8b 100644 --- a/create_dataset.py +++ b/create_dataset.py @@ -6,29 +6,38 @@ import cv2 import matplotlib.pyplot as plt -mp_hands = mp.solutions.hands -mp_drawing = mp.solutions.drawing_utils -mp_drawing_styles = mp.solutions.drawing_styles +# Initialisation des outils de Mediapipe pour la détection des mains +mp_hands = mp.solutions.hands # Module Mediapipe Hands pour la détection des mains +mp_drawing = mp.solutions.drawing_utils # Utilitaire pour dessiner les landmarks des mains +mp_drawing_styles = mp.solutions.drawing_styles # Styles pour afficher les landmarks des mains hands = mp_hands.Hands(static_image_mode=True, min_detection_confidence=0.3) +# Répertoire contenant les images collectées DATA_DIR = './data' -data = [] -labels = [] -for dir_ in os.listdir(DATA_DIR): - for img_path in os.listdir(os.path.join(DATA_DIR, dir_)): - data_aux = [] +# Initialisation des listes pour stocker les données et les labels +data = [] # Contiendra les caractéristiques extraites des images +labels = [] # Contiendra les étiquettes associées aux images - x_ = [] - y_ = [] +# Parcours de chaque classe de gestes (répertoires contenant les images) +for dir_ in os.listdir(DATA_DIR): + for img_path in os.listdir(os.path.join(DATA_DIR, dir_)): # Parcours de toutes les images d'une classe + data_aux = [] # Liste temporaire pour stocker les caractéristiques d'une image + x_ = [] # Liste pour stocker les coordonnées X des landmarks + y_ = [] # Liste pour stocker les coordonnées Y des landmarks + # Lecture de l'image et conversion en format RGB (Mediapipe nécessite le format RGB) img = cv2.imread(os.path.join(DATA_DIR, dir_, img_path)) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + # Détection de la main dans l'image results = hands.process(img_rgb) + + # Vérification si une main a bien été détectée if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: + # Extraction des coordonnées X et Y de chaque point de repère de la main for i in range(len(hand_landmarks.landmark)): x = hand_landmarks.landmark[i].x y = hand_landmarks.landmark[i].y @@ -36,12 +45,14 @@ for dir_ in os.listdir(DATA_DIR): x_.append(x) y_.append(y) + # Normalisation des coordonnées : soustraction du minimum pour centrer les données for i in range(len(hand_landmarks.landmark)): x = hand_landmarks.landmark[i].x y = hand_landmarks.landmark[i].y - data_aux.append(x - min(x_)) - data_aux.append(y - min(y_)) + data_aux.append(x - min(x_)) # Normalisation X + data_aux.append(y - min(y_)) # Normalisation Y + # Ajout des caractéristiques extraites et de l'étiquette associée à l'image data.append(data_aux) labels.append(dir_)