如何通知用户在python和opencv两个目录之间检测到共同面孔



首先,如果标题很长,我很抱歉。我正在使用python进行面部检测。我试图写一个脚本,它会通知用户,当有相同的图片或几乎相同的图片/面孔之间检测到两个目录/文件夹。下面是我到目前为止写的脚本:

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)

没有错误,但也没有通知。我有一个文件夹,里面有10张随机面孔的照片,我从谷歌图片下载(只是为了学习目的),另一个文件夹里有2张人的照片,他们的脸和前一个文件夹里的一些照片一样。同一张脸的画在不同的角度。

我写的脚本参考教程从https://pythonprogramming.net/haar-cascade-face-eye-detection-python-opencv-tutorial/并添加一些行,如果程序从两个文件夹中检测到相同的面孔,则发送通知。

我的问题是,如果检测到相同的面孔,我如何准确地通知用户。我相信这段代码是不完整的,希望有人能给我一些建议,告诉我应该添加/编辑什么,或者我不应该在这个脚本中写什么。

提前感谢。

我不知道我是否理解正确,但我认为你寻找的人脸识别不仅仅是人脸检测。

Haar基于特征的级联分类器很好地学习了"一张脸应该是什么样子"。它检测给定输入图像中学习到的物体/形状的位置,并返回边界框。

所以如果你想知道检测到的人脸是否与已知的人脸匹配,你需要训练一个识别器。OpenCV有3个内置的人脸识别器:EigenFaceRecognizer, FisherfaceRecognizer, LBPHFaceRecognizer(局部二进制模式直方图人脸识别器)。

recognizer = cv2.createLBPHFaceRecognizer()

一起使用

你需要一个用户的训练集。也许你的培训文件夹可以像这样:

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

,其中n是标签(用户id ->对每个用户来说是唯一的),xyz可能是描述或序列号。

更新:

我使用Faces94基准数据集进行测试。因此,我将它们打包到文件夹trainingSamples中,其中两个(相同的人,但不同的脸)放入文件夹testFaces相对于我的python脚本。

要重命名文件夹中与上述模式匹配的所有图像,我使用了bash命令rename

。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)

代码产生如下输出:

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`

正确识别用户4和用户1

该代码在Ubuntu 15.10上使用Python 3.4.3和Python 2.7.9使用OpenCV 3.1-dev进行了测试。

相关内容

  • 没有找到相关文章

最新更新