如何对图像进行人脸识别并判断其中的人脸是否已知?

How to do face recognition on images and determining if the faces in it is known?

目前,我正在制作一个人脸识别程序,其中有一个 KNOWN_FACES 文件夹,程序可以访问该文件夹以识别未识别图像中的已知面孔。我在一个应该 return 'Unknown' 的图像上测试程序,但是我在所有的脸上都得到矩形,然后保存时遇到了问题image_output 文件夹中的图像。

文件夹结构。

已知图像: my_project//KNOWN_FACES//"ALL FACES HERE"

输出文件夹: my_project//image_output//

我的程序所在的目录中有一个faces.jpg。在我的代码中,我很确定我尝试 在每个面周围绘制 矩形并在矩形正下方显示它们的名称的方式有问题。 (几乎在程序的底部。)

我的代码

我只有这个程序,它是对 face_recognition 模块制造商的 THIS 一段代码的修改。

这里是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")

您在绘制矩形之前忘记调整图像大小

#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 库查找面部位置非常慢。如果我可以干预,

查看 Haar 级联 - 用于查找正面和侧面位置。

它做同样的工作,但你需要将它集成到你的程序中,这完全不是问题。跟

基本一样
face_recognition.face_locations(image)

虽然 face_recognition 库最多可以在 60 秒内找到人脸位置。Haar 级联虽然不太准确和可靠,但最多可以在 1 秒内完成。您不需要重新缩放图像并使用坐标