wardrobe-ai / src /scripts /test_classifier.py
elalber2000's picture
first commit
59830d4 verified
from pathlib import Path
import numpy as np
import pandas as pd
from PIL import Image
from sentence_transformers import SentenceTransformer
from utils.classifier import ClothesClassifier
from utils.utils import SRC_PATH, encode_images, encode_texts, load_image_paths
from config import cnf
def load_images(paths: list[Path]) -> list[Image.Image]:
return [Image.open(path).convert("RGB") for path in paths]
def classify_categories(
image_embeddings: np.ndarray,
labels: list[str],
prototypes: np.ndarray,
minimum_similarity: float = 0.20,
minimum_margin: float = 0.015,
) -> pd.DataFrame:
similarities = image_embeddings @ prototypes.T
best_indices = similarities.argmax(axis=1)
sorted_scores = np.sort(similarities, axis=1)
best_scores = sorted_scores[:, -1]
second_best_scores = sorted_scores[:, -2]
margins = best_scores - second_best_scores
predictions = []
for best_index, best_score, margin in zip(
best_indices,
best_scores,
margins,
):
if best_score < minimum_similarity or margin < minimum_margin:
predictions.append("other")
else:
predictions.append(labels[best_index])
result = pd.DataFrame(
similarities,
columns=labels,
)
result["prediction"] = predictions
result["best_similarity"] = best_scores
result["margin"] = margins
return result
if __name__ == "__main__":
data_dir = SRC_PATH / "data" / "images"
image_paths = load_image_paths(data_dir)
images = load_images(image_paths)
classifier = ClothesClassifier(
model_name=cnf.emb_model_name,
minimum_similarity=cnf.minimum_similarity,
minimum_margin=cnf.minimum_margin,
)
print(classifier.classify(images))