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 · 34 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

@JBelmont72
Copy link

thank you so much. I changed my bumpy to 1.26.4 and reloaded my requirements.txt. Presto.

@Boonyarit2442
Copy link

use numpy==1.26.4 can complete

@DeveloperLevin
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?

yes downgrde your ython version, else dlib would not work

@dannamado
Copy link

j'utilise la version python 3.12.4 et j'ai installé face_recognition version 1.3.0 apres l'execution du script ,je reçois une erreur comme celle ci: RuntimeError: Unsupported image type, must be 8bit gray or RGB image.

@dannamado
Copy link

svp aidez moi

@hamstah
Copy link

hamstah commented Jul 23, 2024

Downgrading worked for me

pip uninstall numpy
pip install numpy==1.26.4

@ajmcgrail
Copy link

Downgrading worked for me, but is there a fix in the works for face recognition/dlib to work with numpy 2.0? Not sure which project would be responsible for this fix- I imagine it's face recognition?

@ramprasathmk
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 100% worked bruh...
Thank you so much ❤️

Python version: 3.10.x

@bryango
Copy link

bryango commented Aug 24, 2024

Related: davisking/dlib#1134

@ramprasathmk
Copy link

ramprasathmk commented Aug 24, 2024

Related: davisking/dlib#1134

Use Python 3.10.X version with a virtual environment to solve this error.

Check out: https://github.com/ramprasathmk/Automatic-Attendance-System-for-Face-Recognition/blob/master/Installation.md

@ramprasathmk
Copy link

@dwaipayanddg
its 3.11.3

python3.10 works fine, ya

@mohamedmokhtar-1
Copy link

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

thanks alot

@rjgrv
Copy link

rjgrv commented Oct 31, 2024

pip install numpy==1.26.3
It worked!

@saidakbardev005
Copy link

import cv2
import face_recognition
import numpy as np
import mysql.connector
from datetime import datetime
from PIL import Image

Load and prepare images

image1_path = r"C:\Users\Saidakbar\Desktop\camera_loyiha\pythonProject\faces\Javohirbek.jpg"
image2_path = r"C:\Users\Saidakbar\Desktop\camera_loyiha\pythonProject\faces\Saidakbarxo'ja.jpg"

Load images with error handling

image1 = cv2.imread(image1_path)
image2 = cv2.imread(image2_path)

Agar tasvirlar yuklangan bo'lsa, ularni RGB formatga o'tkazamiz

if image1 is not None:
image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
else:
print("image1 yuklanmadi.")

if image2 is not None:
image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)
else:
print("image2 yuklanmadi.")

MySQL connection function

def connect_database():
conn = mysql.connector.connect(
host="localhost",
user="root",
password="saidakbardev714",
database="db1"
)
return conn

Save image name to MySQL

def save_image_path_to_db(img_name):
conn = connect_database()
cursor = conn.cursor()
current_date = datetime.now().date()
current_time = datetime.now().time()
cursor.execute("INSERT INTO talaba_ma'lumot (rasm, kun, vaqt) VALUES (%s, %s, %s)", (img_name, current_date, current_time))
conn.commit()
print(f"Rasm nomi '{img_name}' bazaga muvaffaqiyatli saqlandi.")
cursor.close()
conn.close()

Mark attendance

def markAttendance(name):
with open('Attendance.csv', 'r+') as f:
myDataList = f.readlines()
nameList = [line.split(',')[0] for line in myDataList]
if name not in nameList:
now = datetime.now()
dtString = now.strftime('%Y-%m-%d %H:%M:%S')
f.writelines(f'\n{name},{dtString}')

Encode images

def findEncodings(images):
encodeList = []
for img in images:
if img is None:
print("Tasvir yuklanmadi.")
continue
# Tasvirlarni RGB formatda ekanligiga ishonch hosil qilamiz
if img.dtype != np.uint8:
img = img.astype(np.uint8)
rgb_img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
encode = face_recognition.face_encodings(rgb_img)
if encode:
encodeList.append(encode[0])
else:
print("Yuz topilmadi.")
return encodeList

Tasvirlarni va ularning nomlarini ro'yxatga qo'shish

images = []
classNames = []
if image1 is not None:
images.append(image1)
classNames.append("Javohirbek")

if image2 is not None:
images.append(image2)
classNames.append("Saidakbarxo'ja")

Encode known faces

encodeListKnown = findEncodings(images)
print('Encodings Complete')

Start the camera

cap = cv2.VideoCapture(0)

while True:
success, img = cap.read()
imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)

# Detect faces and encode them
facesCurFrame = face_recognition.face_locations(imgS)
encodesCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)

# Compare faces and save to database
for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame):
    matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
    faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
    matchIndex = np.argmin(faceDis)

    if matches[matchIndex]:
        name = classNames[matchIndex].upper()
        print(name)

        save_image_path_to_db(name)
        markAttendance(name)

        y1, x2, y2, x1 = faceLoc
        y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
        cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
        cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

cv2.imshow('Webcam', img)

# 'q' tugmasi bosilsa, chiqish
if cv2.waitKey(1) & 0xFF == ord('q'):
    break

cap.release()
cv2.destroyAllWindows()
ushbu koddagi File "C:\Users\Saidakbar\Desktop\camera_loyiha\pythonProject.venv\lib\site-packages\face_recognition\api.py", line 121, in face_locations
return [_trim_css_to_bounds(_rect_to_css(face), img.shape) for face in _raw_face_locations(img, number_of_times_to_upsample, model)]
File "C:\Users\Saidakbar\Desktop\camera_loyiha\pythonProject.venv\lib\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.
ushbu hatolarni tog'irlab berilar

@Aanchal33Rana
Copy link

I am able to print the names on terminal but its not updated on the .csv and the .csv is not converting into excel...help pls

@SumitDhivar
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

thanks it's work for me

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