"""Gera graficos do benchmark 1K (811 testes).""" import json import os import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt import numpy as np plt.rcParams.update({ "figure.facecolor": "#0d1117", "axes.facecolor": "#161b22", "axes.edgecolor": "#30363d", "axes.labelcolor": "#c9d1d9", "xtick.color": "#8b949e", "ytick.color": "#8b949e", "text.color": "#c9d1d9", "grid.color": "#21262d", "grid.linestyle": "--", "grid.alpha": 0.6, "font.family": "sans-serif", "font.size": 11, }) OUTPUT_DIR = "training_plots" def load_results(path="benchmark_1k_results.json"): with open(path, "r", encoding="utf-8") as f: return json.load(f) def plot_accuracy_bars(data, save_dir): fig, axes = plt.subplots(1, 3, figsize=(16, 6)) # 1. Por modalidade ax = axes[0] modalities = ["Texto\n(401)", "Imagem\n(250)", "Audio\n(160)", "COMPOSTO\n(811)"] accs = [ data["text"]["_total"]["acc"], data["image"]["both_acc"], data["audio"]["acc"], data["composite_score"], ] colors = ["#58a6ff", "#7ee787", "#d2a8ff", "#ffa657"] bars = ax.bar(modalities, accs, color=colors, width=0.6, edgecolor="#30363d", linewidth=1.2) for bar, acc in zip(bars, accs): ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1, f"{acc:.1f}%", ha="center", va="bottom", fontsize=12, fontweight="bold", color="#c9d1d9") ax.set_ylim(0, 110) ax.set_ylabel("Acuracia (%)") ax.set_title("Por Modalidade", fontsize=13, fontweight="bold", pad=10) ax.grid(axis="y", alpha=0.3) # 2. Texto por categoria ax = axes[1] cats = [] cat_accs = [] for cat, r in data["text"].items(): if cat != "_total": label = cat.replace("(fora treino)", "\n(fora treino)") cats.append(label) cat_accs.append(r["acc"]) bar_colors = ["#58a6ff"] * len(cats) bars2 = ax.barh(cats, cat_accs, color=bar_colors, height=0.5, edgecolor="#30363d", linewidth=1) for bar, acc in zip(bars2, cat_accs): ax.text(bar.get_width() + 1, bar.get_y() + bar.get_height()/2, f"{acc:.0f}%", ha="left", va="center", fontsize=11, fontweight="bold", color="#c9d1d9") ax.set_xlim(0, 115) ax.set_xlabel("Acuracia (%)") ax.set_title("Texto por Categoria", fontsize=13, fontweight="bold", pad=10) ax.grid(axis="x", alpha=0.3) # 3. Imagem & Audio detalhe ax = axes[2] labels = ["Forma", "Cor", "Forma+Cor", "Audio"] vals = [ data["image"]["shape_acc"], data["image"]["color_acc"], data["image"]["both_acc"], data["audio"]["acc"], ] cols = ["#7ee787", "#7ee787", "#7ee787", "#d2a8ff"] bars3 = ax.bar(labels, vals, color=cols, width=0.5, edgecolor="#30363d", linewidth=1.2) for bar, acc in zip(bars3, vals): ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1, f"{acc:.1f}%", ha="center", va="bottom", fontsize=12, fontweight="bold", color="#c9d1d9") ax.set_ylim(0, 110) ax.set_ylabel("Acuracia (%)") ax.set_title("Imagem & Audio", fontsize=13, fontweight="bold", pad=10) ax.grid(axis="y", alpha=0.3) fig.suptitle( f"Benchmark 1K | Score: {data['composite_score']:.1f}% | " f"{data['total_tests']} testes (texto + img + audio)", fontsize=14, fontweight="bold", y=0.98, color="#58a6ff" ) plt.tight_layout(rect=[0, 0, 1, 0.94]) path = os.path.join(save_dir, "benchmark.png") fig.savefig(path, dpi=150, bbox_inches="tight") plt.close(fig) print(f" Salvo: {path}") def plot_radar(data, save_dir): cats_text = {k: v for k, v in data["text"].items() if k != "_total"} categories = list(cats_text.keys()) + ["Imagem", "Audio"] values = [v["acc"] for v in cats_text.values()] + [data["image"]["both_acc"], data["audio"]["acc"]] N = len(categories) angles = np.linspace(0, 2 * np.pi, N, endpoint=False).tolist() values_closed = values + [values[0]] angles += [angles[0]] fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True)) ax.set_facecolor("#161b22") fig.patch.set_facecolor("#0d1117") ax.plot(angles, values_closed, "o-", linewidth=2, color="#58a6ff", alpha=0.9) ax.fill(angles, values_closed, color="#58a6ff", alpha=0.15) short_names = [] for c in categories: c2 = c.replace("(fora treino)", "").strip() if len(c2) > 14: c2 = c2[:13] + "." short_names.append(c2) ax.set_xticks(angles[:-1]) ax.set_xticklabels(short_names, fontsize=9, color="#c9d1d9") ax.set_ylim(0, 105) ax.set_yticks([20, 40, 60, 80, 100]) ax.set_yticklabels(["20%", "40%", "60%", "80%", "100%"], fontsize=8, color="#8b949e") ax.spines["polar"].set_color("#30363d") ax.grid(color="#21262d", alpha=0.6) for angle, val in zip(angles[:-1], values): ax.text(angle, val + 5, f"{val:.0f}%", ha="center", va="bottom", fontsize=10, fontweight="bold", color="#ffa657") ax.set_title(f"Benchmark 1K - Score: {data['composite_score']:.1f}%", fontsize=14, fontweight="bold", pad=20, color="#c9d1d9") path = os.path.join(save_dir, "benchmark_radar.png") fig.savefig(path, dpi=150, bbox_inches="tight") plt.close(fig) print(f" Salvo: {path}") def main(): os.makedirs(OUTPUT_DIR, exist_ok=True) data = load_results() print(f" Score: {data['composite_score']}% | {data['total_tests']} testes") plot_accuracy_bars(data, OUTPUT_DIR) plot_radar(data, OUTPUT_DIR) print(" Done!") if __name__ == "__main__": main()