firgiawann commited on
Commit
0b16c83
·
verified ·
1 Parent(s): 420e2a4

Remove manual actual label input and auto-update evaluation panel (update 26)

Browse files
Files changed (3) hide show
  1. CHANGELOG.md +5 -0
  2. README.md +2 -0
  3. 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", "25")
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
- actual_label = gr.Radio(
1438
- choices=EVAL_CLASSES,
1439
- value="Person",
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=update_evaluation,
1503
- inputs=[cm_state, predicted_state, actual_label],
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(