我用Python创建了一个小型库和一个示例应用程序,用于学习面部识别并进行实验。不过,现在我正在将文件名的列表加载到内存中,然后允许代码迭代这些名称,以便进行比较或查找这些名称。
我认为我的例子和库效率很低,但我不确定如何最好地使用我的库处理大量的照片。此外,它一次只能在一张照片上工作,但我的理解是,面部识别库使用所有核心,我应该一次只看一张照片。
如何使我的代码更高效?
我使用的原始面部识别库可以在https://github.com/ageitgey/face_识别找到。
我的图书馆:
import face_recognition
import os, os.path
import ntpath
from PIL import Image
def get_image_directory(path):
imgs = []
valid_images = [".jpg",".gif",".png",".tga"]
for f in os.listdir(path):
ext = os.path.splitext(f)[1]
if ext.lower() not in valid_images:
continue
imgs.append(os.path.join(path,f))
return imgs
def recognize_faces(path):
file_name = path_leaf(path)
image = face_recognition.load_image_file(path)
face_locations = face_recognition.face_locations(image)
i = 0
for face_location in face_locations:
top, right, bottom, left = face_location
face_image = image[top:bottom, left:right]
pil_image = Image.fromarray(face_image)
pil_image.save( 'output/' + str(file_name) + '_' +str(i)+".png")
i+=1
def compare_faces(unknown_images, known_images):
for image in unknown_images:
unknown_comparison_image = create_face_comparison_encoding(image)
for k_image in known_images:
results = face_recognition.compare_faces([k_image],unknown_comparison_image)
if results[0] == True:
print("This person appears familiar!")
print("Writing the faces to output folder!")
recognize_faces(image)
else:
print("This doesn't appear to be familiar!")
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
def create_face_comparison_encoding(image):
known_image = face_recognition.load_image_file(image)
known_image_encoding = face_recognition.face_encodings(known_image)[0]
return known_image_encoding应用程序:
from ml_face import *
##
# The Program
##
unknown_persons = get_image_directory('images/') # Unknown Persons Directory
known_persons = get_image_directory('known_person/') # Known Persons Directory
known_list = [] # Empty List
for k_per in known_persons:
known_comparison_image = create_face_comparison_encoding(k_per)
known_list.append(known_comparison_image)
compare_faces(unknown_persons,known_list)发布于 2018-05-01 17:49:15
我注意到,face_recognition库本身也非常优化,可以同时在多个gpu和gpu上运行。但是我会在这里为你的具体代码出两分钱。
通常,对于这样的应用程序有两个步骤。
这里有一个培训步骤,您可以一次解析所有known_person映像,然后构建一个face_encodings数据,并将它们存储在磁盘上。通常,这些编码在大小上要比图像数据本身小得多,而且对于所有已知的图像都是一次性的。(如果您添加了新的已知图像,请将其视为需要重新生成编码的重新校准步骤)。这一步通常被认为是费时的,而且不经常做.
然后是推理步骤,即compare_faces函数。这就是你想做的几次。对于这个特定的步骤,您只需要新的映像和known_list(这是预先存储在磁盘上的经过训练的数据)。
因此,为了改进您的库,我建议添加一个“train”功能,它允许一个图像列表。然后,这个列表应该以一种格式存储编码(如果有几幅图像,则压缩)。
然后可以修改compare_faces函数以接收编码数据。您可以将其分为加载步骤(万一压缩了数据),然后比较步骤。这允许应用程序加载数据一次,但可以推断几次。
在代码本身中,可以对compare_faces进行改进。它可以改为:
def compare_faces(unknown_images, image_encodings_data):
for image in unknown_images:
unknown_data = create_face_comparison_encoding(image)
# Note how compare_faces takes multiple encodings.
results = face_recognition.compare_faces(image_encodings_data,unknown_data)
if results.count(True) > 0:
print("This person appears familiar!")
print("Writing the faces to output folder!")
recognize_faces(image)
else:
print("This doesn't appear to be familiar!")而且,我发现奇怪的是,你没有返回它实际上匹配的那张脸。
如果这不再是你关心的问题,请随意忽略我:)
https://codereview.stackexchange.com/questions/181757
复制相似问题