【问题标题】:How can I fix Face Recognition operands error?如何修复人脸识别操作数错误?
【发布时间】:2021-09-08 06:23:52
【问题描述】:

导入人脸识别 从 PIL 导入 Image、ImageDraw

burak_image= face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/burak1.jpg") burak_face_encoding = face_recognition.face_encodings(burak_image)

cansu_image= face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/cansu1.jpg") cansu_face_encoding = face_recognition.face_encodings(cansu_image)

elif_image= face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/elif2.jpg") elif_face_encoding = face_recognition.face_encodings(elif_image)

mert_image= face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/mert2.jpg") mert_face_encoding = face_recognition.face_encodings(mert_image)

merve_image= face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/merve1.jpg") merve_face_encoding = face_recognition.face_encodings(merve_image)

known_face_encodings = [ burak_face_encoding, cansu_face_encoding, elif_face_encoding, mert_face_encoding, merve_face_encoding

] known_face_names = [ “布拉克”, "坎苏", “ELIF”, “默特”, “梅尔维”

]

image = face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/friends2.jpg")

face_locations = face_recognition.face_locations(图像) face_encodings = face_recognition.face_encodings(image, face_locations)

pil_image = Image.fromarray(image) draw = ImageDraw.Draw(pil_image)

for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings): 名称 = “未知”

for i,f in enumerate(known_face_encodings):
    matches = face_recognition.compare_faces(f, face_encoding)
    if True in matches:
        name = known_face_names[i]
        break

if True in matches:
    first_match_index = matches.index(True)
    name = known_face_names[first_match_index]


draw.rectangle(((left, top), (right, bottom)), outline=(0, 0, 255))


text_width, text_height = draw.textsize(name)
draw.rectangle(((left, bottom - text_height - 10), (right, bottom)), fill=(48, 63, 159), outline=(48, 63, 159))
draw.text((left + 6, bottom - text_height - 5), name, fill=(255, 255, 255, 0))

删除画

pil_image.show() pil_image pil_image.save("image_with_boxes.jpg")

我的问题是它在识别的脸上只显示一个人的名字。它只显示第一个 known_face_names("BURAK") 在所有识别的脸上只显示一个人的名字;已识别的同名人员的标签。

【问题讨论】:

    标签: python face-recognition


    【解决方案1】:

    正如我所理解的,您的错误来自这里:

    matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
    

    消息 ValueError:operands could not be broadcast together with shapes (3,) (128,) 表示face_encodings 的维度为 3(这对于 dlib 面编码是不正常的,但对于列表来说没问题)和 @ 987654323@ 的维度为 128(这是普通 dlib 人脸编码的维度)。

    我无法从您上面的代码中看出问题出在哪里。因此,请尝试print(known_face_encodings) 检查列表是否真的包含该编码。

    【讨论】:

      【解决方案2】:

      根据docsface_recognition.compare_faces应该可以将数组作为第一个参数——但据我所知,应该是face_recognition.face_encodings返回的数组。要使用多个图像,请遍历数组:

      # note - not indexing the array with [0]
      annem_face_encoding = face_recognition.face_encodings(annem_image)
      babam_face_encoding = face_recognition.face_encodings(babam_image)
      elif_face_encoding = face_recognition.face_encodings(elif_image)
      
      ....
      
      for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
          name = "UNKNOWN"
          # Use a loop to compare to each known face
          for i,f in enumerate(known_face_encodings):
              matches = face_recognition.compare_faces(f, face_encoding)
              if True in matches:
                  name = known_face_names[i]
                  break
      
           # draw rectangle stuff.....
      

      另请注意,您在末尾有一个额外的逗号

      elif_face_encoding = face_recognition.face_encodings(elif_image) [0],
      

      完整代码:

      import face_recognition
      from PIL import Image, ImageDraw
      
      annem_image = face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/images/annem1.jpg")
      annem_face_encoding = face_recognition.face_encodings(annem_image)
      
      babam_image = face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/images/babam1.jpg")
      babam_face_encoding = face_recognition.face_encodings(babam_image)
      
      elif_image = face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/images/elif1.jpg")
      elif_face_encoding = face_recognition.face_encodings(elif_image)
      
      known_face_encodings = [
          annem_face_encoding,
          babam_face_encoding,
          elif_face_encoding
      ]
      known_face_names = [
          "ANNEM",
          "BABAM",
          "ELIF"
      ]
      
      image = face_recognition.load_image_file("C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/images/family.jpg")
      face_locations = face_recognition.face_locations(image)
      face_encodings = face_recognition.face_encodings(image, face_locations)
      
      pil_image = Image.fromarray(image)
      draw = ImageDraw.Draw(pil_image)
      
      for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
          name = "UNKNOWN"
          for i,f in enumerate(known_face_encodings):
              matches = face_recognition.compare_faces(f, face_encoding)
              if True in matches:
                  name = known_face_names[i]
                  break
      
          draw.rectangle(((left, top), (right, bottom)), outline=(48, 63, 159))
      
          text_width, text_height = draw.textsize(name)
          draw.rectangle(((left, bottom - text_height - 10), (right, bottom)), fill=(48, 63, 159), outline=(48, 63, 159))
          draw.text((left + 6, bottom - text_height - 5), name, fill=(255, 255, 255, 0))
      
      
      del draw
      
      pil_image.show()
      pil_image
      

      【讨论】:

      • 很好,但
      • @Bohdan face_encodings() 返回一个列表,并将其作为第一个参数传递。注意我删除了face_encodings()结果的OPs索引。
      • 哦,没错。他的 已经是列表的列表
      • @ms.bigdatax 也许你复制错了——对我来说没问题。我已经用一个完整的工作程序更新了答案,你可以复制和尝试。
      • @ms.bigdatax 首先,您不应该这样修改您的问题 - 它会使现有答案无效。其次,将我的代码与您的代码进行比较。您有一个额外的 if True in matches:... 块导致所有名称都相同。
      猜你喜欢
      • 2022-06-16
      • 2023-03-25
      • 2011-12-11
      • 2014-06-14
      • 2014-03-24
      • 2021-04-19
      • 1970-01-01
      • 2015-09-20
      • 2011-12-14
      相关资源
      最近更新 更多