Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

face_recognition only works with obama. #1553

Open
hexisXz opened this issue Feb 6, 2024 · 3 comments
Open

face_recognition only works with obama. #1553

hexisXz opened this issue Feb 6, 2024 · 3 comments

Comments

@hexisXz
Copy link

hexisXz commented Feb 6, 2024

  • face_recognition version: 1.2.2
  • Python version: Python 3.10.12
  • Operating System: Linux mint

Description

I copied the [Recognize faces in live video using your webcam - Simple / Slower Version to a file changed obama & biden to the faces I want irl and I just get this error (IndexError: list index out of range) but when I use the defaults it works fine....

here is the code that I added my own pictures in

import face_recognition
import cv2
import numpy as np


video_capture = cv2.VideoCapture(2)

#obama_image = face_recognition.load_image_file("obama.jpg")
#obama_face_encoding = face_recognition.face_encodings(obama_image)[0]


MY FACE_image = face_recognition.load_image_file("MY FACE.jpg")
MY FACE_face_encoding = face_recognition.face_encodings(MY FACE_image)[0]



#biden_image = face_recognition.load_image_file("biden.jpg")
#biden_face_encoding = face_recognition.face_encodings(biden_image)[0]

known_face_encodings = [
    MY FACE_face_encoding
]
known_face_names = [
     "My face"

face_locations = []
face_encodings = []
face_names = []
process_this_frame = True

while True:
    ret, frame = video_capture.read()

    if process_this_frame:
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

        rgb_small_frame = small_frame[:, :, ::-1]
        

        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

        face_names = []
        for face_encoding in face_encodings:
            # See if the face is a match for the known face(s)
            matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
            name = "Unknown"


            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
            best_match_index = np.argmin(face_distances)
            if matches[best_match_index]:
                name = known_face_names[best_match_index]

            face_names.append(name)

    process_this_frame = not process_this_frame


    for (top, right, bottom, left), name in zip(face_locations, face_names):
        top *= 4
        right *= 4
        bottom *= 4
        left *= 4

        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break


video_capture.release()
cv2.destroyAllWindows()
@AbdurNawaz
Copy link

you're most probably getting the error while calculating face_encodings - I had the same issue, it got resolved after I removed extra information from my image (metadata). This library seems to not work when your image has metadata.

@DiaosWang
Copy link

@AbdurNawaz
hello,how to remove extra information from my image(metadata) ?

@DiaosWang
Copy link

DiaosWang commented Apr 8, 2024

Maybe we can try cv2.imread to load imgs, as blow:

import cv2  
import face_recognition
import os 

root = './imgs/known_peoples/'

for name in os.listdir(root):
    img_path = os.path.join(root, name )
    img = cv2.imread(img_path)[:,:,::-1]
    num_face = len(face_recognition.face_encodings(img))
    print(name,  num_face)

The above code can correctly face_encodings face from personal face. The reason is, as @AbdurNawaz , that `cv2.imread' gets only the image data.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants