111 lines
4.1 KiB
Bash
Executable File
111 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# ============================================================================
|
|
# Saqr PPE Detection - Run on Local Laptop
|
|
# ============================================================================
|
|
#
|
|
# Usage:
|
|
# ./run_local.sh # webcam 0
|
|
# ./run_local.sh --source 1 # webcam 1
|
|
# ./run_local.sh --source video.mp4 # video file
|
|
# ./run_local.sh --gui # PySide6 GUI
|
|
# ./run_local.sh --detect # simple detection (no tracking)
|
|
#
|
|
# ============================================================================
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
cd "$SCRIPT_DIR"
|
|
|
|
# ── Defaults ──────────────────────────────────────────────────────────────────
|
|
SOURCE="0"
|
|
MODEL="models/saqr_best.pt"
|
|
CONF="0.35"
|
|
MODE="saqr" # saqr | gui | detect
|
|
HEADLESS=false
|
|
MAX_MISSING=90
|
|
MATCH_DIST=250
|
|
CONFIRM=5
|
|
|
|
# ── Parse args ────────────────────────────────────────────────────────────────
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--source) SOURCE="$2"; shift 2 ;;
|
|
--model) MODEL="$2"; shift 2 ;;
|
|
--conf) CONF="$2"; shift 2 ;;
|
|
--gui) MODE="gui"; shift ;;
|
|
--detect) MODE="detect"; shift ;;
|
|
--headless) HEADLESS=true; shift ;;
|
|
--max-missing) MAX_MISSING="$2"; shift 2 ;;
|
|
--match-distance) MATCH_DIST="$2"; shift 2 ;;
|
|
--confirm) CONFIRM="$2"; shift 2 ;;
|
|
*) echo "Unknown arg: $1"; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
# ── Check model ───────────────────────────────────────────────────────────────
|
|
if [ ! -f "$MODEL" ]; then
|
|
echo "[ERROR] Model not found: $MODEL"
|
|
echo ""
|
|
echo " Train first:"
|
|
echo " conda activate AI_MSI_yolo"
|
|
echo " python train.py --dataset dataset --epochs 100"
|
|
echo ""
|
|
echo " Or specify a different model:"
|
|
echo " ./run_local.sh --model /path/to/model.pt"
|
|
exit 1
|
|
fi
|
|
|
|
# ── Activate conda ────────────────────────────────────────────────────────────
|
|
if command -v conda &>/dev/null; then
|
|
source "$(conda info --base)/etc/profile.d/conda.sh" 2>/dev/null || true
|
|
conda activate AI_MSI_yolo 2>/dev/null || true
|
|
fi
|
|
|
|
echo "============================================"
|
|
echo " Saqr PPE Detection - Local Laptop"
|
|
echo "============================================"
|
|
echo " Mode : $MODE"
|
|
echo " Source : $SOURCE"
|
|
echo " Model : $MODEL"
|
|
echo " Conf : $CONF"
|
|
echo "============================================"
|
|
echo ""
|
|
|
|
# ── Run ───────────────────────────────────────────────────────────────────────
|
|
HEADLESS_FLAG=""
|
|
if [ "$HEADLESS" = true ]; then
|
|
HEADLESS_FLAG="--headless"
|
|
fi
|
|
|
|
case $MODE in
|
|
saqr)
|
|
echo "Starting PPE tracking..."
|
|
echo " Press q to quit, s to save frame."
|
|
echo ""
|
|
python saqr.py \
|
|
--source "$SOURCE" \
|
|
--model "$MODEL" \
|
|
--conf "$CONF" \
|
|
--max-missing "$MAX_MISSING" \
|
|
--match-distance "$MATCH_DIST" \
|
|
--status-confirm-frames "$CONFIRM" \
|
|
$HEADLESS_FLAG
|
|
;;
|
|
gui)
|
|
echo "Starting GUI..."
|
|
python gui.py \
|
|
--source "$SOURCE" \
|
|
--model "$MODEL"
|
|
;;
|
|
detect)
|
|
echo "Starting simple detection (no tracking)..."
|
|
echo " Press q to quit, s to save frame."
|
|
echo ""
|
|
python detect.py \
|
|
--source "$SOURCE" \
|
|
--model "$MODEL" \
|
|
--conf "$CONF"
|
|
;;
|
|
esac
|