Files
2026-07-03 08:16:47 +00:00

81 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"
MODEL="$ROOT_DIR/weights/uav_drone_yolov8s_best.pt"
LOGO="$ROOT_DIR/ykz.png"
OUTPUT="$ROOT_DIR/outputs"
mkdir -p "$OUTPUT"
COMMON_ARGS=(
--model "$MODEL"
--logo "$LOGO"
--classes 0
--display-class-name drone
--imgsz 1280
--conf 0.12
--display-conf 0.32
--display-min-hits 4
--det-iou 0.50
--tracker motion
--max-missed 45
--max-match-gap 60
--reconnect-buffer 45
--min-hits 8
--new-track-conf 0.34
--smooth-alpha 0.75
--track-nms-iou 0.45
--track-nms-center 0.75
--stitch-ids
--stitch-buffer 45
--stitch-min-gap 15
--trail-length 180
)
python3 run_detect_track.py \
--input "$ROOT_DIR/test_video/test_video_1.mp4" \
--output "$OUTPUT" \
--rescue-detections \
--rescue-conf 0.45 \
--rescue-max-missed 20 \
"${COMMON_ARGS[@]}"
for video in "$ROOT_DIR"/test_video/test_video_{2,3,4}.mp4; do
python3 run_detect_track.py \
--input "$video" \
--output "$OUTPUT" \
"${COMMON_ARGS[@]}"
done
python3 - <<'PY'
from pathlib import Path
import csv
import cv2
import collections
root = Path.cwd()
out = root / "outputs"
for video in sorted(out.glob("*_tracked.mp4")):
cap = cv2.VideoCapture(str(video))
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) if cap.isOpened() else 0
fps = cap.get(cv2.CAP_PROP_FPS) if cap.isOpened() else 0
cap.release()
csv_path = out / video.name.replace("_tracked.mp4", "_tracks.csv")
ids = set()
rows = 0
by_frame = collections.defaultdict(list)
if csv_path.exists():
with csv_path.open(newline="", encoding="utf-8") as f:
for row in csv.DictReader(f):
rows += 1
ids.add(row["track_id"])
by_frame[int(row["frame"])].append(row["track_id"])
duplicate_same_id = 0
for frame_ids in by_frame.values():
duplicate_same_id += sum(1 for count in collections.Counter(frame_ids).values() if count > 1)
print(f"{video.name}: frames={frames}, fps={fps:.3f}, rows={rows}, ids={len(ids)}, duplicate_same_id_frames={duplicate_same_id}")
PY