individus=list(set(individus))# suppression des doublons (un individu = plusieurs images)
#Nombre d'individus à rechercher dont on va supprimer les images = Nombre d'individus dont on va garder des images dans la base
# Nombre de requêtes = 2*nbr_a_suppr
nbr_a_suppr=100
individus_supprimes=[]
#On stocke le nom des individus dont les images seront supprimées de la BDD dans individus_supprimes, la méthode "pop" les retire de la liste individus
foriinrange(nbr_a_suppr):
ind=np.random.randint(len(individus))
individus_supprimes.append(individus.pop(ind))
a_suppr=[]
forjinrange(len(photos)):
p=photos[j]
forindiinindividus_supprimes:
ifindiinp:
a_suppr.append(j)#On récupère les indices des éléments (noms des photos) à supprimer
a_suppr.reverse()# On commence par supprimer les derniers éléments pour ne pas créer de décalage lors des pops
forjina_suppr:
photos.pop(j)
# On retire toutes les photos correspondant à des individus dont on ne veut plus dans la BDD
# On recrée les noms des photos des requêtes des individus plus présents dans la BDD
# On choisit à chaque fois la première photo par facilité
# On retire quand même ces photos de la BDD mais en gardant les autres de l'inidividu
forrinrequetes_vraies:
photos.remove(r)
# Création des tableaux de données, requêtes vraies, requêtes fausses
# Maintenant, nous avons le nom de toutes les photos-requêtes et les photos-gallery (c'est-à-dire toutes les photos sauf celles des reqûetes et sauf toutes les autres des individus des reqûetes considérées comme fausses)
# On transforme toutes les photos en tableau numpy, chaque ligne = une photo = un vecteur de taille 150*150 = 22500
gallery_list=[]
i=0
filenames=[photo+".jpg"forphotoinphotos]#On remet les extensions de fichiers
forfileinfilenames:
img=plt.imread(folder_path+file)
gallery_list.append(list(img.flatten()))
i+=1
print(i)
complete_gallery=np.array(gallery_list)
true_probes_list=[]
i=0
filenames=[r+".jpg"forrinrequetes_vraies]#On remet les extensions de fichiers
forfileinfilenames:
img=plt.imread(folder_path+file)
true_probes_list.append(list(img.flatten()))
i+=1
print(i)
complete_true_probes=np.array(true_probes_list)
false_probes_list=[]
i=0
filenames=[r+".jpg"forrinrequetes_fausses]#On remet les extensions de fichiers
forfileinfilenames:
img=plt.imread(folder_path+file)
false_probes_list.append(list(img.flatten()))
i+=1
print(i)
complete_false_probes=np.array(false_probes_list)
# Transformation des données avec Eigenfaces
eigenfaces=True
ifeigenfaces:
# k= nombre de dimensions que l'on gardera à la fin
# La procédure suivante est celle détaillée en 8.2 du sujet afin d'éviter de faire une ACP avec 22500 variables (une variable = un pixel)
# Une étape importante est la détermination du seuil à partir duquel on estime que deux photos représentés par des vecteurs correspondent à un même individu
# La méthode est expliquée plus en détail dans le rapport
defeuclid(A,B):
assertlen(A)==len(B)
returnnp.sqrt(sum((A-B)**2))
defcalcul_de_r():
m_dist=[]
foriinrange(len(photos)):
p=photos[i]
ind=p[:p.find(".")]
photos_same_ind=[]
forjinrange(len(photos)):
ifindinphotos[j]:
photos_same_ind.append(j)
other_photos=complete_gallery[photos_same_ind,:]
m=0
forpinother_photos:
m+=euclid(complete_gallery[i,:],p)
iflen(photos_same_ind)>1:
m_dist.append(m/(len(photos_same_ind)-1))
print(m/(len(photos_same_ind)-1))
print(i)
returnnp.mean(m_dist)
R=calcul_de_r()
# Force brute
# Les deux systèmes reposent sur la force brute: on va comparer chaque photo avec la requête et si la distance euclidienne les séparant est inférieure à un certain seuil R déterminé au préalable, alors on considère que les photos correspondent à la même personne et l'authentifcation est réussie (=return True)
defaut(G,R,seuil):
forphotoinG:
ifeuclid(photo,R)<=seuil:
returnTrue
returnFalse
# Positifs va contenir le résultat de la tentative d'authentification pour toutes les requêtes vraies. Dans le meilleur des cas, tous ses éléments sont vrais.
t0=time.time()
positifs=[]
forreqincomplete_true_probes:
positifs.append(aut(complete_gallery,req,R))
# Négatifs va contenir le résultat de la tentative d'authentification pour toutes les requêtes fausses. Dans le meilleur des cas, tous ses éléments sont faux.
negatifs=[]
forreqincomplete_false_probes:
negatifs.append(aut(complete_gallery,req,R))
t_recherche=time.time()-t0
# Les fonctions des différents mesures de précision en fonction des listes positives et négatives définies ci-dessus
defexactitude(pos,neg):
n1=len(pos)
n2=len(neg)
return(sum(pos)+n2-sum(neg))/(n1+n2)
defprecision(pos,neg):
returnsum(pos)/(sum(pos)+sum(neg))
defrappel(pos,neg):
returnsum(pos)/len(pos)
defsensibilite(pos,neg):
n1=len(pos)
n2=len(neg)
return(n2-sum(neg))/n2
# Affichage des résultats obtenus
print("Temps nécessaires à l'authentification des",2*nbr_a_suppr,"requêtes:",t_recherche)
# Les tableaux présents dans le rapport présentent des résultats en faisant varier les paramètres suivants: eigenfaces (True/False), k(50/10/5 si eigenfaces = True) et folder_path (pour changer de dataset)