#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:...
блок, из-за которого все имена должны быть одинаковыми.