Как сделать распознавание лица на изображениях и определить, известны ли лица на нем? - PullRequest
0 голосов
/ 24 февраля 2019

В настоящее время я создаю программу распознавания лиц, в которой у меня есть папка KNOWN_FACES, к которой программа обращается для распознавания известных лиц на неопознанном изображении.Я тестирую программу на изображении, которое должно возвращать 'Неизвестно' на всех лицах, но у меня возникают проблемы с получением прямоугольников на всех лицах, а затем сохраняется изображение в image_output folder.

СТРУКТУРА ПАПКИ.

Известные изображения: my_project // KNOWN_FACES // "ALL FACES HERE"

Выходная папка: my_project // image_output //

И у меня есть faces.jpg в каталоге, где находится моя программа.В моем коде я почти уверен, что что-то не так с тем, как я пытаюсь рисовать прямоугольников вокруг каждой грани и отображать их имя прямо под прямоугольником.(Почти в нижней части программы.)

Мой код

У меня есть только одна программа, которая является модификацией ЭТОГО фрагмента кода от производителямодуль face_recognition.

Вот image_face_recognition.py :

from PIL import Image
import face_recognition
import cv2

# Load Unidentified faces
image = face_recognition.load_image_file("faces.jpg")

# face1
face1_image = face_recognition.load_image_file("KNOWN_FACES//face1.jpg")
face1_face_encoding = face_recognition.face_encodings(face1_image)[0]

# face2
face2_image = face_recognition.load_image_file("KNOWN_FACES//face2.jpg")
face2_face_encoding = face_recognition.face_encodings(face2_image)[0]

# face3
face3_image = face_recognition.load_image_file("KNOWN_FACES//face3.jpg")
face3_face_encoding = face_recognition.face_encodings(face3_image)[0]

# face4
face4_image = face_recognition.load_image_file("KNOWN_FACES//face4.jpg")
face4_face_encoding = face_recognition.face_encodings(face4_image)[0]

# Create arrays of known face encodings and their names
known_face_encodings = [
    face1_face_encoding,
    face2_face_encoding,
    face3_face_encoding,
    face4_face_encoding
]
known_face_names = [
    "FACE1",
    "FACE2",
    "FACE3",
    "FACE4"
]

# Find all the faces in the image using the default HOG-based model.
# This method is fairly accurate, but not as accurate as the CNN model and not GPU accelerated.
face_locations = face_recognition.face_locations(image)

print("I found {} face(s) in this photograph.".format(len(face_locations)))

# Then compare faces with known faces, and save an image that contains
# rectangles around EACH face.

# Find all the face encodings in the image.
face_encodings = face_recognition.face_encodings(image, face_locations)

face_names = []
for face_encoding in face_encodings:
    # See if the face is a match for the known face(s)
    matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
    name = "Unknown"

    # If a match was found in known_face_encodings, just use the first one.
    if True in matches:
        first_match_index = matches.index(True)
        name = known_face_names[first_match_index]

    face_names.append(name)

    # Return final image.
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        # Scale back up face locations since the image was scaled to 1/5 size.
        top *= 5
        right *= 5
        bottom *= 5
        left *= 5

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

        # Draw a label with a name below the face.
        # See, this is where I think I messed up.
        # DOESN'T WORK (I think).
        cv2.rectangle(image, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(image, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)


# Finally, save the image to image_output folder.
final_image = Image.fromarray(image)
final_image.save("image_output/FACE_REC_PICTURE.png")

1 Ответ

0 голосов
/ 24 февраля 2019

Вы забыли изменить размер изображения перед рисованием прямоугольника

#resize image TOO
image = cv2.resize(image,(0,0),fx=5,fy=5)
for (top, right, bottom, left), name in zip(face_locations, face_names):
        # Scale back up face locations since the image was scaled to 1/5 size.
        top *= 5
        right *= 5
        bottom *= 5
        left *= 5



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


        cv2.rectangle(image, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(image, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

Кроме того, у вас есть в два раза больше этой строки

face_locations = face_recognition.face_locations(image)

в вашем скрипте.В общем, я бы не упомянул об этом, но эта функция довольно медленная, поэтому вы не хотите делать это дважды.

По моему скромному мнению, и по моему опыту, вы делаете это изменение масштаба , поскольку поиск местоположений лиц с помощью библиотеки Face_recognition является чертовски медленным.Если я могу вмешаться,

Посмотрите на Каскады Хаара - для поиска местоположений на передней и боковой гранях.

Он выполняет ту же работу, но вам нужно интегрировать его в свою программу, что не является проблемой вообще.В основном это то же самое, что и

face_recognition.face_locations(image)

Хотя библиотека face_recognition может находить местоположения лиц до 60-х годов. Каскады Хаара, хотя и немного менее точные и надежные, могут делать это до 1 с.Вам не нужно будет изменять масштаб изображения и играть с координатами

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