如何在图像上进行人脸识别并确定其中的人脸是否已知?

时间:2019-02-23 21:23:07

标签: python opencv face-recognition

当前,我正在制作一个人脸识别程序,其中有一个KNOWN_FACES文件夹,程序可以访问该文件夹来识别未识别图像中的已知人脸。我在应该在所有面上都返回'Unknown'的图像上测试程序,但是在获取所有面上的矩形,然后将图像保存在 image_output < / em>文件夹。

文件夹结构。

已知图像: my_project // KNOWN_FACES //“这里所有的面孔”

输出文件夹: 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")

1 个答案:

答案 0 :(得分:1)

You forgot to resize image before drawing rectangle

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

Besides that, you have twice this line

face_locations = face_recognition.face_locations(image)

in your script. In general I wouldnt mention that, but this one is pretty slow function, so you dont want to do it twice.

In my humble opinion, and from my experience, you do this rescaling because finding face locations with Face_recognition library is god damn slow. If I may intervene,

Look at Haar cascades - for finding frontal and side face locations.

It does the same job, but you need to integrate it in your program, which is not problem at all. Its basicly the same like

face_recognition.face_locations(image)

While face_recognition library can find face locations up to 60s.. Haar cascades, even though little bit less accurate and reliable, can do it up to 1s. You will not need to rescale you image and play with coordinates