Ce projet Python a pour but de pouvoir reconnaître facilement des visages humain par le biais d'une caméra. Ce projet a été programmer avec l'aide de OpenCV2 et de la librairie Python face_recognition.
Pour pouvoir lancer correctement le script il est nécessaire d'avoir les librairies suivantes Numpy - face_recognition et OpenCv2. Pour les 2 premières librairies il faut lancer la commande suivante dans un terminal :
pip install -r requirements.txt
par la suite il vous faudra installer OpenCv2, dans un terminal lancer la commande suivante:
sudo apt update
sudo apt install python3-opencv
Ensuite il faudra installer cmake
sudo apt install cmake
Remarque: si cela ne marche toujours pas c'est que vous n'avez votre cmake dans vos variables d'environnement.
Tout d'abord pour pouvoir être reconnu par le script, il faut que vous placiez une photo de la personne que vous voulez autorisé.
Maintenant passons au code.
import face_recognition
import cv2
import numpy as np
dans cette section nous importons les différentes librairies nécessaires.
# Prend comme référence la caméra numéro 0 ( celle par défaut )
video_capture = cv2.VideoCapture(0)
# Charge une image et en détermine comment la reconnaitre
biden_image = face_recognition.load_image_file("images/biden.jpg")
biden_face_encoding = face_recognition.face_encodings(biden_image)[0]
dylan_image = face_recognition.load_image_file("images/dylan.png")
dylan_face_encoding = face_recognition.face_encodings(dylan_image)[0]
elon_image = face_recognition.load_image_file("images/elon.jpg")
elon_face_encoding = face_recognition.face_encodings(elon_image)[0]
# Création de tableaux des visages encodés et leurs noms.
known_face_encodings = [
biden_face_encoding,
dylan_face_encoding,
elon_face_encoding
]
known_face_names = [
"Joe Biden",
"Dylan",
"Elon"
]
Dans cette première section on initialise les différentes variables qui nous serviront pour la suite du code.
Premièrement
On définis dois définir qu'on utilise notre caméra et pas seulement une photo. Pour ce faire nous utilisons le périphérique par défaut qui est donc normalement la caméra principale de notre pc.
Par la suite
On charge les images qui vont nous servir à reconnaître les personnes autorisées. Une fois les images chargées, on encode les images pour pouvoir en retirer un tableau de valeur qui détermine les spécificitées de chaque visages. Une fois tout cela fait on place le tout dans des tableaux pour pouvoir mieux les utiliser par la suite.
Dans la deuxième partie va servir pour le traitement de l'image et par la suite afficher l'image complète sur l'écran.
while True:
# Capture une seul frame de la caméra
ret, frame = video_capture.read()
# Réduis la taille du carré de détection d'image ( pour une reconnaisance plus rapide )
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
# Convertissez l'image de la couleur BGR (utilisée par OpenCV) en couleur RVB (utilisée par face_recognition)
rgb_small_frame = small_frame[:, :, ::-1]
# Ne traitez qu'une image sur deux de la vidéo pour gagner du temps
if process_this_frame:
# Trouver tous les visages dans l'image actuelle de la vidéo
face_locations = face_recognition.face_locations(rgb_small_frame)
face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
face_names = []
for face_encoding in face_encodings:
# Voir si le visage correspond au(x) visage(s) connu(s)
matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
name = "Unknown"
# Trouve la similitude entre les visage connus et les visages sur la vidéo.
face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
best_match_index = np.argmin(face_distances)
if matches[best_match_index]:
name = known_face_names[best_match_index]
face_names.append(name)
process_this_frame = not process_this_frame
Enfin on affiche le résultat
# Afficher le résultat
for (top, right, bottom, left), name in zip(face_locations, face_names):
# Redimensionnez les emplacements des visages puisque le cadre dans lequel nous avons détecté a été redimensionné à 1/4 de taille
top *= 4
right *= 4
bottom *= 4
left *= 4
# Dessine un rectangle autour des visages
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
# Desinne un label à côté du rectangle
cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
# Afficher l'image complète
cv2.imshow('Video', frame)
# Pressez la touche 'q' pour quitter
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Libère la caméra
video_capture.release()
cv2.destroyAllWindows()
L'objectif final est de pouvoir mettre le script python dans une petite carte d'electronique embarquée t-elle qu'une raspberry pi pour pouvoir ensuite y connecter une caméra portatif et de pouvoir rendre le projet nomade. Une fois tout ceci assemblé le circuit global sera installé en hauteur au-dessus d'une porte pour pouvoir identifier les personnes qui ne sont pas enregistrées dans la base de donnée ou bien celle qui le sont.