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
Name | Contribution |
---|---|
omar | 1. 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
Image | Name | Part Number | Price | Count | Link |
---|---|---|---|---|---|
Raspberry pi 3 b+ | RPI-B BCM2837B0 | 54.36 euros | 1 | 🛒 |
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