как уведомить пользователя, если в двух каталогах с python и opencv обнаружены общие лица

python-2.7 opencv push-notification face-detection

763 просмотра

1 ответ

Во-первых, я извиняюсь, если название длинное. Я работаю над распознаванием лиц с использованием 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 фотографиями случайных лиц, которую я скачал из Google Image (только для учебных целей), и еще одна папка с 2 фотографиями людей, чье лицо совпадает с изображением в предыдущей папке. Картинка с одним и тем же лицом находится под другим углом.

Я написал сценарий, обратившись к руководству по адресу https://pythonprogramming.net/haar-cascade-face-eye-detection-python-opencv-tutorial/ и добавив строку для отправки уведомления, если программа обнаружит одно и то же лицо у обоих папки.

Мой вопрос заключается в том, как точно уведомить пользователя, если обнаружены такие же лица. Я полагаю, что этот код неполон и надеюсь, что кто-то может подсказать мне, что добавить / отредактировать или что мне не следует писать в этом сценарии.

Заранее спасибо.

Автор: Ling Источник Размещён: 08.11.2019 11:09

Ответы (1)


1 плюс

Я не знаю, правильно ли я вас понимаю, но я думаю, что вы ищете распознавание лица, а не только распознавание лица.

Основанный на характеристиках каскадный классификатор Хаара узнал очень обобщенно «Как должно выглядеть лицо». Он обнаруживает позиции изученного объекта / фигуры в заданном входном изображении и возвращает ограничивающие рамки.

Поэтому, если вы хотите узнать, совпадает ли обнаруженное лицо с известным лицом, вам необходимо обучить распознаватель. OpenCV имеет 3 встроенные лицо распознаватель: EigenFaceRecognizer, FisherfaceRecognizer, LBPHFaceRecognizer(Local Бинарных Шаблоны Гистограмма Face Recognizer).

используйте их, например, с recognizer = cv2.createLBPHFaceRecognizer()

Вам нужен обучающий набор для ваших пользователей. Может быть, ваша папка для тренировок может выглядеть так:

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

где n - метка (идентификатор пользователя -> уникальная для каждого пользователя), а xyz - это описание или порядковый номер.

Обновить:

Я использовал тестовый набор данных Faces94 для тестирования. Поэтому я упаковал их в папку, trainingSamplesи два из них (одного и того же человека, но с другим лицом) в папку testFacesотносительно моего скрипта на python.

Чтобы переименовать все изображения в папке, соответствующей приведенному выше шаблону, я использовал команду bash rename

например. асамма. [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.

Код протестирован с OpenCV 3.1-dev на Ubuntu 15.10 с использованием Python 3.4.3 и Python 2.7.9.

Автор: Fabian Размещён: 22.08.2016 07:46
Вопросы из категории :
32x32