Как я могу исправить ошибку операндов распознавания лиц?

#python #face-recognition

Вопрос:

импорт распознавания лиц из файла PIL импорт изображения, ImageDraw

burak_image= face_recognition.load_image_file(«C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/burak1.jpg») burak_face_encoding = распознавание лица.кодирование лица(burak_image)

cansu_image= face_recognition.load_image_file(«C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/cansu1.jpg») cansu_face_encoding = распознавание лица.кодирование лица(cansu_image)

elif_image= face_recognition.load_image_file(«C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/elif2.jpg») elif_face_encoding = распознавание лица.кодирование лица(elif_image)

mert_image= face_recognition.load_image_file(«C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/mert2.jpg») mert_face_encoding = распознавание лица.кодирование лица(mert_image)

merve_image= face_recognition.load_image_file(«C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/merve1.jpg») merve_face_encoding = распознавание лица.кодирование лица(merve_image)

known_face_encodings = [ кодирование burak_face_encoding, кодирование cansu_face_encoding, кодирование elif_face_encoding, кодирование mert_face_encoding, кодирование merve_face_encoding

] known_face_names = [ «BURAK», «CANSU», «ELIF» , «MERT» , «MERVE»

]

изображение = face_recognition.load_image_file(«C:/Users/EMRE/Desktop/codfacerecog-master/codfacerecog-master/recognize/friends2/friends2.jpg»)

расположение лиц = распознавание лиц. расположение лиц(изображение) кодирование лиц = распознавание лиц. кодирование лиц(изображение, расположение лиц)

pil_image = Изображение.fromarray(изображение) рисование = Изображение.Рисование(pil_image)

для (вверху, справа, внизу, слева), кодирование лица в zip(расположение лиц, кодирование лиц): имя = «НЕИЗВЕСТНО»

 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.показать() pil_image pil_image.сохранить(«image_with_boxes.jpg»)

МОЯ ПРОБЛЕМА В том, что на идентифицированных лицах отображается имя только одного человека.Он показывает только имена первых известных лиц(«БУРАК»), показывает только имя одного человека на всех идентифицированных лицах; теги идентифицированных людей с одинаковым именем.

Ответ №1:

Как я правильно понял, отсюда вытекает ваша ошибка:

 matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
 

Ошибка значения сообщения: операнды не могут быть переданы вместе с фигурами (3,) (128,) означает, что face_encodings имеет размер 3 (это не нормально для кодировки лица dlib, но нормально для списка) и face_to_compare имеет размер 128 (это размер обычной кодировки лица dlib).

Я не вижу из вашего кода выше, в чем проблема.. Итак, попробуйте print(known_face_encodings) проверить, действительно ли список содержит эти кодировки.

Ответ №2:

Согласно документам, face_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
 

Комментарии:

1. Великое, но Таким образом, божий путь-это » …compare_faces([f], face_encoding)»

2. @Bohdan face_encodings() возвращает список, который передается в качестве первого параметра. Примечание. Я удалил индексацию результатов операций face_encodings() .

3. О, да, именно так. Его <known_face_encodings> — это список уже имеющихся списков

4. @ms.bigdatax Может быть, вы неправильно его скопировали — для меня это нормально работает. Я обновил ответ полной рабочей программой, которую вы можете скопировать и попробовать.

5. @ms.bigdatax Во — первых, вы не должны изменять свой вопрос подобным образом-это делает недействительными существующие ответы. Во-вторых, сравните мой код с вашим. У вас есть дополнительный if True in matches:... блок, из-за которого все имена должны быть одинаковыми.