hellMy lab is used for face recognition, my data is a folder call 10_celebrity, inside it has 10 sub-folder containing image in it. I build 2 function for extract face and extract feature, I wanna apply it for my dataset and append it for my next step, but it run for while and take the error Here is my data link: Kaggle Here is my code =>>
import tensorflow
import keras
from keras.preprocessing import image
import numpy as np
from tqdm import tqdm
from sklearn.metrics.pairwise import cosine_similarity
from PIL import Image
import cv2
from matplotlib import pyplot
from mtcnn import MTCNN
import os
import splitfolders
from sklearn.model_selection import train_test_split
import streamlit as st
from matplotlib import pyplot as plt
X = []
y = []
model = keras.applications.resnet50.ResNet50(
include_top=False,
input_shape=(224,224,3),
pooling='avg'
detector = MTCNN()
def extract_face_from_image(img, detector):
results = detector.detect_faces(img)
if results:
# Consider only the largest face detected
largest_face_idx = np.argmax([result['box'][2] * result['box'][3] for result in results])
x, y, width, height = results[largest_face_idx]['box']
face = img[y:y+height,x:x+width]
return face
else:
return None
def feature_extractor(image, model):
image = Image.fromarray(image)
image = image.resize((224,224))
face_array = np.asarray(image)
face_array = face_array.astype('float32')
expanded_img = np.expand_dims(face_array, axis=0)
preprocessed_img = keras.applications.efficientnet.preprocess_input(expanded_img)
result = model.predict(preprocessed_img).flatten()
return result
dataset = "10_celebrity"
for folder in os.listdir(dataset):
curr_path = os.path.join(dataset, folder)
for file in os.listdir(curr_path):
curr_file = os.path.join(curr_path, file)
image = cv2.imread(curr_file)
X.append(image)
y.append(folder)
features_list = []
for file in X:
face_image = extract_face_from_image(file, detector)
if face_image is not None:
features_list.append(feature_extractor(face_image, model))
else:
features_list.append(file)
This is error =>>
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[8], line 6
4 face_image = extract_face_from_image(file, detector)
5 if face_image is not None:
----> 6 features_list.append(feature_extractor(face_image, model))
7 else:
8 features_list.append(file)
Cell In[6], line 2
1 def feature_extractor(image, model):
----> 2 image = Image.fromarray(image)
3 image = image.resize((224,224))
4 face_array = np.asarray(image)
File ~\AppData\Roaming\Python\Python312\site-packages\PIL\Image.py:3118, in fromarray(obj, mode)
3115 else:
3116 obj = obj.tostring()
-> 3118 return frombuffer(mode, size, obj, "raw", rawmode, 0, 1)
File ~\AppData\Roaming\Python\Python312\site-packages\PIL\Image.py:3034, in frombuffer(mode, size, data, decoder_name, *args)
3031 im.readonly = 1
3032 return im
-> 3034 return frombytes(mode, size, data, decoder_name, args)
...
--> 804 d.setimage(self.im)
805 s = d.decode(data)
807 if s[0] >= 0:
ValueError: tile cannot extend outside image\
I have try to use if else for extract face for if extract face work append it to list X, if not append original, but it still didn't work. How do I fix it ? Thank you for reading.