[text] data

Viewer

  1. import os
  2. import cv2
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. from sklearn.model_selection import train_test_split
  6. import tensorflow as tf
  7. from tensorflow.keras.models import Sequential
  8. from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, BatchNormalization
  9. from tensorflow.keras.preprocessing.image import ImageDataGenerator
  10.  
  11. # Path to the UTKFace dataset (use raw string)
  12. dataset_path = r'C:\Users\60111\Downloads\UTKFace'
  13.  
  14. # Function to load and preprocess images and labels
  15. def load_and_preprocess_utkface_data(dataset_path, target_size=(64, 64)):
  16.     images = []
  17.     ages = []
  18.     for file_name in os.listdir(dataset_path):
  19.         if file_name.endswith('.jpg'):
  20.             age = int(file_name.split('_')[0])
  21.             img_path = os.path.join(dataset_path, file_name)
  22.             img = cv2.imread(img_path)
  23.             img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  24.             img = cv2.resize(img, target_size)  # Resize image to target size
  25.             img = img / 255.0  # Normalize pixel values
  26.             images.append(img)
  27.             ages.append(age)
  28.     return np.array(images), np.array(ages)
  29.  
  30. # Load and preprocess images and labels
  31. images, ages = load_and_preprocess_utkface_data(dataset_path)
  32.  
  33. # Display the number of images and labels
  34. print(f'Number of images: {len(images)}')
  35. print(f'Number of labels: {len(ages)}')
  36.  
  37. # Split data into training, validation, and test sets
  38. X_train, X_temp, y_train, y_temp = train_test_split(images, ages, test_size=0.2, random_state=42)
  39. X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
  40.  
  41. print(f'Training set size: {X_train.shape}')
  42. print(f'Validation set size: {X_val.shape}')
  43. print(f'Test set size: {X_test.shape}')
  44.  
  45. # Define the model architecture with batch normalization and dropout
  46. model = Sequential([
  47.     Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)),
  48.     BatchNormalization(),
  49.     MaxPooling2D((2, 2)),
  50.     Conv2D(64, (3, 3), activation='relu'),
  51.     BatchNormalization(),
  52.     MaxPooling2D((2, 2)),
  53.     Conv2D(128, (3, 3), activation='relu'),
  54.     BatchNormalization(),
  55.     MaxPooling2D((2, 2)),
  56.     Flatten(),
  57.     Dense(128, activation='relu'),
  58.     Dropout(0.5),
  59.     Dense(1)  # Age is a single continuous value
  60. ])
  61.  
  62. model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mae'])
  63. model.summary()
  64.  
  65. # Train the model with early stopping and increased epochs
  66. early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
  67. history = model.fit(X_train, y_train, epochs=20, validation_data=(X_val, y_val), callbacks=[early_stopping])  # Set number of epochs here
  68.  
  69. # Evaluate the model on the test set
  70. test_loss, test_mae = model.evaluate(X_test, y_test)
  71. print(f'Test MAE: {test_mae}')
  72.  
  73. # Make predictions on the test set
  74. predictions = model.predict(X_test)
  75. predictions = predictions.flatten()
  76.  
  77. # Calculate Accuracy Metric (Example: Percentage within ±5 years)
  78. error_threshold = 5
  79. abs_errors = np.abs(predictions - y_test)
  80. accurate_predictions = np.sum(abs_errors <= error_threshold)
  81. accuracy_percentage = (accurate_predictions / len(y_test)) * 100
  82. print(f'Accuracy (±{error_threshold} years): {accuracy_percentage:.2f}%')
  83.  
  84. # Save the model
  85. model.save('age_prediction_model.h5')
  86.  
  87. # Display some sample predictions and images
  88. plt.figure(figsize=(15, 10))
  89. for i in range(5):
  90.     # Display the image
  91.     plt.subplot(2, 5, i + 1)
  92.     plt.imshow(X_test[i])
  93.     plt.title(f'Actual Age: {y_test[i]}')
  94.     plt.axis('off')
  95.  
  96.     # Display the predicted age
  97.     plt.subplot(2, 5, i + 6)
  98.     plt.bar(['Actual', 'Predicted'], [y_test[i], predictions[i]])
  99.     plt.ylim([0, 100])
  100.     plt.ylabel('Age')
  101.     plt.title(f'Predicted Age: {predictions[i]:.2f}')
  102.  
  103. plt.tight_layout()
  104. plt.show()
  105.  
  106. # Display training history
  107. plt.figure(figsize=(10, 5))
  108. plt.subplot(1, 2, 1)
  109. plt.plot(history.history['loss'], label='Training Loss')
  110. plt.plot(history.history['val_loss'], label='Validation Loss')
  111. plt.title('Training and Validation Loss')
  112. plt.xlabel('Epochs')
  113. plt.ylabel('Loss')
  114. plt.legend()
  115.  
  116. plt.subplot(1, 2, 2)
  117. plt.plot(history.history['mae'], label='Training MAE')
  118. plt.plot(history.history['val_mae'], label='Validation MAE')
  119. plt.title('Training and Validation MAE')
  120. plt.xlabel('Epochs')
  121. plt.ylabel('MAE')
  122. plt.legend()
  123. plt.tight_layout()
  124. plt.show()

Editor

You can edit this paste and save as new:


File Description
  • data
  • Paste Code
  • 02 Jul-2024
  • 4.36 Kb
You can Share it: