Système de surveillance d'examen en ligne
un projet d'Iot ou on devais créer et développer un système de détection de tricherie d'examen en ligne. Notre idée étais d'abord d'importer et de développer des programme python qu'on a importer sur internet et puis le essayer et les modifier sur Jupiter netbook. puis on a essayer de faire une reconnaissance du candidat avec son nom et prénom ainsi que les objet auteur de lui.
et enfin on a voulu créer une connexion entre la montre et le telephone qu'on pose sur la main et le franc (une tache qu'on a pas vrament reussi a faire).
Slides & Videos
Members
Name | Contribution |
---|---|
Nabil Bensafia | Reconnaissance faciale. installation des déférente bibliothèques sur Jupiter netbook (python). Head pose estimation avec un repère OXYZ. |
OUMOUHAND Lounis | Identification du l'étudiant avec son nom et prénom en temp réel. reconnaissance d'un visage avec ses mouvements. |
State of the Art
Business Aspect
Technical Aspect
On se plonge à présent dans la recherche et l’avancée concernant les
solutions de surveillance d’un examen en ligne. En faisant des recherches sur
ResearchGate, on retrouve l’article ‘Automated Online Exam Proctoring’,
réalisé par Atoum, Chen, Liu et Hsu et Xioming Liu de l’Université de Michigan.
Ils proposent un système de surveillance entièrement automatisé
(contrairement aux solutions présentées précédemment qui requièrent une
intervention humaine pour valider ou non le bon déroulement de l’examen). Le
système est composé d’une caméra (de l’ordinateur), d’un microphone et
d’une autre caméra qui filme la pièce. Il est basé sur la vérification de
l’utilisateur, de la détection du texte et de la voix, du regard, de la vérification
des fenêtres ouvertes sur l’ordinateur et de la détection de téléphone. Ils
évaluent leur système grâce à un dataset généré par 24 personnes qui trichent
de diverses manières pendant un examen en ligne. Ils démontrent un taux de
réussite de leur modèle de 87%.
On retrouve un autre article : ‘An intelligent system for online exam
monitoring’ publié en 2016 par Pratish, Narayanan et Bijalani. Ils utilisent la
caméra de l’ordinateur ainsi que son micro et l’écran du candidat. Ils évaluent
le degré de l’angle du visage du candidat (head pose) et se basent aussi sur le
son ainsi que sur l’écran pour voir si le candidat triche ou non. D’après les
chercheurs, leurs résultats d’expérience ont montré une meilleure efficacité
que les systèmes existants déjà en 2016.
Il existe peu d’études qui ont réalisé un système de surveillance
d’examen entier (de l’authentification, à la détection, …). Cependant, les
systèmes réalisés par les chercheurs sont efficaces et coutent moins chers que
les systèmes présents sur le marché : ils ne nécessitent pas d’intervention
humain.
Project Description
Problem Definition
Et on a aussi rencontré des problèmes lors de l'installation des d'efférente bibliothèques qu'on avais besoin pour la reconnaissance faciale et la détections des objets.
On a pas réussi aussi a faire la connexion entre la téléphone et la montre connecter, on voulais et essayer de le faire avec des sockets en java mais malheureusement on a pas réussi a le faire.
Challenges & Motivation
Apres plusieurs tentative on a réussi a installer les bibliothèques qu'on a utiliser dans notre projet.
Real and Complete Usecases
p
Technical Description
–
Hardware
Materials
Image | Name | Part Number | Price | Count | Link |
---|---|---|---|---|---|
Jupiter netbook | 0 | 0 | 0 | 🛒 |
Schematic
Software
Arduino Code
# On importe les librairies necessaires import face_recognition import numpy as np from PIL import Image, ImageDraw from IPython.display import display # Voici un exemple d'exécution de la reconnaissance faciale sur une seule image # et dessiner une boîte autour de chaque personne identifiée. # Charger un exemple d'image et apprenez à le reconnaître. #lounis_OUMOHAND Lounis_OUMOHAND = face_recognition.load_image_file(r"C:\Users\oumoh\Downloads\Lounis.jpg") Lounis_face_encoding = face_recognition.face_encodings(Lounis_OUMOHAND)[0] #Nabil_BENSAFIA Nabil_BENSAFIA = face_recognition.load_image_file(r"C:\Users\oumoh\Downloads\nabil.png") Nabil_face_encoding = face_recognition.face_encodings(Nabil_BENSAFIA)[0] # Créer des tableaux d'encodages de visage connus et leurs noms known_face_encodings = [ Lounis_face_encoding, Nabil_face_encoding ] known_face_names = [ "Lounis OUMOHAND", "Nabil BENSAFIA" ] print('Learned encoding for', len(known_face_encodings), 'images.') # Charger une image avec un visage inconnu unknown_image = face_recognition.load_image_file(r"C:\Users\oumoh\Downloads\lounes.jpg") # Trouver tous les visages et encodages de visage dans l'image inconnue face_locations = face_recognition.face_locations(unknown_image) face_encodings = face_recognition.face_encodings(unknown_image, face_locations) # Convertir l'image en une image au format PIL afin que nous puissions dessiner dessus avec la bibliothèque Pillow # See http://pillow.readthedocs.io/ for more about PIL/Pillow pil_image = Image.fromarray(unknown_image) # Créer une instance Pillow ImageDraw Draw avec laquelle on dessine draw = ImageDraw.Draw(pil_image) # Boucle for sur chaque visage trouvé dans l'image inconnue for (top, right, bottom, left), face_encoding in zip(face_locations, 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" # Ou plutôt utiliser un visage connu avec la plus petite distance par rapport au nouveau visage 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] # Dessinez une boîte autour du visage à l'aide de la bibliothèque Pillow draw.rectangle(((left, top), (right, bottom)), outline=(0, 0, 255)) # Dessinez une étiquette avec un nom sous le visage text_width, text_height = draw.textsize(name) draw.rectangle(((left, bottom - text_height - 10), (right, bottom)), fill=(0, 0, 255), outline=(0, 0, 255)) draw.text((left + 6, bottom - text_height - 5), name, fill=(255, 255, 255, 255)) # Supprimer la bibliothèque de dessins de la mémoire selon les documents Pillow del draw # Afficher l'image résultante display(pil_image)
import face_recognition import cv2 import numpy as np video_capture = cv2.VideoCapture(0) Lounis_OUMOHAND= face_recognition.load_image_file(r"C:\Users\oumoh\Downloads\lounis.jpg") lounis_face_encoding = face_recognition.face_encodings(Lounis_OUMOHAND)[0] Lounis_OUMOHAND lounis_face_encoding # Nabil bensafia Nabil_BENSAFIA= face_recognition.load_image_file(r"C:\Users\oumoh\Downloads\nabil.png") Nabil_face_encoding = face_recognition.face_encodings(Nabil_BENSAFIA)[0] # Créer des tableaux d'encodages de visage connus et leurs noms known_face_encodings = [ lounis_face_encoding, Nabil_face_encoding ] known_face_names = [ "Lounis_OUMOHAND", "Nabil_BENSAFIA" ] # Initialisation face_locations = [] face_encodings = [] face_names = [] process_this_frame = True while True: # Grab a single frame of video ret, frame = video_capture.read() # Resize frame of video to 1/4 size for faster face recognition processing small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses) rgb_small_frame = small_frame[:, :, ::-1] # Only process every other frame of video to save time if process_this_frame: # Find all the faces and face encodings in the current frame of video 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: # See if the face is a match for the known face(s) matches = face_recognition.compare_faces(known_face_encodings, face_encoding) name = "Unknown" # # If a match was found in known_face_encodings, just use the first one. # if True in matches: # first_match_index = matches.index(True) # name = known_face_names[first_match_index] # Or instead, use the known face with the smallest distance to the new face 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 # Display the results for (top, right, bottom, left), name in zip(face_locations, face_names): # Scale back up face locations since the frame we detected in was scaled to 1/4 size top *= 4 right *= 4 bottom *= 4 left *= 4 # Draw a box around the face cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) # Draw a label with a name below the face 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) # Display the resulting image cv2.imshow('Video', frame) # Hit 'q' on the keyboard to quit! if cv2.waitKey(1) & 0xFF == ord('q'): break # Release handle to the webcam video_capture.release() cv2.destroyAllWindows()