Распознавание лиц с помощью передней камеры компьютера, как сделать это быстрее? - PullRequest
0 голосов
/ 26 июня 2019

Я использую face_recognition, OpenCV и Face++ Search API, чтобы создать простую программу распознавания лиц в реальном времени, используя переднюю камеру моего компьютера. Процесс состоит в том, чтобы сначала сохранить кадр камеры, когда она обнаруживает лицо, затем вызвать Face++ Search API, чтобы узнать, находится ли человек на моем лице, и приветствовать. Результат был очень плохим с точки зрения fps, как я могу сделать это быстрее?

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

Я использую Python 3.7, и это код, который я использую:

import face_recognition
import requests
import cv2
import pyttsx3


def search_face(file, key, secret):
    http_url = 'https://api-cn.faceplusplus.com/facepp/v3/search'

    form_data = {
        'api_key': key,
        'api_secret': secret,
        'outer_id': '***'
    } 

    file  = {
        'image_file': open(file, 'rb')
    }

    req = requests.post(url = http_url, data = form_data, files = file)
    result = req.json()

    if len(result['faces'])>0:
        return result['results'][0]['confidence'], result['results'][0]['user_id'] 


def say_hi(text):
    engine = pyttsx3.init()

    voices = engine.getProperty('voices')
    engine.setProperty('voice', voices[1].id)

    engine.say(text)
    engine.runAndWait()
    engine.stop

if __name__ == '__main__':

    key = '***'
    secret = '***'
    file = '/Desktop/test/test.jpg'

    cap = cv2.VideoCapture(0)

    if cap.isOpened():
        rval, frame = cap.read()
    else:
        rval = False

    #Initialize some variables
    face_locations = []
    process_this_frame = True

    while rval:
        rval, frame = cap.read()

        #Resize frame of video to 1/4 size for faster face recognition processing 
        small_frame = cv2.resize(frame, (0,0), fx = 0.25, fy = 0.25)

        #Convert the image from BGR color (which openCV uses) to RGB color (which face_recognition uses)
        rgb_small_frame = small_frame[:, :, ::-1]

        # Only process every other frame of video to save time
        if process_this_frame:
            #Find all the faces in the current frame of video
            face_locations = face_recognition.face_locations(rgb_small_frame)

        process_this_frame = not process_this_frame

        #Display the resulting image
        cv2.imshow('Camera', frame)

        #Hit 'q' on the keyboard to quit!
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        if len(face_locations) == 0:
            continue
        else:      
            #Display the results
            for (top, right, bottom, left) in face_locations:

                #Scale back up face locations since the frame we detected in was scaled to 1/4 size
                top *= 4
                right *= 4
                bottom *= 4
                left *= 4

                #Draw a box around the face
                cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 0), 2)

            #Save the frame
            cv2.imwrite(file, frame)

            confidence_level, user_id = search_face(file, key, secret)

            if confidence_level > 80:
                text = 'Hello, {}'.format(user_id)
                say_hi(text)
                print(user_id)
            else:
                text = 'Sorry, please try again!'
                say_hi(text)
                print('Sorry, {}'.format(confidence_level))


    #Release handle to the webcam
    cap.release()
    cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 26 июня 2019

Вы не должны использовать API для распознавания лиц в реальном времени.Вы можете загрузить и локально интегрировать модель face_recognition, которую вы переподготовите, чтобы соответствовать вашему лицу.

Или это может быть решением: не отправлять все 30 кадров каждую секунду, а только 1или 2, вы увидите увеличение производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...