首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >人脸识别工具

人脸识别工具
EN

Code Review用户
提问于 2017-12-01 11:20:23
回答 1查看 322关注 0票数 5

我用Python创建了一个小型库和一个示例应用程序,用于学习面部识别并进行实验。不过,现在我正在将文件名的列表加载到内存中,然后允许代码迭代这些名称,以便进行比较或查找这些名称。

我认为我的例子和库效率很低,但我不确定如何最好地使用我的库处理大量的照片。此外,它一次只能在一张照片上工作,但我的理解是,面部识别库使用所有核心,我应该一次只看一张照片。

如何使我的代码更高效?

我使用的原始面部识别库可以在https://github.com/ageitgey/face_识别找到。

我的图书馆:

代码语言:javascript
复制
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

应用程序:

代码语言:javascript
复制
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)
EN

回答 1

Code Review用户

发布于 2018-05-01 17:49:15

我注意到,face_recognition库本身也非常优化,可以同时在多个gpu和gpu上运行。但是我会在这里为你的具体代码出两分钱。

通常,对于这样的应用程序有两个步骤。

这里有一个培训步骤,您可以一次解析所有known_person映像,然后构建一个face_encodings数据,并将它们存储在磁盘上。通常,这些编码在大小上要比图像数据本身小得多,而且对于所有已知的图像都是一次性的。(如果您添加了新的已知图像,请将其视为需要重新生成编码的重新校准步骤)。这一步通常被认为是费时的,而且不经常做.

然后是推理步骤,即compare_faces函数。这就是你想做的几次。对于这个特定的步骤,您只需要新的映像和known_list(这是预先存储在磁盘上的经过训练的数据)。

因此,为了改进您的库,我建议添加一个“train”功能,它允许一个图像列表。然后,这个列表应该以一种格式存储编码(如果有几幅图像,则压缩)。

然后可以修改compare_faces函数以接收编码数据。您可以将其分为加载步骤(万一压缩了数据),然后比较步骤。这允许应用程序加载数据一次,但可以推断几次。

在代码本身中,可以对compare_faces进行改进。它可以改为:

代码语言:javascript
复制
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!")

而且,我发现奇怪的是,你没有返回它实际上匹配的那张脸。

如果这不再是你关心的问题,请随意忽略我:)

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/181757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档