Compare commits

...

2 commits

Author SHA1 Message Date
Jakob Lechner
1d99f38876 Do not skip frames 2025-08-02 04:27:09 +02:00
Jakob Lechner
5e388f7fdc Update README 2025-08-02 04:26:14 +02:00
2 changed files with 7 additions and 31 deletions

View file

@ -1,40 +1,21 @@
# People Counter with YOLOv8, ByteTrack, and Prometheus
This project implements a real-time people counting system based on object detection and tracking using [YOLOv8](https://github.com/ultralytics/ultralytics) and [ByteTrack](https://github.com/ifzhang/ByteTrack). It supports **RTSP input**, **in/out counting** using a vertical line, and exposes **Prometheus metrics** for integration with monitoring systems.
This project implements a real-time people counting system based on object detection and tracking using [YOLOv8](https://github.com/ultralytics/ultralytics) and [ByteTrack](https://github.com/ifzhang/ByteTrack). It supports **MJPEG input**, **in/out counting** using either a vertical or a horizontal line, and exposes **Prometheus metrics** for integration with monitoring systems.
## 🚀 Features
- 🎥 RTSP camera stream input
- 🎥 MJPEG camera stream input
- 🧠 YOLOv8 person detection
- 🔁 ByteTrack object tracking
- In/Out counting via virtual vertical line
- In/Out counting via virtual line
- 📊 Prometheus metrics at `http://localhost:9100/`
- 🌐 Streamlit UI for live video and statistics
- 🌐 Web UI for live video and statistics
## Start mediamtx
## Start MJPEG stream from webcam
```
mediamtx
```
## Stream webcam
```
ffmpeg \
-vaapi_device /dev/dri/renderD128 \
-y \
-f v4l2 \
-framerate 30 \
-video_size 1280x720 \
-input_format mjpeg \
-i /dev/video0 \
-vf 'format=nv12,hwupload' \
-c:v h264_vaapi \
-f rtsp \
rtsp://localhost:8554/cam
```
mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 1280x720 -f 30" -o "output_http.so -p 8080"
## Run application
```
streamlit run streamlit_app.py
uvicorn main:app --host 0.0.0.0 --port 8000
```

View file

@ -15,7 +15,6 @@ STREAMS = {
"Kasse 2": "http://192.168.11.230:8080?action=stream",
}
FRAME_SKIP = 2
model = YOLO("yolo_weights/yolo11n.pt")
latest_frames = {}
@ -26,7 +25,6 @@ def process_stream(stream_id, url):
line_orientation = "vertical"
counter = Counter(stream_id, line_orientation, metrics)
cap = cv2.VideoCapture(url)
frame_idx = 0
while cap.isOpened():
ret, frame = cap.read()
@ -36,9 +34,6 @@ def process_stream(stream_id, url):
height, width, _ = frame.shape
frame_idx += 1
if frame_idx % FRAME_SKIP != 0:
continue
try:
results = model.track(