Reconaissance des criminels

Dans le cadre de notre projet iot, on a créé un projet impliquant la reconnaissance faciale, la gestion de base de données et le processus mqtt grâce à AWS. Tout d'abord on va décoder les empreinte faciale des photos des criminels qu'on les a sauvegardé au préalable dans un dossier intitulé "criminels".

Slides & Videos

Members

NameContribution
omar1. Ajout d’un criminel à la liste
2. Suppression
3. Consulter les informations d’un criminel
4. Modification des informations
5. Envoie des informations d’un criminel détecté sur le serveur amazon via mqtt(port 8883)

State of the Art

Business Aspect
Technical Aspect

Project Description

Problem Definition
Dans le cadre de notre projet iot, on a créé un projet impliquant la reconnaissance faciale, la gestion de base de données et le processus mqtt grâce à AWS. Tout d'abord on va décoder les empreinte faciale des photos des criminels qu'on les a sauvegardé au préalable dans un dossier intitulé "criminels". Toujours grâce à l'algorithme AI, on va également décoder les empreintes du personne qui se trouve en face de la camera, et on va les comparer à ceux sauvegardé dans notre système. Une fois les empreints se correspondent, on va afficher le nom du criminel écrit sur la photo dans notre dossier criminels. Grâce aux structures et aux listes, on va faire une recherche par nom et accéder au dossier du criminel trouvé. Là ensuite on va pouvoir le modifier, le supprimer ou le consulter. Il y aura également la possibilité d'ajouter un criminel à la liste et en saisissant tous ses informations grâce a l'interface utilisateur. Finalement, et grâce aux services web amazon, on va envoyer un mesage contenant la localisation et les informations du criminel afin de garder une trace de ses mouvements.
Challenges & Motivation
En premier lieu on a eu des problèmes par rapport au modules qui permet d'utiliser certaines fonctions notamment opencv et face_recognition. Ceci nous a pris trois semaines et on arrivait pas à trouver une solution malgré le fait que selon les testes la module existe bien dans notre dossier python. Finalement on a changé de logiciel(Spyder) et puis on a réussi à importer correctement les differents modules. En plus la dans la partie base de donnée notamment les structures et les listes on a eu plusieurs erreurs mais on a réussi à chaque fois à résoudre le problème en changeant les paramètres des fonctions utilisés. En addition, on s'est bloqué sur la partie iot(Aws) car on essayé d'établir une connexion via le port 8883 et finalement après deux semaines de recherche le problème c'était le choix du projet iot core qui se trouve sur le site amazon web services. Ce n'est pas que ca mais en combinant la partie reconnaissance et la partie base de données on a eu des errerus de type-215:Assertion failed) la solution était finalement de faire la capture video dans while() et non pas dehors cette boucle. On était pres à redémarrer de 0 à cause de cet errreur mais heureusement qu'on gardait une copie du code et après des recherches sur stack overflow on a réussi à trouver la solution.
Real and Complete Usecases

Technical Description

Nothing to show

Hardware

Materials
ImageNamePart NumberPriceCountLink
Raspberry pi 3 b+RPI-B BCM2837B054.36 euros1🛒
Schematic

Software

Arduino Code

import cv2
import face_recognition
import os
import numpy as np
import time 
import csv
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import sys
import requests

r=requests.get('https://get.geojs.io/')
ip_request=requests.get('https://get.geojs.io/v1/ip.json')
ipAdd=ip_request.json()['ip']
#print(ipAdd)

url='https://get.geojs.io/v1/ip/geo/'+ipAdd+'.json'
geo_request=requests.get(url)
geo_data=geo_request.json()
#print(geo_data)
data=str(geo_data["city"])
long=str(geo_data["longitude"])
lat=str(geo_data["latitude"])
region=str(geo_data["region"])
ip=str(ipAdd)
#Track=ip+'/'+data+'/'+region+'/'+long+'/'+lat
Track=("77.220.30.5/Paris/Ile-de-france/2.2245/49.4585")
print(Track)

topic="testing"
face_cascade=cv2.CascadeClassifier('C:/Users/123/Desktop/iot/data/haarcascade_frontalface_alt2.xml')
myMQTTClient= AWSIoTMQTTClient("DATA")
myMQTTClient.configureEndpoint("a3p29hlyue36he-ats.iot.us-east-1.amazonaws.com",8883)
myMQTTClient.configureCredentials("./AmazonRootCA1.pem  ","./0acacdb93a6a456b284adcff33fa1b92fdfebb4e351bf9d6ef870afb3178b240-private.pem.key" ,"./0acacdb93a6a456b284adcff33fa1b92fdfebb4e351bf9d6ef870afb3178b240-certificate.pem.crt")



#encoding part
#######################
path = 'criminels'
images = []
personNames = []
myList = os.listdir(path)
#print(myList)
for cu_img in myList:
    current_Img = cv2.imread(f'{path}/{cu_img}')
    images.append(current_Img)
    personNames.append(os.path.splitext(cu_img)[0])
#print(personNames)

####saving pictures in a list and noting their name 
n=0;

def faceEncodings(images):
    encodeList = []
    for img in images:
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        encode = face_recognition.face_encodings(img)[0]
        encodeList.append(encode)
    return encodeList
class Crim:
    crimList=list()
    def __init__(self,crimid,crimnom,crimprenom,naissance,commentaire):
        self.crimid, self.crimnom,self.crimprenom,self.naissance,self.commentaire=crimid,crimnom,crimprenom,naissance,commentaire
    def addnewcrim(self):
        Crim.crimList.append(self)
    def getcrimList(self):
        return Crim.crimList
    def getcriminfo(self,crimnom):
        for a in Crim.crimList:
            if(a.getcrimnom() == crimnom):
                return a
        return False
    def updatecriminfo(self,crimid,crimnom,crimprenom,naissance,commentaire):
        for x in Crim.crimList:
            if(x.crimnom==crimnom):
                x.id,x.crimnom,x.crimprenom,x.naissance,x.commentaire=crimid,crimnom,crimprenom,naissance,commentaire
                return True
        return False
    def removecrim(self,crimnom):
        for x in Crim.crimList:
            if(x.crimnom == crimnom):
                Crim.crimList.remove(x)
                return True
        return False
    def setcrimid(self,crimid):
        self.crimid = crimid
    def setcrimnom(self,crimnom):
        self.crimnom = crimnom
    def setcrimprenom(self,crimprenom):
        self.crimprenom = crimprenom
    def setnaissance(self,naissance):
        self.naissance=naissance
    def setcommentaire(self,commentaire):
        self.commentaire = commentaire
    def getcrimid(self):
        return self.crimid
    def getcrimnom(self):
        return self.crimnom
    def getcrimprenom(self):
        return self.crimprenom
    def getnaissance(self):
        return self.naissance
    def getcommentaire(self):
        return self.commentaire
    def __str__(self):
        return "%d %s %s %s %s"%(self.crimid, self.crimnom,self.crimprenom,self.naissance,self.commentaire)

uncrim = Crim(0,"","","","")

with open('Database.txt','r',newline='\n') as csv_file:
    csv_reader=csv.reader(csv_file,delimiter=' ')
   
    for line in csv_reader:
        
        if not line[0]:
            break
        crimid=int(line[0])
        crimnom=line[1]
        crimprenom=line[2]
        naissance=int(line[3])
        commentaire=line[4]
        crimo =Crim(crimid,crimnom,crimprenom,naissance,commentaire)
        crimo.addnewcrim()
        #print(crimo)
'''
for crimo in uncrim.getcrimList():
    print(crimo) 
'''
print("Scanning test Started, Please press 'esc' to open UserMode or 'Space' to add a criminel")

cam = cv2.VideoCapture(0)
cv2.namedWindow("test")
encodeListKnown = faceEncodings(images)
print('All Encodings Complete!!!')
while True:
   ret, frame = cam.read()
   faces = cv2.resize(frame, (0, 0), None, 0.25, 0.25)
   faces = cv2.cvtColor(faces, cv2.COLOR_BGR2RGB)

   facesCurrentFrame = face_recognition.face_locations(faces)
   encodesCurrentFrame = face_recognition.face_encodings(faces, facesCurrentFrame)
   facesCurrentFrame = face_recognition.face_locations(faces)
   encodesCurrentFrame = face_recognition.face_encodings(faces, facesCurrentFrame)

   for encodeFace, faceLoc in zip(encodesCurrentFrame, facesCurrentFrame):
        matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
        faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
        # print(faceDis)
        matchIndex = np.argmin(faceDis)

        if matches[matchIndex]:
            n=1
            name = personNames[matchIndex].lower()
            print("The guy is a criminel")
            #print(name)
            x= uncrim.getcriminfo(name)
            print(x)
            print(Track)
            msg=str(x)+Track
            myMQTTClient.connect(keepAliveIntervalSecond=600)
            myMQTTClient.publish(topic,msg,0)
            myMQTTClient.disconnect() 
            y1, x2, y2, x1 = faceLoc
            y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.rectangle(frame, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
            cv2.putText(frame, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
            continue
        
   cv2.imshow("test", frame)
   k = cv2.waitKey(1)
   if k%256 == 27: 
       print("(1) Press 1 to print images list")
       print("(2) Press 2 to print criminels list")
       print("(3) Press 3 to Remove a criminel from the list")
       print("(4) Press 4 to search for a criminel")
       print("(5) Press 5 to edit a criminels information")
       print("(6) Press 6 to come back to scanning mode")
       print("(7) Press 7 to close the program")
      
       
       Choicee=int(input("Please choose one of the options : "))
       
       if Choicee==1:
           print("(1) Press 1 to print images list")
           myList = os.listdir(path)
           print(myList)
           continue
       elif Choicee==2:
           print("Press 2 to print criminels list")
           for crimo in uncrim.getcrimList():
               print(crimo) 
           continue
           
       elif (Choicee==3):
           print("(1) Press 3 to delete a criminel")
           answer=input("Do you want to Free a criminel from a list? Y/N")
           if (answer =='Y' or answer =='y'):
               crr=input('enter the criminel name')
               cr= uncrim.getcriminfo(crr)
               if (cr==False):
                   print('Criminel not found')
               else:
                   #print(cr)
                   uncrim.removecrim(crr)
                   PATH='C:/Users/123/Desktop/iot/criminels'
                   z='.png'
                   crr+=z
                   os.remove( PATH + '/' + crr)
                   path = 'criminels'
                   images = []
                   personNames = []
                   myList = os.listdir(path)
                   print(myList)
                   for cu_img in myList:
                       current_Img = cv2.imread(f'{path}/{cu_img}')
                       images.append(current_Img)
                       personNames.append(os.path.splitext(cu_img)[0])
                   print(personNames)
                   encodeListKnown = faceEncodings(images)
                   print('All Encodings updated!!!') 
                   with open('Database.txt','w') as f:
                       writer=csv.writer(f)
                       for x in Crim.crimList:
                          writer.writerow([x])
                          print(x)
               continue
      
       elif Choicee==4:
            answer=input("Are you Looking for a crim? Y/N")
            if (answer =='Y' or answer =='y'):
                crimn=input('enter the criminel name')
                cri= uncrim.getcriminfo(crimn)
                if (cri==False):
                    print('Criminel not found')
                else:
                    print(cri)
                    pass
            
            else: 
                print('Quit')
            continue
       elif Choicee==5:
            
            print("Your pressed 6")
            answer=input("Do you want to update a criminel info? Y/N")
            if (answer =='Y' or answer =='y'):
                crimn=input('enter the criminel name')
                cri= uncrim.getcriminfo(crimn)
                if (cri==False):
                    print('Criminel not found')
                else:
                    print(cri)
                    crimid=int(input("Please write the new criminel id"))
                    crimnom=crimn
                    crimprenom=input("please write the new criminel surname")
                    naissance=input("please write the criminel birth date")
                    commentaire=input("Give some comments")
                    crc=uncrim.updatecriminfo(crimid,crimnom,crimprenom,naissance,commentaire)
                    if(crc==False):
                        print("\n Update failed. Unable to find ",crimnom)
                    else:
                        print("Successfully updated")
                        print(crc)
                    with open('Database.txt','w') as f:
                           writer=csv.writer(f)
                           for x in Crim.crimList:
                              writer.writerow([x])
                              print(x)
            continue
       elif Choicee==6:
            print("Coming Back to scanning mode")
            continue
       elif Choicee==7:
            cam.release()
            cv2.destroyAllWindows()
            break
       else:
            print("You didn't enter a valid choice please try again")
            continue
      
   elif k%256==32:
           
        x=input("Please enter a name : ")
        z='.png'
        img_name=x+z
        path='C:/Users/123/Desktop/iot/criminels'
        cv2.imwrite(os.path.join(path,img_name), frame)
        print("{} written!".format(img_name))
        
        #uncrim = Crim(0,"","","","")
        crimid=int(input("veuillez saisir l'id du criminel"))
        crimnom=x
        crimprenom=input("veuillez saisir le prenom du criminel")
        naissance=input("veuillez saisir sa date de naissance")
        commentaire=input("veuillez saisir des commentaires sur son dossier")
        crimo = Crim(crimid,crimnom,crimprenom,naissance,commentaire)
        crimo.addnewcrim()
        path = 'criminels'
        images = []
        personNames = []
        myList = os.listdir(path)
        print(myList)
        for cu_img in myList:
            current_Img = cv2.imread(f'{path}/{cu_img}')
            images.append(current_Img)
            personNames.append(os.path.splitext(cu_img)[0])
        print(personNames)
        encodeListKnown = faceEncodings(images)
        print('All Encodings updated!!!') 
        #for crimo in uncrim.getcrimList():
            #print(crimo) 
        with open('Database.txt','w') as f:
            writer=csv.writer(f)
            for x in Crim.crimList:
               writer.writerow([x])
               print(x)
        continue