Md Bikasuzzaman
ok
cd4de3a unverified
raw
history blame
5.01 kB
import os
import cv2
import pickle
import shutil
import numpy as np
from PIL import Image
from mtcnn import MTCNN
from numpy import asarray
from keras.preprocessing import image
from keras_vggface.vggface import VGGFace
from keras_vggface.utils import preprocess_input
import tensorflow as tf
# Configure GPU memory growth for TensorFlow
physical_devices = tf.config.list_physical_devices('GPU')
if physical_devices:
for device in physical_devices:
tf.config.experimental.set_memory_growth(device, True)
def feature_extractor(img_path):
model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg')
img = image.load_img(img_path, target_size=(224, 224))
img_array = image.img_to_array(img)
expanded_img = np.expand_dims(img_array, axis=0)
preprocessed_img = preprocess_input(expanded_img)
result = model.predict(preprocessed_img).flatten()
return result
def extract_faces_mtcnn(input_folder, output_folder, required_size=(224, 224)):
detector = MTCNN()
# if not os.path.exists(output_folder):
# os.makedirs(output_folder)
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
img_path = os.path.join(input_folder, filename)
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
if img is None:
print(f"Error reading image: {img_path}")
continue
print(img.shape)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
clahe_image = clahe.apply(img)
ConvertedImage = cv2.cvtColor(clahe_image, cv2.COLOR_GRAY2BGR)
faces = detector.detect_faces(ConvertedImage)
if faces is None or not faces:
continue
else:
for i, face_info in enumerate(faces):
x, y, w, h = face_info['box']
x, y = max(x, 0), max(y, 0)
face = img[y:y + h, x:x + w]
image_obj = Image.fromarray(face)
image_obj = image_obj.resize(required_size)
face_array = asarray(image_obj)
face_filename = f"{filename}"
output_path = os.path.join(output_folder, face_filename)
cv2.imwrite(output_path, face_array)
def delete_files_in_folder(folder_path):
try:
files = os.listdir(folder_path)
for file_name in files:
file_path = os.path.join(folder_path, file_name)
if os.path.isfile(file_path):
os.remove(file_path)
except Exception as e:
print(f"An error occurred: {e}")
def new_pickle_file(new_image_dir, update_face_dir):
pickle_file_dir = "/home/bikas/Desktop/IR/pickle"
filenames_pickle_path = os.path.join(pickle_file_dir, 'FinalFilenames.pkl')
features_pickle_path = os.path.join(pickle_file_dir, 'FeatureEmbeddings.pkl')
# Initialize existing data
if os.path.exists(filenames_pickle_path) and os.path.exists(features_pickle_path):
existing_filenames = pickle.load(open(filenames_pickle_path, 'rb'))
existing_features = pickle.load(open(features_pickle_path, 'rb'))
else:
existing_filenames = []
existing_features = []
image_files = os.listdir(new_image_dir)
if len(image_files) == 0:
# No valid image files found in the directory.
return
# Filter out already processed files
new_files = [file for file in image_files if file not in existing_filenames]
if not new_files:
# All files have already been processed
return
extract_faces_mtcnn(new_image_dir, update_face_dir)
filenames = []
features = []
image_files = os.listdir(update_face_dir)
if len(image_files) == 0:
# No valid image files found in the update face directory.
return
# Filter out already processed files
new_files = [file for file in image_files if file not in existing_filenames]
if not new_files:
# All files have already been processed
return
for person_file_name in new_files:
filenames.append(person_file_name)
# Update the existing pickle files with new data
existing_filenames.extend(filenames)
for file in filenames:
features.append(feature_extractor(os.path.join(update_face_dir, file)))
# Convert features to numpy array
if existing_features:
existing_features = np.array(existing_features)
features = np.array(features)
updated_features = np.vstack((existing_features, features))
else:
updated_features = np.array(features)
pickle.dump(existing_filenames, open(filenames_pickle_path, 'wb'))
pickle.dump(updated_features, open(features_pickle_path, 'wb'))
# Clean up the new_pickle and new_extract_face directories
delete_files_in_folder(update_face_dir)
# Delete the directory and all its contents
# shutil.rmtree(update_face_dir)
# Example usage
new_pickle_file("/home/hajj_images", "new_extract_face")