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

NameContribution
Nabil BensafiaReconnaissance faciale.

installation des déférente bibliothèques sur Jupiter netbook (python).
Head pose estimation avec un repère OXYZ.
OUMOUHAND LounisIdentification du l'étudiant avec son nom et prénom en temp réel.

reconnaissance d'un visage avec ses mouvements.

State of the Art

Technical Aspect

-

On se plonge à présent dans la recherche et lavancée concernant les
solutions de surveillance dun examen en ligne. En faisant des recherches sur
ResearchGate, on retrouve larticle Automated Online Exam Proctoring,
réalisé par Atoum, Chen, Liu et Hsu et Xioming Liu de lUniversité 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 lexamen). Le
système est composé dune caméra (de lordinateur), dun microphone et
dune autre caméra qui filme la pièce. Il est basé sur la vérification de
lutilisateur, de la détection du texte et de la voix, du regard, de la vérification
des fenêtres ouvertes sur lordinateur 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 lordinateur ainsi que son micro et lécran du candidat. Ils évaluent
le degré de langle 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. Daprès les
chercheurs, leurs résultats dexpé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
dexamen entier (de lauthentification, à 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 dintervention
humain.

Project Description

Problem Definition
Le plus grand problème qu'on a rencontrer dans ce projet étais le temp ( on est un binôme avec des contrats de travail ), a cote aussi on avais a rechercher un stage. donc on pouvais pas vraiment consacrer beaucoup de temp pour ce projet.

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
On a trouvé que c'étais vraiment un projet intéressant ou on pouvais apprendre beaucoup de choses et d'outils mais on avais en face de nous l'inconvénient du temps en face de nous.

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
ImageNamePart NumberPriceCountLink
Jupiter netbook000🛒
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()

External Services

-

-