如何对图像进行人脸识别并判断其中的人脸是否已知?
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 秒内完成。您不需要重新缩放图像并使用坐标
目前,我正在制作一个人脸识别程序,其中有一个 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 秒内完成。您不需要重新缩放图像并使用坐标