From bc454645114e42c1b9113dfd1070ef975ce719a3 Mon Sep 17 00:00:00 2001 From: dsutanto Date: Tue, 30 Jun 2026 18:58:32 +0700 Subject: [PATCH] Second Commit --- README.md | 155 +++++++++++++++++++++++++++++++++++++++ cmd/counter/main.go | 10 +-- go.mod | 2 +- pkg/bytetrack/tracker.go | 4 +- pkg/yolo/yolo.go | 2 +- 5 files changed, 164 insertions(+), 9 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..144bf58 --- /dev/null +++ b/README.md @@ -0,0 +1,155 @@ +# bytetrack-counter-go + +Edge-computing live video analytics counter for industrial poultry processing. Connects to an RTSP camera, runs YOLO object detection on a Rockchip RKNN NPU, tracks objects with ByteTrack, and counts chickens ("ayam") crossing a virtual line. Closes counting batches when a cutting board ("talenan") crosses the line. Persists batch data to SQLite. + +## Architecture + +``` +RTSP Camera --> gocv.VideoCapture --> YOLO (RKNN NPU) --> ByteTrack + | + Line-Crossing Logic + | + +-----> BatchStore (SQLite) + | + HUD Drawing --> Video Output / Live JPEG +``` + +## Requirements + +- **Rockchip RK3588** (or compatible) with RKNN NPU +- **librknnrt** (Rockchip RKNN Runtime library, `>=1.6.0`) +- **OpenCV 4.x** with GoCV bindings +- **Go 1.23+** +- **CGo enabled** (required for RKNN and GoCV) + +### Installing GoCV / OpenCV + +On RK3588 (Armbian/Ubuntu): + +```bash +sudo apt install -y libopencv-dev pkg-config +go get -u gocv.io/x/gocv +``` + +### Installing librknnrt + +```bash +# Copy librknnrt.so to the device (obtained from Rockchip SDK) +sudo cp librknnrt.so /usr/lib/aarch64-linux-gnu/ +sudo ldconfig +``` + +Verify: + +```bash +ls /usr/lib/aarch64-linux-gnu/librknnrt.so +# Should also have: librknn_rk3588.so or similar NPU driver +``` + +## Compiling + +Clone and build: + +```bash +git clone https://git.proit.id/dsutanto/bytetrack-counter-go.git +cd bytetrack-counter-go +CGO_ENABLED=1 go build -o counter ./cmd/counter/ +``` + +The `-o counter` flag places the binary at `./counter`. For production, copy it to `/opt/bytetrack-counter-go/counter`. + +To verify the binary links correctly: + +```bash +ldd ./counter | grep rknn +# Should show librknnrt.so => /usr/lib/aarch64-linux-gnu/librknnrt.so +``` + +### Cross-compiling from amd64 + +```bash +CGO_ENABLED=1 GOOS=linux GOARCH=arm64 \ + CGO_LDFLAGS="-L/path/to/rknn-libs -lrknnrt" \ + go build -o counter ./cmd/counter/ +``` + +## Configuration + +All configuration is via environment variables. Copy the example and edit: + +```bash +cp config.env.example .env +nano .env +``` + +Key settings: + +| Variable | Default | Description | +|----------|---------|-------------| +| `SOURCE` | — | RTSP URL or video file path (required) | +| `MODEL_PATH` | — | Path to `.rknn` YOLO model (required) | +| `OUTPUT_DIR` | `/opt/jetson-counter` | Output directory for DB, state, CSV, video | +| `IMGSZ` | `320` | YOLO input image size (must match model) | +| `CONF` | `0.3` | Detection confidence threshold | +| `CORE_MASK` | `1` | RKNN NPU cores: 1=core0, 2=core1, 3=both, 7=all three | +| `NUM_CLASSES` | `2` | Number of YOLO classes | +| `CLASS_AYAM` | `ayam` | Object class to count | +| `CLASS_TALENAN` | `talenan` | Object class to close batches | +| `LINE_X_FRAC` | `0.5` | Counting line X position (fraction of frame width) | +| `CROSS_DIRECTION` | `rtl` | Crossing direction: `rtl`, `ltr`, or `both` | +| `DAILY_CUTOFF_TIME` | `20:00` | Time to roll over to next counting day | +| `BATCH_TIMEOUT_SECONDS` | `300` | Inactivity timeout to close a batch | +| `MIN_OBJECT_PER_BATCH` | `60` | Minimum chickens per batch | +| `OPENCV_FFMPEG_CAPTURE_OPTIONS` | — | FFmpeg options for low-latency RTSP | + +See `config.env.example` for the full list. + +## Running + +### Interactive (foreground) + +```bash +set -a && source .env && set +a +./counter +``` + +### systemd (production) + +```bash +# Install binary and config +sudo mkdir -p /opt/bytetrack-counter-go +sudo cp counter /opt/bytetrack-counter-go/ +sudo cp .env /opt/bytetrack-counter-go/ +sudo cp config.env.example /opt/bytetrack-counter-go/ + +# Install and start service +sudo cp bytetrack-counter-go.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable bytetrack-counter-go +sudo systemctl start bytetrack-counter-go + +# Monitor +sudo journalctl -u bytetrack-counter-go -f +``` + +## Directory Structure + +``` +. +├── cmd/counter/main.go # Application entrypoint +├── pkg/ +│ ├── batchstore/store.go # SQLite batch persistence + JSON state +│ ├── bytetrack/tracker.go # ByteTrack multi-object tracker +│ ├── config/config.go # Env-based configuration loader +│ ├── drawing/drawing.go # OpenCV HUD drawing helpers +│ ├── kalman/kalman.go # 8-state Kalman filter +│ ├── rknn/rknn.go # CGo bridge to librknnrt +│ └── yolo/yolo.go # YOLO detector (RKNN inference + NMS) +├── internal/ +│ ├── iou/iou.go # IoU computation + greedy matching +│ └── nms/nms.go # Non-maximum suppression +├── config.env.example # Example configuration +├── bytetrack-counter-go.service # systemd unit file +├── go.mod +└── go.sum +``` diff --git a/cmd/counter/main.go b/cmd/counter/main.go index f62a74e..39ea817 100644 --- a/cmd/counter/main.go +++ b/cmd/counter/main.go @@ -11,11 +11,11 @@ import ( "syscall" "time" - "github.com/anomalyco/bytetrack-counter-go/pkg/batchstore" - "github.com/anomalyco/bytetrack-counter-go/pkg/bytetrack" - "github.com/anomalyco/bytetrack-counter-go/pkg/config" - "github.com/anomalyco/bytetrack-counter-go/pkg/drawing" - "github.com/anomalyco/bytetrack-counter-go/pkg/yolo" + "git.proit.id/dsutanto/bytetrack-counter-go/pkg/batchstore" + "git.proit.id/dsutanto/bytetrack-counter-go/pkg/bytetrack" + "git.proit.id/dsutanto/bytetrack-counter-go/pkg/config" + "git.proit.id/dsutanto/bytetrack-counter-go/pkg/drawing" + "git.proit.id/dsutanto/bytetrack-counter-go/pkg/yolo" "gocv.io/x/gocv" ) diff --git a/go.mod b/go.mod index 5f705d7..f57cb3f 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/proitlab/bytetrack-counter-go +module git.proit.id/dsutanto/bytetrack-counter-go go 1.23 diff --git a/pkg/bytetrack/tracker.go b/pkg/bytetrack/tracker.go index 26e3443..60e1bd8 100644 --- a/pkg/bytetrack/tracker.go +++ b/pkg/bytetrack/tracker.go @@ -1,8 +1,8 @@ package bytetrack import ( - "github.com/anomalyco/bytetrack-counter-go/internal/iou" - "github.com/anomalyco/bytetrack-counter-go/pkg/kalman" + "git.proit.id/dsutanto/bytetrack-counter-go/internal/iou" + "git.proit.id/dsutanto/bytetrack-counter-go/pkg/kalman" ) type ByteTracker struct { diff --git a/pkg/yolo/yolo.go b/pkg/yolo/yolo.go index dcb187e..f72cb7c 100644 --- a/pkg/yolo/yolo.go +++ b/pkg/yolo/yolo.go @@ -4,7 +4,7 @@ import ( "image" "math" - "github.com/anomalyco/bytetrack-counter-go/pkg/rknn" + "git.proit.id/dsutanto/bytetrack-counter-go/pkg/rknn" "gocv.io/x/gocv" )