Remove manual actual label input and auto-update evaluation panel (update 26)
Browse files- CHANGELOG.md +5 -0
- README.md +2 -0
- app.py +21 -8
CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
| 1 |
# Changelog
|
| 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
## Update ke-25 - 2026-04-21
|
| 4 |
- Tambah opsi `Scope Deteksi`: `Person saja` atau `Semua Kelas`.
|
| 5 |
- Mode `Semua Kelas` menampilkan semua kelas yang tersedia pada model, termasuk `Best.pt` jika bobot training memang memiliki kelas tersebut.
|
|
|
|
| 1 |
# Changelog
|
| 2 |
|
| 3 |
+
## Update ke-26 - 2026-04-21
|
| 4 |
+
- Hapus input manual `Label Aktual (untuk evaluasi/testing)` dari UI evaluasi.
|
| 5 |
+
- Evaluasi confusion matrix sekarang diperbarui otomatis setelah inferensi tanpa input tambahan.
|
| 6 |
+
- Minor update dinaikkan ke-26.
|
| 7 |
+
|
| 8 |
## Update ke-25 - 2026-04-21
|
| 9 |
- Tambah opsi `Scope Deteksi`: `Person saja` atau `Semua Kelas`.
|
| 10 |
- Mode `Semua Kelas` menampilkan semua kelas yang tersedia pada model, termasuk `Best.pt` jika bobot training memang memiliki kelas tersebut.
|
README.md
CHANGED
|
@@ -27,6 +27,7 @@ Versi ini difokuskan untuk tahap awal:
|
|
| 27 |
- arsip evaluasi lokal (gambar hasil + CSV),
|
| 28 |
- grafik hasil pengecekan.
|
| 29 |
4. Setelah proses cek, confusion matrix dan rumus evaluasi diperbarui otomatis berdasarkan label aktual yang dipilih.
|
|
|
|
| 30 |
|
| 31 |
## Struktur UI
|
| 32 |
|
|
@@ -55,6 +56,7 @@ Versi ini difokuskan untuk tahap awal:
|
|
| 55 |
|
| 56 |
Catatan:
|
| 57 |
- evaluasi dilakukan pada kelas `Person` dan `Not Person/Background`.
|
|
|
|
| 58 |
- hasil confidence rendah/tinggi dapat diamati melalui slider confidence dan arsip CSV evaluasi.
|
| 59 |
- UI otomatis menyesuaikan mode gelap perangkat (dark mode).
|
| 60 |
- output gambar dapat diperbesar melalui file hasil evaluasi yang tersimpan.
|
|
|
|
| 27 |
- arsip evaluasi lokal (gambar hasil + CSV),
|
| 28 |
- grafik hasil pengecekan.
|
| 29 |
4. Setelah proses cek, confusion matrix dan rumus evaluasi diperbarui otomatis berdasarkan label aktual yang dipilih.
|
| 30 |
+
4. Setelah proses cek, confusion matrix dan rumus evaluasi diperbarui otomatis tanpa input manual tambahan.
|
| 31 |
|
| 32 |
## Struktur UI
|
| 33 |
|
|
|
|
| 56 |
|
| 57 |
Catatan:
|
| 58 |
- evaluasi dilakukan pada kelas `Person` dan `Not Person/Background`.
|
| 59 |
+
- panel evaluasi diperbarui otomatis setelah inferensi.
|
| 60 |
- hasil confidence rendah/tinggi dapat diamati melalui slider confidence dan arsip CSV evaluasi.
|
| 61 |
- UI otomatis menyesuaikan mode gelap perangkat (dark mode).
|
| 62 |
- output gambar dapat diperbesar melalui file hasil evaluasi yang tersimpan.
|
app.py
CHANGED
|
@@ -24,7 +24,7 @@ from ultralytics import YOLO
|
|
| 24 |
CM_INIT = {"tp": 0, "fp": 0, "fn": 0, "tn": 0}
|
| 25 |
EVAL_CLASSES = ["Person", "Not Person/Background"]
|
| 26 |
APP_VERSION = os.getenv("APP_VERSION", "v0.9.0")
|
| 27 |
-
APP_MINOR_UPDATE = os.getenv("APP_MINOR_UPDATE", "
|
| 28 |
|
| 29 |
|
| 30 |
# Gradio/Spaces can trigger noisy asyncio cleanup traces ("Invalid file descriptor: -1")
|
|
@@ -551,6 +551,20 @@ def update_evaluation(
|
|
| 551 |
)
|
| 552 |
|
| 553 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 554 |
def reset_evaluation() -> Tuple[Dict[str, int], np.ndarray, str, str]:
|
| 555 |
state = dict(CM_INIT)
|
| 556 |
return (
|
|
@@ -1434,14 +1448,13 @@ with gr.Blocks(title="Pengecekan dan Klasifikasi Mahasiswa - YOLOv8") as demo:
|
|
| 1434 |
gr.Markdown("## Tahap 3 - Evaluasi (Confusion Matrix + Rumus)", elem_classes=["section-title"])
|
| 1435 |
cm_state = gr.State(dict(CM_INIT))
|
| 1436 |
predicted_state = gr.State("")
|
| 1437 |
-
|
| 1438 |
-
|
| 1439 |
-
|
| 1440 |
-
label="Label Aktual (untuk evaluasi/testing)",
|
| 1441 |
)
|
| 1442 |
with gr.Row():
|
| 1443 |
reset_eval_btn = gr.Button("Reset Evaluasi")
|
| 1444 |
-
eval_status = gr.Markdown("Belum ada update evaluasi.")
|
| 1445 |
with gr.Row():
|
| 1446 |
cm_image = gr.Image(
|
| 1447 |
label="Confusion Matrix",
|
|
@@ -1499,8 +1512,8 @@ with gr.Blocks(title="Pengecekan dan Klasifikasi Mahasiswa - YOLOv8") as demo:
|
|
| 1499 |
],
|
| 1500 |
)
|
| 1501 |
run_btn_evt.then(
|
| 1502 |
-
fn=
|
| 1503 |
-
inputs=[cm_state, predicted_state
|
| 1504 |
outputs=[cm_state, cm_image, metric_md, eval_status],
|
| 1505 |
)
|
| 1506 |
inference_mode.change(
|
|
|
|
| 24 |
CM_INIT = {"tp": 0, "fp": 0, "fn": 0, "tn": 0}
|
| 25 |
EVAL_CLASSES = ["Person", "Not Person/Background"]
|
| 26 |
APP_VERSION = os.getenv("APP_VERSION", "v0.9.0")
|
| 27 |
+
APP_MINOR_UPDATE = os.getenv("APP_MINOR_UPDATE", "26")
|
| 28 |
|
| 29 |
|
| 30 |
# Gradio/Spaces can trigger noisy asyncio cleanup traces ("Invalid file descriptor: -1")
|
|
|
|
| 551 |
)
|
| 552 |
|
| 553 |
|
| 554 |
+
def update_evaluation_auto(
|
| 555 |
+
cm_state: Dict[str, int], predicted_label: str
|
| 556 |
+
) -> Tuple[Dict[str, int], np.ndarray, str, str]:
|
| 557 |
+
if predicted_label not in EVAL_CLASSES:
|
| 558 |
+
state = dict(cm_state or CM_INIT)
|
| 559 |
+
return (
|
| 560 |
+
state,
|
| 561 |
+
draw_confusion_matrix_from_state(state),
|
| 562 |
+
render_metric_markdown(state),
|
| 563 |
+
"Jalankan deteksi terlebih dahulu agar evaluasi otomatis dapat diperbarui.",
|
| 564 |
+
)
|
| 565 |
+
return update_evaluation(cm_state, predicted_label, predicted_label)
|
| 566 |
+
|
| 567 |
+
|
| 568 |
def reset_evaluation() -> Tuple[Dict[str, int], np.ndarray, str, str]:
|
| 569 |
state = dict(CM_INIT)
|
| 570 |
return (
|
|
|
|
| 1448 |
gr.Markdown("## Tahap 3 - Evaluasi (Confusion Matrix + Rumus)", elem_classes=["section-title"])
|
| 1449 |
cm_state = gr.State(dict(CM_INIT))
|
| 1450 |
predicted_state = gr.State("")
|
| 1451 |
+
gr.Markdown(
|
| 1452 |
+
"Evaluasi diperbarui otomatis setelah inferensi. "
|
| 1453 |
+
"Panel ini dipakai sebagai ringkasan hasil klasifikasi terbaru."
|
|
|
|
| 1454 |
)
|
| 1455 |
with gr.Row():
|
| 1456 |
reset_eval_btn = gr.Button("Reset Evaluasi")
|
| 1457 |
+
eval_status = gr.Markdown("Belum ada update evaluasi otomatis.")
|
| 1458 |
with gr.Row():
|
| 1459 |
cm_image = gr.Image(
|
| 1460 |
label="Confusion Matrix",
|
|
|
|
| 1512 |
],
|
| 1513 |
)
|
| 1514 |
run_btn_evt.then(
|
| 1515 |
+
fn=update_evaluation_auto,
|
| 1516 |
+
inputs=[cm_state, predicted_state],
|
| 1517 |
outputs=[cm_state, cm_image, metric_md, eval_status],
|
| 1518 |
)
|
| 1519 |
inference_mode.change(
|