81 lines
2.1 KiB
Bash
Executable File
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
|