2016-08-20 1 views
0

Tout d'abord, je suis désolé si le titre est long. Je travaille sur la détection de visage en utilisant python. J'essaye d'écrire un manuscrit où il notifiera l'utilisateur quand il y a même image ou presque même image/visages détectés entre deux dossiers/dossier. Voici le script que j'ai écrit jusqu'ici.comment notifier l'utilisateur s'il y a des visages communs détectés entre deux répertoires avec python et opencv

import cv2 
import glob, requests 

def detect1(): 
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') 

    for img in glob.glob('/Users/Ling/Pythonfiles/Faces/*.jpg'): 
     cv_img = cv2.imread(img) 
     gray = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY) 
     faces1 = face_cascade.detectMultiScale(gray, 1.3, 5) 

     for (x,y,w,h) in faces1: 
      cv2.rectangle(cv_img,(x,y),(x+w,y+h),(255,0,0),2) 


def detect2(): 
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') 

    for image in glob.glob('/Users/Ling/Pythonfiles/testfolder/*.jpg'): 
     cv_image = cv2.imread(image) 
     gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY) 
     faces2 = face_cascade.detectMultiScale(gray, 1.3, 5) 

     for (x,y,w,h) in faces2: 
      cv2.rectangle(cv_image,(x,y),(x+w,y+h),(255,0,0),2) 

def notify(): 
    if detect2 == detect1: 
     key = "<yourkey>" 
     sandbox = "<yoursandbox>.mailgun.org" 
     recipient = "<recipient's email>" 

     request_url = 'https://api.mailgun.net/v2/{0}/messages'.format(sandbox) 
     request = requests.post(request_url, auth=('api', key), 
      data={ 
      'from': '<sender's email', 
      'to': recipient, 
      'subject': 'face detect', 
      'text': 'common face detected' 
     }) 
     print 'Status: {0}'.format(request.status_code) 
     print 'Body: {0}'.format(request.text) 

Il n'y a pas d'erreur mais il n'y a pas de notification non plus. J'ai un dossier avec 10 photos de visages aléatoires je l'ai téléchargé de Google Image (juste pour l'apprentissage) et un autre dossier avec 2 photos de personnes que leur visage est identique à la partie de l'image dans le dossier précédent. L'image avec le même visage est dans un angle différent.

J'ai écrit le script en me référant au tutoriel de https://pythonprogramming.net/haar-cascade-face-eye-detection-python-opencv-tutorial/ et d'ajouter une ligne pour envoyer la notification si le programme détecte le même visage du dossier.

Ma question est comment est-ce que j'indique exactement à l'utilisateur s'il y a des mêmes visages détectés. Je crois que ce code est incomplet et espère que quelqu'un peut me donner des suggestions sur ce qu'il faut ajouter/modifier ou ce que je ne devrais pas écrire dans ce script.

Merci d'avance.

Répondre

1

Je ne sais pas si je vous comprends bien, mais je pense que vous recherchez la reconnaissance faciale non seulement une détection de visage.

Le classificateur de cascade basé sur les fonctions de Haar a appris très générell «à quoi devrait ressembler un visage». Il détecte les positions d'un objet/forme appris dans une image d'entrée donnée et renvoie les boîtes de délimitation. Donc, si vous voulez savoir si le visage détecté correspond à un visage connu, vous devez former un système de reconnaissance. OpenCV dispose de 3 reconnaisseurs de visage intégrés: EigenFaceRecognizer, FisherfaceRecognizer, LBPHFaceRecognizer (Reconnaissance des visages d'histogrammes de motifs binaires locaux).

utilisez-les avec par ex. recognizer = cv2.createLBPHFaceRecognizer()

Vous avez besoin d'un ensemble de formation pour vos utilisateurs. Peut-être votre dossier formations pourrait ressembler à:

1_001.jpg, 1_002.jpg, 1_003.jpg, 2_001.jpg 2_002.jpg, ..., n_xyz.jpg

où n est l'étiquette (id utilisateur -> unique pour chaque utilisateur) et xyz est peut-être une description ou un numéro de séquence.

Mise à jour:

J'ai utilisé le Faces94 benchmark dataset pour les tests. Par conséquent, je les ai emballés dans le dossier trainingSamples et deux d'entre eux (même personne mais visage différent) dans le dossier testFaces par rapport à mon script python.

Pour renommer toutes les images dans une correspondance de dossier avec le motif I ci-dessus utilisé une commande bash rename

par exemple. asamma. [1-20] .jpg à 001_ [1-20].jpg

rename 's/^asamma./001_/' *

import cv2 
import numpy as np 
import os 

class FaceRecognizer: 
    def __init__(self): 
     self.cascadeClassifier = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') 
     self.faceRecognizer = cv2.face.createLBPHFaceRecognizer() 

     if os.path.isfile('faceRecognizer.xml'): 
      self.faceRecognizer.load('faceRecognizer.xml') 
     else: 
      images = [] 
      labels = [] 
      for file in os.listdir('trainingSamples/'): 
       image = cv2.imread('trainingSamples/'+file, 0) 
       images.append(image) 
       labels.append(int(file.split('_')[0])) 
       ## if you don't have pre-cropped profile pictures you need to detect the face first 
       # faces = self.cascadeClassifier.detectMultiScale(image) 
       # for (x, y, w, h) in faces 
       #  images.append(image[y:y+h, x:x+w]) 
       #  labels.append(int(file.split('_')[0])) 

      self.faceRecognizer.train(images, np.array(labels)) 
      self.faceRecognizer.save('faceRecognizer.xml') 

    def predict(self, image, filename): 
     user, confidence = self.faceRecognizer.predict(image) 
     if confidence < 100.0: 
      print('found user with id {} in picture {} with a confidence of {}'.format(user, filename, confidence)) 

     ## if you don't have pre-cropped profile pictures you need to detect the face first 
     # faces = self.cascadeClassifier.detectMultiScale(image) 
     # for (x, y, w, h) in faces 
     #  user, confidence = self.faceRecognizer.predict(image[y:y+h, x:x+w]) 
     #  # confidence of 0.0 means perfect recognition (same images) 
     #  if confidence < 100.0: 
     #   print('found user with id {} in picture {} with a confidence of {}'.format(user, filename, confidence)) 

faceRecognizer = FaceRecognizer() 
for file in os.listdir('testFaces/'): 
    image = cv2.imread('testFaces/'+file, 0) 
    faceRecognizer.predict(image, file) 

Le code produit la sortie:

found user with id 4 in picture 004_20.jpg with a confidence of 27.836526552656732 
found user with id 1 in picture 001_6.jpg with a confidence of 22.473253497606876` 

Il reconnaît correctement l'utilisateur 4 et l'utilisateur 1.

Le code est testé avec OpenCV 3.1-dev sur Ubuntu 15.10 en utilisant Python 3.4.3 et Python 2.7.9.

+0

merci pour votre réponse. Je vais essayer comme vous le suggérez. Je ne peux pas le tester dès que possible car j'ai un autre projet. Si j'ai le temps, j'essaierai certainement comme vous l'avez suggéré. – Ling