import tensorflow as tf
from keras import layers, models
from keras.preprocessing.image import ImageDataGenerator
import os
import numpy as np
from PIL import Image
class VGGFaces(tf.keras.Model):
def __init__(self):
super(VGGFaces, self).__init__()
self.conv_blocks = models.Sequential([
layers.Conv2D(64, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.Conv2D(64, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.MaxPooling2D(pool_size=2, strides=2),
layers.Conv2D(128, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.Conv2D(128, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.MaxPooling2D(pool_size=2, strides=2),
layers.Conv2D(256, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.Conv2D(256, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.Conv2D(256, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.MaxPooling2D(pool_size=2, strides=2),
layers.Conv2D(512, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.Conv2D(512, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.Conv2D(512, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.MaxPooling2D(pool_size=2, strides=2),
layers.Conv2D(512, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.Conv2D(512, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.Conv2D(512, kernel_size=3, padding='same', activation='relu'),
layers.BatchNormalization(axis=-1),
layers.MaxPooling2D(pool_size=2, strides=2),
])
self.global_pooling = layers.GlobalMaxPooling2D()
self.dense1 = layers.Dense(2048, activation='relu')
self.dense2 = layers.Dense(4, activation='linear')
def call(self, tensor):
tensor = self.conv_blocks(tensor)
tensor = self.global_pooling(tensor)
tensor = self.dense1(tensor)
tensor = self.dense2(tensor)
return tensor
def parse_annotation(annotation_path):
with open(annotation_path, 'r') as f:
line = f.read()
annotations = []
parts = line.strip().split('|')
num_people = int(parts[1])
for i in range(num_people):
bbox = parts[i+2].split(",")[:-1]
annotations.append(bbox)
return annotations
def load_and_preprocess_data(image_dir, annotation_dir):
image_paths = [os.path.join(image_dir, filename) for filename in os.listdir(image_dir)]
annotation_paths = [os.path.join(annotation_dir, filename.split('.')[0] + '.txt') for filename in os.listdir(image_dir)]
image_data = []
annotations_list = []
for image_path, annotation_path in zip(image_paths, annotation_paths):
image = tf.io.read_file(image_path)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, (224, 224))
annotations = parse_annotation(annotation_path)
image_data.append(image)
return image_data, annotations
train_images, train_annotations = load_and_preprocess_data(
r"C:\Users\Zains\OneDrive\Desktop\Coding Projects\Python Projects\faceRecognition2\trainProcessedImages",
r"C:\Users\Zains\OneDrive\Desktop\Coding Projects\Python Projects\faceRecognition2\trainAnnotationFiles"
)
val_images, val_annotations = load_and_preprocess_data(
r"C:\Users\Zains\OneDrive\Desktop\Coding Projects\Python Projects\faceRecognition2\valProcessedImages",
r"C:\Users\Zains\OneDrive\Desktop\Coding Projects\Python Projects\faceRecognition2\valAnnotationFiles"
)
batch_size = 32
train_images = np.stack(train_images)
val_images = np.stack(val_images)
train_annotations_ragged = tf.ragged.constant(train_annotations)
val_annotations_ragged = tf.ragged.constant(val_annotations)
train_annotations_dense = train_annotations_ragged.to_tensor(default_value="", shape=(12879, 4))
val_annotations_dense = val_annotations_ragged.to_tensor(default_value="", shape=(733, 4))
train_dataset = tf.data.Dataset.from_tensor_slices((train_images, train_annotations_dense))
val_dataset = tf.data.Dataset.from_tensor_slices((val_images, val_annotations_dense))
model = VGGFaces()
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss=tf.keras.losses.mean_squared_error,
metrics=[tf.keras.metrics.MeanIoU(num_classes=2)],
)
checkpoint_path = "faceDetectionModel.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_path,
save_weights_only=True,
verbose=1,
save_best_only=True
)
epochs = 20
model.fit(
train_dataset,
epochs=epochs,
validation_data=val_dataset,
callbacks=[cp_callback]
)
test_loss, test_iou = model.evaluate(val_dataset)
print(f"Test Loss: {test_loss:.4f}")
print(f"Test IoU: {test_iou:.4f}")
i am currently getting the error:
PS C:\Users\Zains\OneDrive\Desktop\Coding Projects\Python Projects\faceRecognition2> python -u "c:\Users\Zains\OneDrive\Desktop\Coding Projects\Python Projects\faceRecognition2\blah2.py"
2023-08-30 15:19:59.186145: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: SSE SSE2 SSE3 SSE4.1 SSE4.2 AVX AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-08-30 15:21:11.413312: W tensorflow/tsl/framework/cpu_allocator_impl.cc:83] Allocation of 7754600448 exceeds 10% of free system memory.
Epoch 1/20
Traceback (most recent call last):
File "c:\Users\Zains\OneDrive\Desktop\Coding Projects\Python Projects\faceRecognition2\blah2.py", line 133, in <module>
model.fit(
File "C:\Users\Zains\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler
raise e.with_traceback(filtered_tb) from None
File "C:\Users\Zains\AppData\Local\Temp\__autograph_generated_filexleyrxv7.py", line 15, in tf__train_function
retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope)
^^^^^
File "C:\Users\Zains\AppData\Local\Temp\__autograph_generated_filerbrioefb.py", line 10, in tf__call
tensor = ag__.converted_call(ag__.ld(self).conv_blocks, (ag__.ld(tensor),), None, fscope)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: in user code:
File "C:\Users\Zains\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\engine\training.py", line 1338, in train_function *
return step_function(self, iterator)
File "C:\Users\Zains\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\engine\training.py", line 1322, in step_function **
outputs = model.distribute_strategy.run(run_step, args=(data,))
File "C:\Users\Zains\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\engine\training.py", line 1303, in run_step **
outputs = model.train_step(data)
File "C:\Users\Zains\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\engine\training.py", line 1080, in train_step
y_pred = self(x, training=True)
File "C:\Users\Zains\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler
raise e.with_traceback(filtered_tb) from None
File "C:\Users\Zains\AppData\Local\Temp\__autograph_generated_filerbrioefb.py", line 10, in tf__call
tensor = ag__.converted_call(ag__.ld(self).conv_blocks, (ag__.ld(tensor),), None, fscope)
ValueError: Exception encountered when calling layer 'vgg_faces' (type VGGFaces).
in user code:
File "c:\Users\Zains\OneDrive\Desktop\Coding Projects\Python Projects\faceRecognition2\blah2.py", line 53, in call *
tensor = self.conv_blocks(tensor)
File "C:\Users\Zains\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler **
raise e.with_traceback(filtered_tb) from None
File "C:\Users\Zains\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\engine\input_spec.py", line 253, in assert_input_compatibility
raise ValueError(
ValueError: Exception encountered when calling layer 'sequential' (type Sequential).
Input 0 of layer "conv2d" is incompatible with the layer: expected min_ndim=4, found ndim=3. Full shape received: (224, 224, 3)
Call arguments received by layer 'sequential' (type Sequential):
• inputs=tf.Tensor(shape=(224, 224, 3), dtype=float32)
• training=True
• mask=None
Call arguments received by layer 'vgg_faces' (type VGGFaces):
• tensor=tf.Tensor(shape=(224, 224, 3), dtype=float32)
Does anyone know how I can fix this?