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

RuntimeError: Unsupported image type, must be 8bit gray or RGB image. #1573

Open
s0m31-hub opened this issue Jun 22, 2024 · 18 comments
Open

Comments

@s0m31-hub
Copy link

  • face_recognition version: 1.2.2
  • Python version: 3.12.3
  • Operating System: Fedora 39

Description

Just trying to launch official example. The issue appears while reading jpg image, not camera input

What I Did

import face_recognition
import cv2
import numpy as np

# This is a demo of running face recognition on live video from your webcam. It's a little more complicated than the
# other example, but it includes some basic performance tweaks to make things run a lot faster:
#   1. Process each video frame at 1/4 resolution (though still display it at full resolution)
#   2. Only detect faces in every other frame of video.

# PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam.
# OpenCV is *not* required to use the face_recognition library. It's only required if you want to run this
# specific demo. If you have trouble installing it, try any of the other demos that don't require it instead.

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

# Load a sample picture and learn how to recognize it.
obama_image = face_recognition.load_image_file("obama.jpg")
obama_face_encoding = face_recognition.face_encodings(obama_image)[0]

# Load a second sample picture and learn how to recognize it.
biden_image = face_recognition.load_image_file("biden.jpg")
biden_face_encoding = face_recognition.face_encodings(biden_image)[0]

# Create arrays of known face encodings and their names
known_face_encodings = [
    obama_face_encoding,
    biden_face_encoding
]
known_face_names = [
    "Barack Obama",
    "Joe Biden"
]

# 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()

    # Only process every other frame of video to save time
    if process_this_frame:
        # 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]

        # 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)

        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"

            # # 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]

            # Or instead, use the known face with the smallest distance to the new face
            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

    # 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()
Traceback (most recent call last):
  File "/home/admin/PycharmProjects/faces/main.py", line 19, in <module>
    obama_face_encoding = face_recognition.face_encodings(obama_image)[0]
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/admin/.local/lib/python3.12/site-packages/face_recognition/api.py", line 213, in face_encodings
    raw_landmarks = _raw_face_landmarks(face_image, known_face_locations, model)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/admin/.local/lib/python3.12/site-packages/face_recognition/api.py", line 156, in _raw_face_landmarks
    face_locations = _raw_face_locations(face_image)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/admin/.local/lib/python3.12/site-packages/face_recognition/api.py", line 105, in _raw_face_locations
    return face_detector(img, number_of_times_to_upsample)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Unsupported image type, must be 8bit gray or RGB image.
@realalley
Copy link

same problem

@harrrshall
Copy link

is there any find solution?

@Noor161
Copy link

Noor161 commented Jun 23, 2024

the same problem wuth dlib face lanmarks
dlib.get_frontal_face_detector(gray,1)

ERROR:
hog_face_detector(gray,1)
^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Unsupported image type, must be 8bit gray or RGB image.

a year ago, it was working neatly

@Noor161
Copy link

Noor161 commented Jun 23, 2024

for me,
I downgraded numpy to 1.4 and imported it
dlib is not working well with numpy 2.0 version

credit for: https://stackoverflow.com/a/78638053/17027049

@JustinWingChungHui
Copy link

JustinWingChungHui commented Jun 23, 2024

Same issue, I downgraded numpy to version 1.26.4 and it worked again
Good spot @Noor161 !

@Hamza-Zartaj
Copy link

Hamza-Zartaj commented Jun 24, 2024

so i tried downgrading to numpy version 1.4 but it is giving me some error cant install it or something i also tried it installing manualy by downloading numpy1.4 file but still same error
need help
currently have these libraries installed

image

@JustinWingChungHui
Copy link

@Hamza-Zartaj have you tried numpy 1.26.4?

@zoldaten
Copy link

change this:
rgb_small_frame = small_frame[:, :, ::-1]
to
rgb_small_frame = cv2.cvtColor(small_frame, cv2.COLOR_BGR2RGB)

numpy==1.26.3
opencv-python==4.9.0.80

@Hamza-Zartaj
Copy link

@Hamza-Zartaj have you tried numpy 1.26.4?

it was not installing i tried installing it. it had some error with latest python 3.12.4 so i was wondering if i need to downgrade my python version to something like 3.11.8
should i change python version?

@OgunSerifOnargan
Copy link

same problem. It looks like old error rises from the grave

@OgunSerifOnargan
Copy link

OgunSerifOnargan commented Jun 25, 2024

I downgraded my numpy from 2.0.0 to 1.26.4 solved my problem.

@Hamza-Zartaj
Copy link

Hamza-Zartaj commented Jun 25, 2024 via email

@JustinWingChungHui
Copy link

@Hamza-Zartaj I was using Python 3.10.5

@n07kiran
Copy link

change this: rgb_small_frame = small_frame[:, :, ::-1] to rgb_small_frame = cv2.cvtColor(small_frame, cv2.COLOR_BGR2RGB)

numpy==1.26.3 opencv-python==4.9.0.80

@zoldaten Thank you! it worked.

@dwaipayanddg
Copy link

I have moved to these versions numpy==1.26.3 opencv-python==4.9.0.80
but it is still throwing this error to me, kindly help
Error:
subjects = detect(gray)
^^^^^^^^^^^^
RuntimeError: Unsupported image type, must be 8bit gray or RGB image.

@madhuribs111
Copy link

madhuribs111 commented Jun 26, 2024

Yep, downgraded numpy to 1.26.4 and its working..

My question is what is the relation between numpy version and the error: "RuntimeError: Unsupported image type, must be 8bit gray or RGB image."?

It's probably because openCV array structures are converted to numpy arrays ?
But why didn't I get a better exception message?

@dwaipayanddg
Copy link

Can you tell me, whats your python version?

@madhuribs111
Copy link

@dwaipayanddg
its 3.11.3

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