Project ini melakukan monitoring APD (helm, masker, vest) dari kamera real-time menggunakan YOLO, lalu:
- Mendeteksi pelanggaran per pekerja (berbasis tracking ID).
- Mengambil frame bukti pelanggaran.
- Upload bukti ke ImgBB.
- Mengirim data pelanggaran + URL gambar ke backend.
File utama runtime ada di mainWithLinkImgb.py.
- Kamera dibuka dan dibaca frame-nya.
- Model YOLO melakukan deteksi + tracking (ByteTrack).
- Sistem menentukan APD apa saja yang dipakai tiap person.
- Jika terdeteksi pelanggaran, frame disimpan sementara lalu di-upload ke ImgBB.
- Setelah dapat URL gambar dari ImgBB, sistem POST JSON ke endpoint backend.
- Backend menerima payload, lalu bisa disimpan ke DB, diteruskan ke dashboard, notifikasi, dll.
Skema singkat:
Kamera -> YOLO/Tracking -> Rule Pelanggaran -> Upload ImgBB -> POST ke Backend -> DB/Dashboard
- Auto map class dari model names, dengan fallback ID.
- Tracking person per ID (persist antar frame).
- Rule pelanggaran:
not_wearing_any_apdnot_wearing_helmetnot_wearing_vestnot_wearing_maskattempt_remove_helmetattempt_remove_vestattempt_remove_mask
- Anti spam notifikasi:
- Interval waktu
- Filter jarak spasial
- Overlay tampilan deteksi + mode split view riwayat pelanggaran.
Script mengirim payload JSON berikut:
{
"camera_id": "Area Proyek A",
"label": "not_wearing_any_apd",
"image_path": "https://i.ibb.co/...jpg",
"id_pekerja": "1"
}Keterangan field:
camera_id: lokasi kamera/sumber kejadian.label: jenis pelanggaran.image_path: URL hasil upload ImgBB.id_pekerja: tracking ID pekerja (string).
Di mainWithLinkImgb.py:
IMGBB_API_KEY: dibaca otomatis dari environment variable atau file.env.SITE_LOCATION,SITE_LAT,SITE_LON,TIMEZONE_NAME: metadata lokasi.URL_BACKEND: endpoint backend tujuan.- Threshold deteksi:
CONF_THRESHOLDPERSON_CONF_THRESHOLDAPD_CONF_THRESHOLD
- Rule timing/anti spam:
MISSING_FRAMES_THRESHOLDNEVER_WEAR_FRAMESTELEGRAM_RENOTIFY_INTERVAL_SECALERT_SPATIAL_DISTANCE_PX
- Python 3.10+ (disarankan)
- Webcam
- Model file
best.pt - Internet (untuk upload ImgBB)
Python package:
- ultralytics
- opencv-python
- requests
- numpy
- Buka terminal di folder project.
- Buat virtual env.
- Aktifkan virtual env.
- Install dependency.
- Buat file
.envdari.env.example, lalu isi API key sekali saja. - Jalankan script.
Contoh PowerShell (Windows):
cd "C:\Users\ASUS\Downloads\Testing APD"
py -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install ultralytics opencv-python requests numpy
python mainWithLinkImgb.pyIsi file .env (sekali saja):
IMGBB_API_KEY=your_key_hereAlternatif (kalau tetap mau pakai environment variable):
$env:IMGBB_API_KEY="your_key_here"Set permanen (opsional):
setx IMGBB_API_KEY "your_key_here"Setelah setx, tutup lalu buka ulang terminal.
Kontrol saat runtime:
p: pause/resumes: split view ON/OFFq: quit
Pakai:
URL_BACKEND = "http://localhost:8000/report-violation"
Syarat:
- Service backend harus aktif.
- Service listen di port 8000.
- Route
POST /report-violationtersedia.
Pakai IP laptop backend, misalnya:
URL_BACKEND = "http://192.168.1.10:8000/report-violation"
Syarat di laptop backend:
- Server bind ke
0.0.0.0, bukan127.0.0.1. - Firewall mengizinkan inbound port 8000.
localhost dan IP lokal tidak bisa langsung dipakai.
Pilih salah satu:
- Deploy backend ke server publik.
- Gunakan tunnel (ngrok/Cloudflare Tunnel).
- Gunakan VPN mesh (Tailscale/ZeroTier), lalu pakai IP VPN.
Dari laptop pengirim:
Test-NetConnection -ComputerName localhost -Port 8000Atau jika backend beda laptop:
Test-NetConnection -ComputerName 192.168.1.10 -Port 8000Jika TcpTestSucceeded : False, berarti endpoint belum bisa diakses dari jaringan saat ini.
Gunakan ini jika ingin validasi integrasi cepat:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class ViolationPayload(BaseModel):
camera_id: str
label: str
image_path: str
id_pekerja: str
@app.post("/report-violation")
def report_violation(payload: ViolationPayload):
print("Incoming:", payload.model_dump())
return {"status": "ok", "message": "data diterima"}Jalankan:
uvicorn main:app --host 0.0.0.0 --port 8000Penyebab umum:
- Backend belum jalan.
- Port backend bukan 8000.
- Server hanya bind ke localhost padahal diakses dari laptop lain.
- Firewall blok port.
Sudah ditangani dengan backend kamera DirectShow di Windows. Jika masih muncul:
- Tutup aplikasi lain yang pakai webcam.
- Coba ganti urutan index kamera.
- API key invalid/expired.
- Koneksi internet bermasalah.
- Rate limit ImgBB.
- Jangan commit API key ke repo publik.
- File
.envsudah di-ignore oleh git, jadi aman untuk key lokal. - Script menerima
IMGBB_API_KEYdari.envatau environment variable.
Contoh .env lokal:
IMGBB_API_KEY=your_key_hereContoh set sementara:
$env:IMGBB_API_KEY="your_key_here"Contoh set permanen:
setx IMGBB_API_KEY "your_key_here"best.pttersedia.- Kamera terbaca.
- ImgBB upload sukses.
- Backend aktif dan bisa diakses.
- Endpoint
POST /report-violationcocok dengan payload. - Backend merespons status 200 untuk request valid.