ageitgey / ageitgey/face_recognition

face_recognition.compare_faces

Open
#563 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
56.8k
Forks
13.7k
PR merge metrics
No merged PRs in 30d

Description

  • face_recognition version:1.2.1
  • Python version:2.7
  • Operating System:macOS
Description

I set up [ {'name':'Cang Teacher','face':'canglaoshi.jpeg'}, {'name':'PengXiang.Zhang','face':'pengxiang.jpeg'},{'name':'Rocky','face':'190158.jpg'},{'name':'Mengfei.yin','face':'mengfei.jpeg'}],and I use face_recognition.compare_faces like this matches = face_recognition.compare_faces(known_face_encodings, face_encoding,tolerance=0.6),but No matter who appears in the camera, matches is [False, True, True, True].

What I Did
# Get a reference to webcam #0 (the default one)
        video_capture = cv2.VideoCapture(0)

        # Create arrays of known face encodings and their names
        known_face_encodings = []
        known_face_names = []

        for face in pf:
            # Load a sample picture and learn how to recognize it.
            print face
            rocky_image = self.loadImage("images/" + face["face"])
            rocky_face_encoding = face_recognition.face_encodings(rocky_image,num_jitters=1)[0]
            known_face_encodings.append(rocky_face_encoding)
            known_face_names.append(face["name"])
            # Create arrays of known face encodings and their names



        # Initialize some variables
        face_locations = []
        face_encodings = []
        face_names = []
        process_this_frame = True

        while True:
            # Grab a single frame of video
            ret, frame = video_capture.read()

            # Resize frame of video to 1/4 size for faster face recognition processing
            small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

            # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
            rgb_small_frame = small_frame[:, :, ::-1]

            # Only process every other frame of video to save time
            if process_this_frame:
                # Find all the faces and face encodings in the current frame of video
                face_locations = face_recognition.face_locations(rgb_small_frame)
                face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations,num_jitters=1)

                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,tolerance=0.6)
                    name = "Unknown"
                    print matches
                    # If a match was found in known_face_encodings, just use the first one.
                    if True in matches:
                        first_match_index = matches.index(True)
                        name = known_face_names[first_match_index]

                    face_names.append(name)

            process_this_frame = not process_this_frame

            # Display the results
            for (top, right, bottom, left), name in zip(face_locations, face_names):
                # Scale back up face locations since the frame we detected in was scaled to 1/4 size
                top *= 4
                right *= 4
                bottom *= 4
                left *= 4

                # Draw a box around the face
                cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

                # Draw a label with a name below the face
                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)

            # Display the resulting image
            cv2.imshow('Video', frame)

            # Hit 'q' on the keyboard to quit!
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        # Release handle to the webcam
        video_capture.release()
        cv2.destroyAllWindows()

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the provided webcam loop and the calls to face_recognition.face_encodings and compare_faces, checking how known_face_encodings and the camera face_encoding are produced. Reproduce the reported matches list with the stated versions and tolerance, then establish why unrelated faces match and verify that the resulting names correspond to the correct face.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
computer-vision, machine-learning
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.