Spaces:
Sleeping
Sleeping
File size: 3,265 Bytes
a5a6a2e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | import os
import sys
from detect import detect_face_shape
# Configuration
TEST_DATASET_DIR = "/home/codernotme/Projects/Github/katariaoptics/dataset/test"
def test_accuracy():
print(f"Testing accuracy using dataset at: {TEST_DATASET_DIR}")
if not os.path.exists(TEST_DATASET_DIR):
print("Test dataset directory not found.")
return
total_images = 0
correct_predictions = 0
class_stats = {}
# Get list of classes (subdirectories)
classes = [d for d in os.listdir(TEST_DATASET_DIR) if os.path.isdir(os.path.join(TEST_DATASET_DIR, d))]
for label in classes:
folder_path = os.path.join(TEST_DATASET_DIR, label)
files = os.listdir(folder_path)
# Ground truth label (normalize to lowercase to match model classes if needed,
# though detect.py returns capitalized keys usually? Let's check model keys.)
# The model uses "heart", "oblong" etc. (lowercase) as keys in the pickle from train_means.py
# BUT detect.py / classifier.py capitalizes the keys in the return dict.
# Let's verify what classifier.py returns.
# classifier.py: return dict(sorted(probabilities.items()...)) where keys are labels.
# In train_means.py, keys are "heart", "oblong"... (lowercase).
# In classifier.py, it constructs the dict from the `means` keys.
# So classifier.py returns lowercase keys like "heart", "oblong".
# Wait, let me double check classifier.py content.
ground_truth = label.lower()
class_stats[ground_truth] = {"total": 0, "correct": 0}
print(f"Processing class {label} (Ground Truth: {ground_truth})...")
for filename in files:
img_path = os.path.join(folder_path, filename)
try:
# Run detection
result = detect_face_shape(img_path)
# Get predicted label (highest probability)
# detect.py returns dict like {'heart': 0.8, 'oval': 0.2}
if not result or "Error" in result or "Unknown" in result:
continue
predicted_label = list(result.keys())[0].lower()
total_images += 1
class_stats[ground_truth]["total"] += 1
if predicted_label == ground_truth:
correct_predictions += 1
class_stats[ground_truth]["correct"] += 1
except Exception as e:
# print(f"Error processing {filename}: {e}")
pass
if total_images == 0:
print("No images found or processed.")
return
print("\n--- Results ---")
print(f"Overall Accuracy: {correct_predictions}/{total_images} ({correct_predictions/total_images*100:.2f}%)")
print("\nPer Class Accuracy:")
for cls, stats in class_stats.items():
if stats["total"] > 0:
acc = stats["correct"] / stats["total"] * 100
print(f" {cls}: {stats['correct']}/{stats['total']} ({acc:.2f}%)")
else:
print(f" {cls}: No images")
if __name__ == "__main__":
test_accuracy()
|