Files
broiler-chicken-detection-b…/System_Plan_Detection_by_Case.md
2026-07-29 15:01:28 +07:00

6.1 KiB
Raw Permalink Blame History

Detection by Case

Sistem Review Visual Batch Ayam Potong Salatiga & Cicalengka


1. Latar Belakang

Sistem real-time counting yang sudah berjalan di Salatiga dan Cicalengka menghasilkan log batch harian secara otomatis. Namun dalam beberapa kondisi lapangan — seperti batch dengan selisih hitungan signifikan, anomali jumlah, atau kasus yang perlu diinvestigasi lebih lanjut — tim membutuhkan cara untuk mereview rekaman batch tertentu secara visual tanpa harus menganalisis raw video secara manual.

Sistem "Detection by Case" hadir sebagai solusi on-demand yang memungkinkan user mengupload rekaman video batch tertentu, memproses inferensi menggunakan model yang sama dengan sistem real-time, dan menghasilkan video beranotasi untuk keperluan review.


2. Tujuan Sistem

  • Memungkinkan user mereview visual counting pada batch tertentu yang dicurigai bermasalah
  • Menghasilkan video beranotasi dengan skeleton pose, bounding box, ID tracking, dan overlay count
  • Tidak mengganggu resource dan operasional sistem real-time yang sedang berjalan
  • Tidak menyimpan data video secara permanen di storage Jetson

3. Ruang Lingkup

Sistem ini mencakup dua unit produksi:

  • Ayam Potong Salatiga
  • Ayam Potong Cicalengka

Masing-masing unit menggunakan model pose estimation yang sudah ditraining sesuai kondisi lapangan masing-masing.


4. Arsitektur Sistem

4.1 Komponen Utama

Komponen Keterangan
Web Interface Form upload video, pilih unit (Salatiga/Cicalengka), tombol proses, progress indicator, dan tombol download hasil
Backend API Flask/FastAPI yang menerima upload, mengelola antrian proses, menjalankan inference, dan menyajikan file hasil untuk didownload
Inference Engine Model YOLOv8n-pose / YOLO11n-pose yang sudah ditraining per unit, dijalankan on-demand saat ada request
Job Queue Antrian pemrosesan video — hanya satu video diproses dalam satu waktu untuk menjaga performa Jetson
Temp Storage File video input dan output disimpan sementara di /tmp, dihapus otomatis setelah proses download selesai

4.2 Alur Proses

User upload video
        ↓
Pilih unit (Salatiga / Cicalengka) → load model yang sesuai
        ↓
Video disimpan sementara di /tmp → masuk antrian
        ↓
Inference + render annotated video
        ↓
File tersedia untuk download
        ↓
Download selesai → semua file temp dihapus otomatis

4.3 Mekanisme Temporary Storage

Seluruh file video — baik input maupun output — tidak pernah disimpan secara permanen di storage Jetson. Mekanisme yang digunakan:

  • File input: disimpan di /tmp menggunakan Python tempfile module dengan auto-delete
  • File output: disimpan di /tmp selama proses render berlangsung
  • Setelah download selesai: file dihapus otomatis melalui cleanup callback
  • Jika proses gagal atau timeout: file dihapus melalui error handler
  • /tmp dapat dikonfigurasi sebagai tmpfs (RAM-based) untuk zero disk footprint

5. Fitur Utama

5.1 Web Interface

  • Pilih unit: Salatiga atau Cicalengka (menentukan model yang digunakan)
  • Upload video rekaman batch (format MP4, AVI, MOV)
  • Progress bar yang menampilkan status pemrosesan secara real-time
  • Estimasi waktu selesai berdasarkan durasi video
  • Tombol download hasil video beranotasi
  • Informasi ringkas hasil: total count, durasi video, jumlah batch terdeteksi

5.2 Output Video Beranotasi

  • Skeleton pose per ayam dengan color-coded connections
  • Bounding box dengan tracking ID per individu ayam
  • Counting line dengan counter yang terupdate real-time
  • HUD: total count, timestamp, nama unit
  • Highlight visual saat talenan terdeteksi (batch closing event)

5.3 Job Queue

  • Hanya satu video diproses dalam satu waktu
  • User yang upload saat sistem sedang memproses akan mendapat notifikasi posisi antrian
  • Estimasi waktu tunggu ditampilkan berdasarkan durasi video dalam antrian

6. Batasan Sistem

  • Hanya satu video dapat diproses dalam satu waktu — tidak support concurrent processing
  • Ukuran file upload dibatasi (rekomendasi maksimal 500MB atau 5 menit video) untuk menjaga performa
  • Tidak ada penyimpanan history — setiap sesi adalah independen, tidak ada log riwayat upload
  • Sistem ini berjalan on-demand dan tidak boleh dijalankan bersamaan dengan proses berat lainnya di Jetson

7. Tech Stack

Layer Teknologi
Backend Python — Flask atau FastAPI
Inference Ultralytics YOLOv8n-pose / YOLO11n-pose (.pt atau .engine)
Video processing OpenCV (cv2)
Frontend HTML/CSS/JS — minimal, tidak perlu framework berat
Real-time progress Server-Sent Events (SSE) atau WebSocket
Temp file management Python tempfile + atexit cleanup
Job queue Python threading.Queue atau Redis Queue (opsional)
Hardware NVIDIA Jetson Orin Nano (same device as real-time counter)

8. Pertimbangan Performa

Sistem ini berjalan di hardware yang sama dengan sistem real-time counting. Beberapa pertimbangan penting:

  • Detection by Case hanya boleh digunakan saat sistem real-time sedang tidak aktif, atau dengan pembatasan resource yang ketat
  • Estimasi waktu render: video 15 menit ≈ 10–20 menit processing di Jetson Orin Nano
  • GPU memory harus dibebaskan dari proses lain sebelum menjalankan inference on-demand
  • Implementasi dapat ditambahkan flag/lock yang mencegah upload saat real-time counter sedang aktif

9. Tahapan Pengembangan

Fase Deliverable
Fase 1 — Backend API upload, inference pipeline, temp file management, download endpoint
Fase 2 — Interface Web UI upload form, progress indicator, download button
Fase 3 — Queue Job queue, antrian notifikasi, estimasi waktu tunggu
Fase 4 — Testing Uji coba dengan rekaman nyata Salatiga dan Cicalengka, validasi output visual

10. Catatan

  • Model yang digunakan harus sesuai per unit — model Salatiga tidak digunakan untuk video Cicalengka dan sebaliknya, karena kondisi lapangan berbeda
  • Sistem ini bukan pengganti review manual, melainkan alat bantu visual untuk mempercepat investigasi kasus tertentu
  • Perlu didiskusikan apakah sistem ini perlu autentikasi mengingat video rekaman cutting house bersifat internal