beefresearch-bima / src /evaluation.py
abrarwahid's picture
Initial clean version for pipeline
78aefa8
Raw
History Blame Contribute Delete
2.4 kB
"""Komparasi SIFT vs SURF: efisiensi komputasi & kualitas separabilitas klaster."""
import os
import pandas as pd
import config
def build_efficiency_table(manifest, timing_records):
"""
timing_records: dict {method: {filename: {"elapsed_sec":.., "n_keypoints":..}}}
Mengembalikan DataFrame panjang (long-format) siap untuk boxplot/agregasi.
"""
rows = []
for method, per_file in timing_records.items():
for filename, rec in per_file.items():
rows.append({
"method": method.upper(),
"filename": filename,
"elapsed_sec": rec["elapsed_sec"],
"n_keypoints": rec["n_keypoints"],
})
return pd.DataFrame(rows)
def summarize_efficiency(df_efficiency):
"""Ringkasan statistik (mean/median/std) waktu & jumlah keypoint per metode."""
summary = df_efficiency.groupby("method").agg(
mean_elapsed_sec=("elapsed_sec", "mean"),
median_elapsed_sec=("elapsed_sec", "median"),
std_elapsed_sec=("elapsed_sec", "std"),
mean_n_keypoints=("n_keypoints", "mean"),
median_n_keypoints=("n_keypoints", "median"),
std_n_keypoints=("n_keypoints", "std"),
n_images=("filename", "count"),
).reset_index()
return summary
def build_cluster_metrics_table(results):
"""
results: list of dict, masing-masing hasil satu kombinasi
{feature: "SIFT"/"SURF", method: "kmeans"/"gmm"/"agglomerative",
codebook_size: int, **internal_metrics, **external_metrics(optional)}
"""
return pd.DataFrame(results)
def save_table(df, filename, tables_dir=None):
tables_dir = config.TABLES_DIR if tables_dir is None else tables_dir
os.makedirs(tables_dir, exist_ok=True)
out_path = os.path.join(tables_dir, filename)
df.to_csv(out_path, index=False)
return out_path
def pick_best_feature(cluster_metrics_df, primary_metric="silhouette_score",
higher_is_better=True):
"""
Menentukan metode fitur (SIFT/SURF) mana yang secara rata-rata memberi
separabilitas klaster terbaik, sebagai kesimpulan kuantitatif untuk
laporan komparasi (luaran wajib proposal).
"""
agg = cluster_metrics_df.groupby("feature")[primary_metric].mean()
if agg.empty:
return None, agg
best = agg.idxmax() if higher_is_better else agg.idxmin()
return best, agg