 
    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()