mirror of
https://github.com/hacksider/Deep-Live-Cam.git
synced 2026-07-15 14:37:24 +02:00
8d727eba3e
`find_cluster_centroids()` iterates `k` from 1..`max_k` unconditionally. If `len(embeddings) < max_k`, `KMeans(n_clusters=k)` will raise `ValueError` when `k` exceeds the number of samples. This is an unhandled crash path on small datasets. Affected files: cluster_analysis.py Signed-off-by: Nguyen Van Nam <nam.nv205106@gmail.com>
43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
import numpy as np
|
|
from sklearn.cluster import KMeans
|
|
from typing import Any
|
|
|
|
|
|
def find_cluster_centroids(embeddings, max_k=10) -> Any:
|
|
n_samples = len(embeddings)
|
|
if n_samples == 0:
|
|
raise ValueError("embeddings must not be empty")
|
|
if max_k < 1:
|
|
raise ValueError("max_k must be at least 1")
|
|
|
|
max_k = min(max_k, n_samples)
|
|
if max_k == 1:
|
|
kmeans = KMeans(n_clusters=1, random_state=0)
|
|
kmeans.fit(embeddings)
|
|
return kmeans.cluster_centers_
|
|
|
|
inertia = []
|
|
cluster_centroids = []
|
|
K = range(1, max_k+1)
|
|
|
|
for k in K:
|
|
kmeans = KMeans(n_clusters=k, random_state=0)
|
|
kmeans.fit(embeddings)
|
|
inertia.append(kmeans.inertia_)
|
|
cluster_centroids.append({"k": k, "centroids": kmeans.cluster_centers_})
|
|
|
|
diffs = [inertia[i] - inertia[i+1] for i in range(len(inertia)-1)]
|
|
optimal_centroids = cluster_centroids[diffs.index(max(diffs)) + 1]['centroids']
|
|
|
|
return optimal_centroids
|
|
|
|
def find_closest_centroid(centroids: list, normed_face_embedding) -> list:
|
|
try:
|
|
centroids = np.array(centroids)
|
|
normed_face_embedding = np.array(normed_face_embedding)
|
|
similarities = np.dot(centroids, normed_face_embedding)
|
|
closest_centroid_index = np.argmax(similarities)
|
|
|
|
return closest_centroid_index, centroids[closest_centroid_index]
|
|
except ValueError:
|
|
return None |