# ============================================================================= # ZenAI KPC edge counter + dashboard # Shared config for: counter_live_rknn.py + counter_dashboard.py # # On device: # cp env.example .env && nano .env # # Install path (systemd): /opt/zenai-kpc-python # Data path: /opt/zenai-kpc-counter # See DEPLOY.md for full setup instructions. # ============================================================================= # --- Core paths --- OUTPUT_DIR=/opt/zenai-kpc-counter DB_PATH=/opt/zenai-kpc-counter/counter.db STATE_FILE=/opt/zenai-kpc-counter/current_counter.json # --- Input source --- SOURCE=rtsp://192.168.192.250:8554/my_stream_1 OPENCV_FFMPEG_CAPTURE_OPTIONS=rtsp_transport;tcp|fflags;nobuffer|flags;low_delay # --- RKNN model --- MODEL_PATH=/opt/models/zenai_kac_sukawarna_20260716.rknn IMGSZ=320 HALF=false CORE_MASK=7 DEVICE=0 # --- YOLO decoder --- NUM_CLASSES=1 SCORE_SIGMOID=false # --- Detection --- CONF=0.6 NMS_IOU=0.9 # --- ByteTrack tracking --- TRACK_HIGH_THRESH=0.6 TRACK_LOW_THRESH=0.4 TRACK_MATCH_THRESH=0.8 TRACK_BUFFER=60 TRACK_MIN_HITS=3 # --- ID-switch counting guards --- DEDUP_FRAMES=15 DEDUP_PX=60 INHERIT_SEC=1.0 INHERIT_PX=60 INHERIT_CROSS_MAX_DY=40 # --- Display --- SITE_NAME=ZenAi # --- Object class names --- CAMERA_NAME=ZenAi OBJECT_LABEL=karung CLASS_OBJECT=karung OBJECT_CLASS_ID=0 # --- Line crossing --- LINE_Y1= LINE_Y1_FRAC=0.70 LINE_Y2= LINE_Y2_FRAC=0.30 # --- Counting day management --- DAILY_CUTOFF_TIME=00:00 CUTOFF_TIME=00:00 # --- CSV export --- EXPORT_CSV=false CROSS_CSV=/opt/zenai-kpc-counter/crossings.csv # --- Crossing snapshots --- SAVE_CROSS_SNAPSHOT=true SAVE_DETECT_SNAPSHOT=false CROSS_SNAPSHOT_DIR=/opt/zenai-kpc-counter/snapshots CROSS_SNAPSHOT_QUALITY=85 CROSS_SNAPSHOT_MAX_FILES=1000 CROSS_SNAPSHOT_MAX_AGE_DAYS=3 CROSS_SNAPSHOT_CLEANUP_SEC=3600 # --- Rate / performance --- MOTION_DETECTION_ENABLED=true MOTION_PIXEL_DELTA=25 MOTION_MIN_AREA_FRAC=0.002 MOTION_HEARTBEAT_FRAMES=15 MOTION_THRESHOLD=5.0 # --- Video recording (ByteTrack-style session) --- # When true, record raw frames for each counting session RECORD_VIDEO=false # session = encode in SHM, start on webhook IN/OUT (or control ON), stop on OFF # segment = legacy continuous hourly files under OUTPUT_DIR RECORD_MODE=session # Pending MP4 while session is active (tmpfs / RAM) SHM_DIR=/dev/shm/zenai-kpc-counter # Finished MP4 destination (use NFS mount here if desired). Defaults to OUTPUT_DIR. VIDEO_OUTPUT_DIR=/opt/zenai-kpc-counter # Extra seconds to keep recording after session end (IN/OUT → OFF) RECORD_END_DELAY=1 # Delete pending clip if no object was counted during the session RECORD_DISCARD_EMPTY=true # Delete day folders under VIDEO_OUTPUT_DIR older than this many days (0 = off) RECORD_RETENTION_DAYS=3 # H.264 quality via OpenCV FFmpeg writer (empty = default). Lower CRF = better. RECORD_CRF=18 RECORD_PRESET=slow # Legacy segment length (only when RECORD_MODE=segment) VIDEO_SEGMENT_SEC=3600 OUTPUT_FPS=15 # --- Runtime control (start/stop counting on the fly) --- CONTROL_ENABLED=false CONTROL_FILE=/opt/zenai-kpc-counter/control.json CONTROL_DEFAULT_COUNTING=true CONTROL_POLL_SEC=1.0 CONTROL_SOCKET_ENABLED=false CONTROL_SOCKET_HOST=127.0.0.1 CONTROL_SOCKET_PORT=5090 # --- Status webhook gate (count only when status is IN or OUT) --- STATUS_WEBHOOK_ENABLED=true STATUS_WEBHOOK_FILE=/opt/zenai-kpc-python/status_webhook_state.json STATUS_WEBHOOK_ACTIVE_VALUES=IN,OUT STATUS_WEBHOOK_INACTIVE_VALUE=OFF # Sliding window in seconds for computing the crossing rate (objects/minute) RATE_WINDOW_SEC=60 WARMUP_FRAMES=30 RECONNECT_DELAY_SEC=3 MAX_RECONNECT_ATTEMPTS=0 # Max stream-error logs per outage; resets when stream recovers. 0 = unlimited. STREAM_ERROR_LOG_MAX=3 TRACKED_PRUNE_SEC=300 # --- Live stream snapshot --- LIVE_STREAM_ENABLED=true LIVE_STREAM_FRAME_PATH=/dev/shm/zenai-kpc-counter/live_frame.jpg LIVE_STREAM_QUALITY=75 LIVE_STREAM_EVERY_N=2 # --- Dashboard (counter_dashboard.py) --- SECRET_KEY=change-me-in-production DASHBOARD_HOST=0.0.0.0 DASHBOARD_PORT=7000 FLASK_DEBUG=false # Debug: set DEBUG_TRACKING=true to log per-frame tracking details to stdout DEBUG_TRACKING=true