import cv2 # Configuration and tunables (extracted from original script) # ========================= # ВАЖНО: укажите путь к новой YOLO11s-P2-CBAM модели (best.pt, imgsz=1280) MODEL_PATH = r"D:\PycharmProjects\YOLOTrain\BYTETRACK\TEST\fpv_tracker_optimized\best.pt" DEVICE = 0 USE_HALF = True # Универсальный источник: # Видео: # SOURCE = r"C:\Users\Legion\Desktop\dataset01.26\24-01_2.mp4" # Камера / capture card: #SOURCE = 0 # SOURCE = 1 # RTSP: # SOURCE = "rtsp://192.168.1.10:8554/live" # UDP: # SOURCE = "udp://@0.0.0.0:5600" SOURCE = r"C:\Users\Legion\Desktop\Видео для МАИ ФУЛЛ\Группа 1\23-01_10один.mp4" VIDEO_REALTIME = True # Windows: CAP_BACKEND = cv2.CAP_DSHOW # или cv2.CAP_MSMF # Linux обычно: # CAP_BACKEND = cv2.CAP_V4L2 SHOW_OUTPUT = True WINDOW_NAME = "FPV LOCK PAL + ByteTrack" TARGET_OUT_FPS = 0 # <=0: file -> source fps, camera/stream -> no forced pacing # Frame timebase / dt stabilization TIMESTAMP_USE_SOURCE_CLOCK = True INPUT_FPS_FALLBACK = 25.0 DT_MIN_SEC = 1.0 / 120.0 DT_MAX_SEC = 0.20 DT_RESET_GAP_SEC = 0.40 # Effective resolution policy (for analog PAL) EFFECTIVE_W = 720 EFFECTIVE_H = 576 FORCE_EFFECTIVE_PAL = True # YOLO inference settings CONF = 0.25 IMG_SIZE_ROI = 640 IMG_SIZE_FULL = 1280 MAX_DET = 60 TARGET_CLASS_ID = 0 # Filters (small drones far away) MIN_BOX_AREA = 8 MAX_BOX_AREA = 0 ASPECT_RANGE = (0.15, 6.0) # FSM CONFIRM_HITS = 2 MAX_MISSES = 20 RECOVER_FULLSCAN_EVERY = 30 RECOVER_FORCED_DET_EVERY = 2 # ROI sizing (in effective pixels) BASE_RADIUS = 150 MAX_RADIUS = 520 SPEED_RADIUS_FACTOR = 18.0 FORWARD_BIAS = 1.8 SIDE_BIAS = 1.2 # KLT optical flow tracker (effective) KLT_MAX_CORNERS = 140 KLT_QUALITY = 0.01 KLT_MIN_DIST = 6 KLT_WIN = (21, 21) KLT_MAX_LEVEL = 3 KLT_OUTLIER_THRESH = 20.0 # KLT validity gates (anti-drift) KLT_OK_Q = 0.22 KLT_OK_PTS = 14 KLT_REINIT_MIN_POINTS = 18 KLT_REFRESH_WITH_YOLO = True KLT_REFRESH_EVERY = 6 KLT_REFRESH_MIN_SCORE = 0.18 KLT_REFRESH_MIN_IOU = 0.25 KLT_REFRESH_MIN_QUALITY = 0.35 # YOLO safety YOLO_NO_DET_LIMIT = 20 # Robust single-target logic GAP_MAX_SECONDS = 1.2 ACQUIRE_CONFIRM_SCORE = 6 ACQUIRE_HIT_BONUS = 2 ACQUIRE_MISS_PENALTY = 1 ACQUIRE_MAX_MISS = 90 LOCK_MAX_MISS_FRAMES = 120 FULLSCAN_WHEN_MISS_GE = 16 # Template matching fallback TM_ENABLE = True TM_TEMPLATE_SIZE = 40 TM_SEARCH_SCALE_BASE = 2.5 TM_SEARCH_SCALE_PER_MISS = 0.20 TM_MIN_SCORE = 0.55 # Kalman safety limits KALMAN_CLAMP_V_PX_S = 180.0 KALMAN_RESET_IF_OUT_OF_FRAME = True YOLO_FRESH_SEC = 0.50 YOLO_FORCE_DET_WHEN_WEAK = True KALMAN_Q_DT_BOOST_ENABLE = True KALMAN_Q_DT_BOOST_START_SEC = 0.08 KALMAN_Q_DT_BOOST_SLOPE = 16.0 KALMAN_Q_DT_BOOST_MAX = 4.0 # Appearance gate USE_HSV_GATE = False HSV_HIST_BINS = (16, 16) HSV_GATE_MIN_SIM = 0.06 HSV_UPDATE_EVERY = 8 # Async YOLO worker YOLO_QUEUE_MAX = 1 # Debug / draw DEBUG = True DRAW_ALL_BOXES = True DRAW_LOCK_BOX = True DRAW_KALMAN = True DRAW_KLT_POINTS = False DRAW_BT_TRACKS = True BT_DRAW_ONLY_CONFIRMED = False # Output recording SAVE_INFER_VIDEO = True OUT_VIDEO_PATH = "out_infer.mp4" TRACK_LOG_ENABLE = True TRACK_LOG_PATH = "track_log.csv" TRACK_SUMMARY_PATH = "track_summary.json" TRACK_LOG_FLUSH_EVERY = 30 # Screen-space lock/guidance layer for simulator integration GUIDANCE_ENABLE = True DRAW_GUIDANCE = True GUIDANCE_EXPORT_ENABLE = True GUIDANCE_EXPORT_PATH = "guidance_state.json" GUIDANCE_EXPORT_EVERY = 1 GUIDANCE_LEAD_SEC = 0.12 GUIDANCE_MAX_LEAD_PX = 90.0 GUIDANCE_BOX_BIAS_Y = 0.0 GUIDANCE_DEADZONE_NORM = 0.04 GUIDANCE_EXPO = 1.35 GUIDANCE_GAIN_X = 1.0 GUIDANCE_GAIN_Y = 1.0 GUIDANCE_CMD_SMOOTH = 0.70 GUIDANCE_POINT_SMOOTH = 0.55 GUIDANCE_CONF_MIN = 0.35 GUIDANCE_ON_TARGET_NORM = 0.12 GUIDANCE_LOOK_MAX_STEP_PX = 28.0 GUIDANCE_OVERRIDE_ENABLE = True GUIDANCE_OVERRIDE_MISS_GE = 2 GUIDANCE_OVERRIDE_TTL = 2 # Trajectory drawing DRAW_TRAJ = False TRAIL_SECONDS = 1.2 TRAIL_ALPHA = 0.25 TRAIL_DRAW_EVERY_N = 2 TRAIL_MIN_STEP_PX = 3 CLEAR_TRAJ_ON_RECOVER = True DRAW_TRAJ_ONLY_WHEN_LOCKED = True DRAW_KALMAN_WHEN_MISS_LE = 8 # Camera motion compensation USE_CAM_MOTION_COMP = True CAM_MOTION_MAX_CORNERS = 500 CAM_MOTION_QL = 0.01 CAM_MOTION_MIN_DIST = 12 CAM_MOTION_RANSAC_THR = 3.0 CAM_MOTION_MAX_SHIFT_PX = 55.0 CAM_MOTION_SCALE_MIN = 0.90 CAM_MOTION_SCALE_MAX = 1.10 CAM_MOTION_MAX_ROT_DEG = 12.0 CAM_MOTION_EXCLUDE_NORM = [ (0.00, 0.00, 0.25, 0.85), (0.75, 0.00, 1.00, 0.85), (0.00, 0.00, 1.00, 0.12), (0.30, 0.86, 0.70, 1.00), ] # ByteTrack settings BT_HIGH = 0.25 BT_LOW = 0.03 BT_NEW = 0.12 BT_MATCH_IOU = 0.15 BT_BUFFER = 140 BT_MIN_HITS = 1 BT_MAX_PREDICT_AGE = 6 YOLO_CONF_EFFECTIVE = min(CONF, BT_LOW) KALMAN_HOLD_MAX = 10 # Single-target lock policy TARGET_SWITCH_MISS_FRAMES = 1 TARGET_PICK_MIN_SCORE = 0.00 TARGET_REACQ_DIST_FACTOR = 7.5 TURN_MAX_ASPECT_RATIO = 6.0 TURN_MAX_AREA_RATIO = 9.0 TARGET_SWITCH_CONFIRM_HITS = 1 TARGET_STICKY_SCORE_BONUS = 0.45 TARGET_SWITCH_IOU_FLOOR = 0.0 STALE_LOCK_BREAK_ENABLE = False STALE_LOCK_BREAK_DIST_DIAG = 3.5 STALE_LOCK_BREAK_MIN_MISS = 2 STALE_LOCK_BREAK_KLT_QUALITY = 0.35 STALE_LOCK_BREAK_KLT_IOU = 0.25 FAST_HANDOFF_ENABLE = False FAST_HANDOFF_CONFIRM_HITS = 2 FAST_HANDOFF_GUIDANCE_CMD_DAMP = 0.0 CONFIRMED_NO_ID_NEAR_FACTOR = 2.6 CONFIRMED_NO_ID_NEAR_MIN = 26.0 APPROACH_MODE_ENABLE = True ADAPTIVE_CHASE_ENABLE = True ADAPTIVE_STAGE_MID_AREA = 260.0 APPROACH_CLOSE_AREA = 850.0 ADAPTIVE_STAGE_AREA_HYST = 120.0 APPROACH_MID_FORCE_DET_EVERY = 2 APPROACH_FORCE_DET_AREA = 850.0 APPROACH_FORCE_DET_EVERY = 1 APPROACH_MID_KF_ROI_SCALE = 1.15 APPROACH_KF_ROI_SCALE = 1.35 APPROACH_MID_MAX_AREA_RATIO = 14.0 APPROACH_MAX_AREA_RATIO = 24.0 APPROACH_MID_NEAR_DIST_DIAG = 1.35 APPROACH_NEAR_DIST_DIAG = 1.6 APPROACH_HSV_RELAX_GROW_RATIO = 2.5 APPROACH_MID_HSV_MIN_SCALE = 0.65 APPROACH_HSV_MIN_SCALE = 0.35 APPROACH_MID_SCORE_WEIGHT = 0.08 APPROACH_MID_SCORE_CLIP = 0.16 APPROACH_SCORE_WEIGHT = 0.18 APPROACH_SCORE_CLIP = 0.35 APPROACH_MID_SWITCH_EXTRA_MISS = 1 APPROACH_MID_SWITCH_EXTRA_HITS = 1 APPROACH_CLOSE_SWITCH_EXTRA_MISS = 2 APPROACH_CLOSE_SWITCH_EXTRA_HITS = 2 CLOSE_FORCE_FULLSCAN = True PART_MERGE_ENABLE = True PART_MERGE_MIN_PARTS = 2 PART_MERGE_MIN_REF_DIAG = 28.0 PART_MERGE_REF_DIST_DIAG = 2.2 PART_MERGE_CLUSTER_DIST_DIAG = 1.4 PART_MERGE_IOU_FLOOR = 0.02 PART_MERGE_MIN_UNION_GAIN = 1.35 PART_MERGE_MAX_UNION_RATIO = 40.0 PART_MERGE_MAX_ASPECT = 8.0 PART_MERGE_SCORE_BONUS = 0.03 SWITCH_FAST_MANEUVER_ENABLE = True SWITCH_FAST_MANEUVER_SPEED = 60.0 SWITCH_FAST_MANEUVER_EXTRA_MISS = 2 SWITCH_FAST_MANEUVER_EXTRA_HITS = 2 # Switch-only trajectory gate (candidate must be kinematically plausible # относительно направления цели) SWITCH_TRAJ_GATE_ENABLE = True SWITCH_TRAJ_MISS_GE = 1 SWITCH_TRAJ_MIN_SPEED = 1.2 SWITCH_TRAJ_COS_MIN = 0.10 SWITCH_TRAJ_PERP_DIAG = 0.35 SWITCH_TRAJ_PERP_MIN = 10.0 SWITCH_TRAJ_REQUIRE_RESIDUAL_BYPASS = True # Switch-only anti-static gate (reject candidates that do not move over time) SWITCH_STATIC_GUARD_ENABLE = True SWITCH_TRACK_HIST_WINDOW = 8 SWITCH_STATIC_MIN_DISP = 4.0 SWITCH_STATIC_MIN_DIAG = 0.10 SWITCH_STATIC_REQUIRE_RESIDUAL_BYPASS = True # Weak-reacquire guard (suppress one-frame turn false positives) WEAK_REACQ_GUARD_ENABLE = True WEAK_REACQ_MISS_GE = 6 WEAK_REACQ_MIN_HITS = 2 WEAK_REACQ_MIN_SCORE = 0.05 WEAK_REACQ_MAX_DIST_FACTOR = 4.0 WEAK_REACQ_MAX_DIST_MIN = 24.0 WEAK_REACQ_ADOPT_HITS = 3 # Separate score floors for actual target adoption. # ByteTrack still receives low-score candidates, but lock/switch decisions # require stronger track evidence. TRACK_SCORE_MIN_ACQUIRE = 0.08 TRACK_SCORE_MIN_REACQUIRE = 0.07 TRACK_SCORE_MIN_SWITCH = 0.10 # Provisional reacquire memory (keep priority near last true micro-detection) PROVISIONAL_HOLD_ENABLE = True PROVISIONAL_HOLD_MAX = 8 PROVISIONAL_HIT_DECAY = 1 RECOVER_NEAR_DIST_FACTOR = 3.2 RECOVER_NEAR_DIST_MIN = 26.0 # Analog FPV hardening ANALOG_FPV_MODE = True APPLY_YOLO_PREPROC = True PRE_CLAHE_CLIP = 2.2 PRE_CLAHE_TILE = (8, 8) PRE_BLUR_K = 3 PRE_UNSHARP = 0.12 # OSD false positives rejection REJECT_OSD_ZONES = True REJECT_OSD_SMALL_AREA_MAX = 2600.0 REJECT_OSD_ZONES_NORM = [ (0.00, 0.00, 0.20, 0.80), (0.80, 0.00, 1.00, 0.80), (0.00, 0.00, 1.00, 0.08), (0.35, 0.90, 0.65, 1.00), ] # Additional lock-switch guard: do not switch to candidates inside OSD zones # when they are far from predicted target position. OSD_SWITCH_BLOCK_ENABLE = True OSD_SWITCH_BLOCK_DIST_DIAG = 1.25 # Turn-safe recovery TURN_SAFE_ENABLE = True TURN_SAFE_UNC_LIMIT = 2800.0 TURN_SAFE_MISS_BEFORE_RESET = 12 TURN_SAFE_FORCE_FULLSCAN = True TURN_SAFE_MIN_SCORE = 0.08 TURN_SAFE_REQUIRE_TRACK_ID = True # Safety against drifting "CONFIRMED" state without a valid track anchor CONFIRMED_NO_ID_MAX_MISS = 3 # Motion-zone recover assist (for tiny distant targets) MOTION_ZONE_ENABLE = True MOTION_ZONE_GRID = (8, 6) MOTION_DIFF_THR = 16 MOTION_BLUR_K = 3 MOTION_MORPH_K = 3 MOTION_ZONE_MIN_PIXELS = 10 MOTION_ZONE_MIN_RATIO = 0.0012 MOTION_MAX_ACTIVE_ZONE_RATIO = 0.55 MOTION_ROI_MARGIN = 28 MOTION_ROI_MIN_SIZE = 80 DRAW_MOTION_ROI = False MOTION_TURN_THR_GAIN = 2.0 MOTION_TURN_THR_MAX_BONUS = 10 MOTION_ZONE_HEAT_DECAY = 0.88 MOTION_ZONE_HEAT_BOOST = 1.0 MOTION_ZONE_HEAT_CLIP = 4.0 MOTION_ZONE_HEAT_MIN = 0.65 MOTION_ZONE_HOT_FAVOR_BONUS = 0.35 MOTION_ZONE_ENFORCE_HOT = True MOTION_ZONE_ENFORCE_MISS_GE = 2 # Use motion ROI also in CONFIRMED state when target starts slipping. MOTION_CONF_ENABLE = True MOTION_CONF_MISS_GE = 2 MOTION_CONF_KLT_INVALID_ONLY = True # Extra anti-jump guard for switching while using motion/wave ROI in CONFIRMED state. MOTION_CONF_SWITCH_MISS_FRAMES = 3 MOTION_CONF_SWITCH_MIN_HITS = 2 MOTION_CONF_SWITCH_MIN_SCORE = 0.08 MOTION_CONF_SWITCH_IOU_FLOOR = 0.05 MOTION_CONF_SWITCH_DIST_DIAG = 0.90 MOTION_CONF_SWITCH_CONFIRM_HITS = 4 MOTION_CONF_SWITCH_REQUIRE_RESIDUAL = True # While confirmed+miss, force periodic FULL scans so detector can reacquire globally. CONF_MISS_FORCE_FULLSCAN_EVERY = 8 EGO_RESIDUAL_GATE_ENABLE = True EGO_RESIDUAL_MISS_GE = 2 EGO_RESIDUAL_MIN_PIXELS = 2 EGO_RESIDUAL_MIN_RATIO = 0.006 # Wavelet assist (tiny distant target recover) WAVELET_ASSIST_ENABLE = True WAVELET_ACTIVE_MISS_GE = 2 WAVELET_ONLY_UNCONFIRMED = True WAVELET_ONLY_RECOVER_PHASE = True WAVELET_BOX_MARGIN = 8 WAVELET_MIN_SIDE = 20 WAVELET_GATE_TINY_AREA_MAX = 260.0 WAVELET_GATE_MISS_GE = 2 WAVELET_GATE_MIN_ENERGY = 0.14 WAVELET_ENERGY_BASE = 0.22 WAVELET_SCORE_WEIGHT = 0.28 WAVELET_SCORE_CLIP = 0.35 # Temporal M/N stabilization for wavelet (per track id) WAVELET_MN_ENABLE = True WAVELET_MN_WINDOW = 4 WAVELET_MN_MIN_HITS = 1 WAVELET_MN_MISS_GE = 2 # Wavelet-driven micro ROI for recover WAVELET_ROI_ENABLE = True WAVELET_ROI_MISS_GE = 2 WAVELET_ROI_CONF_MISS_GE = 6 WAVELET_ROI_TTL = 4 WAVELET_ROI_EVERY_N = 3 WAVELET_ROI_MARGIN = 20 WAVELET_ROI_MIN_SIDE = 84 WAVELET_ROI_PRED_SCALE = 3.0 WAVELET_ROI_MIN_PEAK_RATIO = 1.5 # AutoGaze assist (optional ROI prior for recover) AUTOGAZE_ENABLE = False AUTOGAZE_MODEL_ID = "nvidia/AutoGaze" # can be HF id or local folder AUTOGAZE_USE_FLASH_ATTN = False # keep False unless flash-attn is installed and stable AUTOGAZE_LOCAL_FILES_ONLY = True # avoids HF network retries; set False to download/update model AUTOGAZE_CLIP_LEN = 16 AUTOGAZE_UPDATE_EVERY = 3 AUTOGAZE_GAZING_RATIO = 0.75 AUTOGAZE_TASK_LOSS_REQUIREMENT = 0.70 AUTOGAZE_RESULT_TTL = 12 AUTOGAZE_MISS_GE = 2 AUTOGAZE_CONF_MISS_GE = 2 AUTOGAZE_TOPK = 2 AUTOGAZE_MIN_ACTIVE_CELLS = 1 AUTOGAZE_ROI_MARGIN_CELLS = 1 AUTOGAZE_ROI_MIN_SIDE = 90 DRAW_AUTOGAZE_ROI = False MODULE_TIME_BUDGET_MS = 30.0 AUTOGAZE_COOLDOWN_FRAMES = 12 WAVELET_COOLDOWN_FRAMES = 8 # Recover anti-noise gates for tiny distant target RECOVER_FILTER_ENABLE = True RECOVER_MIN_SCORE = 0.03 RECOVER_TINY_AREA_MAX = 180.0 RECOVER_TINY_MIN_SCORE = 0.045 RECOVER_TINY_MIN_MOTION_PIXELS = 1 RECOVER_TINY_MIN_MOTION_RATIO = 0.003 RECOVER_TARGET_MIN_HITS = 1 # Keep scanning around last brief detection to stabilize reacquire FLASH_ROI_ENABLE = True FLASH_ROI_TTL = 7 FLASH_ROI_MARGIN = 72 FLASH_ROI_MIN_SIDE = 90 FLASH_ROI_MIN_SCORE = 0.04 # Anti-stall recover (avoid getting stuck in wrong ROI-KF when detections disappear) RECOVER_ROI_KF_DISABLE_MISS_GE = 6 RECOVER_FORCE_MOTION_FIRST_MISS_GE = 8 RECOVER_FORCE_FULLSCAN_MISS_GE = 18 # Pre-acquire for tiny distant target (M/N logic before stable track-id appears) PREACQ_ENABLE = True PREACQ_WINDOW = 7 PREACQ_MIN_HITS = 3 PREACQ_MIN_SCORE = 0.035 PREACQ_NEAR_FACTOR = 3.4 PREACQ_NEAR_MIN = 20.0 PREACQ_ACQ_BONUS = 2 PREACQ_INIT_KF_ON_MN = True # Anti-false profile: "soft" (max recall), "medium", "hard", "hard_far" ANTI_FP_PROFILE = "hard_far" ACTIVE_ANTI_FP_PROFILE = "custom" def apply_anti_fp_profile(): global CONFIRM_HITS, TARGET_SWITCH_CONFIRM_HITS global BT_NEW, BT_MATCH_IOU, BT_LOW, YOLO_CONF_EFFECTIVE global TRACK_SCORE_MIN_ACQUIRE, TRACK_SCORE_MIN_REACQUIRE, TRACK_SCORE_MIN_SWITCH global RECOVER_MIN_SCORE, RECOVER_TINY_MIN_SCORE, RECOVER_TINY_MIN_MOTION_PIXELS global RECOVER_TINY_MIN_MOTION_RATIO, RECOVER_TARGET_MIN_HITS global WEAK_REACQ_MISS_GE, WEAK_REACQ_MIN_HITS, WEAK_REACQ_MIN_SCORE, WEAK_REACQ_ADOPT_HITS global RECOVER_NEAR_DIST_FACTOR, PROVISIONAL_HOLD_MAX, PROVISIONAL_HIT_DECAY global MOTION_DIFF_THR, MOTION_ZONE_MIN_RATIO, MOTION_MAX_ACTIVE_ZONE_RATIO global MOTION_ZONE_HEAT_MIN, MOTION_ZONE_HOT_FAVOR_BONUS, MOTION_ZONE_ENFORCE_MISS_GE global EGO_RESIDUAL_MISS_GE, EGO_RESIDUAL_MIN_PIXELS, EGO_RESIDUAL_MIN_RATIO global ACTIVE_ANTI_FP_PROFILE p = str(ANTI_FP_PROFILE).strip().lower() if p not in ("soft", "medium", "hard", "hard_far"): p = "medium" ACTIVE_ANTI_FP_PROFILE = p if p == "soft": CONFIRM_HITS = 2 TARGET_SWITCH_CONFIRM_HITS = 1 BT_LOW = 0.03 BT_NEW = 0.12 BT_MATCH_IOU = 0.15 RECOVER_MIN_SCORE = 0.03 RECOVER_TINY_MIN_SCORE = 0.045 RECOVER_TINY_MIN_MOTION_PIXELS = 1 RECOVER_TINY_MIN_MOTION_RATIO = 0.003 RECOVER_TARGET_MIN_HITS = 1 TRACK_SCORE_MIN_ACQUIRE = 0.06 TRACK_SCORE_MIN_REACQUIRE = 0.05 TRACK_SCORE_MIN_SWITCH = 0.08 WEAK_REACQ_MISS_GE = 8 WEAK_REACQ_MIN_HITS = 1 WEAK_REACQ_MIN_SCORE = 0.045 WEAK_REACQ_ADOPT_HITS = 2 RECOVER_NEAR_DIST_FACTOR = 3.8 PROVISIONAL_HOLD_MAX = 10 PROVISIONAL_HIT_DECAY = 1 MOTION_DIFF_THR = 16 MOTION_ZONE_MIN_RATIO = 0.0012 MOTION_MAX_ACTIVE_ZONE_RATIO = 0.60 MOTION_ZONE_HEAT_MIN = 0.55 MOTION_ZONE_HOT_FAVOR_BONUS = 0.25 MOTION_ZONE_ENFORCE_MISS_GE = 3 EGO_RESIDUAL_MISS_GE = 4 EGO_RESIDUAL_MIN_PIXELS = 1 EGO_RESIDUAL_MIN_RATIO = 0.002 elif p == "medium": CONFIRM_HITS = 3 TARGET_SWITCH_CONFIRM_HITS = 2 BT_LOW = 0.03 BT_NEW = 0.14 BT_MATCH_IOU = 0.17 RECOVER_MIN_SCORE = 0.04 RECOVER_TINY_MIN_SCORE = 0.060 RECOVER_TINY_MIN_MOTION_PIXELS = 2 RECOVER_TINY_MIN_MOTION_RATIO = 0.008 RECOVER_TARGET_MIN_HITS = 2 TRACK_SCORE_MIN_ACQUIRE = 0.08 TRACK_SCORE_MIN_REACQUIRE = 0.07 TRACK_SCORE_MIN_SWITCH = 0.10 WEAK_REACQ_MISS_GE = 5 WEAK_REACQ_MIN_HITS = 2 WEAK_REACQ_MIN_SCORE = 0.060 WEAK_REACQ_ADOPT_HITS = 3 RECOVER_NEAR_DIST_FACTOR = 2.9 PROVISIONAL_HOLD_MAX = 7 PROVISIONAL_HIT_DECAY = 1 MOTION_DIFF_THR = 17 MOTION_ZONE_MIN_RATIO = 0.0016 MOTION_MAX_ACTIVE_ZONE_RATIO = 0.50 MOTION_ZONE_HEAT_MIN = 0.70 MOTION_ZONE_HOT_FAVOR_BONUS = 0.35 MOTION_ZONE_ENFORCE_MISS_GE = 2 EGO_RESIDUAL_MISS_GE = 2 EGO_RESIDUAL_MIN_PIXELS = 2 EGO_RESIDUAL_MIN_RATIO = 0.006 else: # hard / hard_far CONFIRM_HITS = 3 TARGET_SWITCH_CONFIRM_HITS = 3 BT_LOW = 0.035 BT_NEW = 0.11 BT_MATCH_IOU = 0.17 RECOVER_MIN_SCORE = 0.05 RECOVER_TINY_MIN_SCORE = 0.075 RECOVER_TINY_MIN_MOTION_PIXELS = 3 RECOVER_TINY_MIN_MOTION_RATIO = 0.015 RECOVER_TARGET_MIN_HITS = 3 TRACK_SCORE_MIN_ACQUIRE = 0.10 TRACK_SCORE_MIN_REACQUIRE = 0.09 TRACK_SCORE_MIN_SWITCH = 0.12 WEAK_REACQ_MISS_GE = 3 WEAK_REACQ_MIN_HITS = 3 WEAK_REACQ_MIN_SCORE = 0.080 WEAK_REACQ_ADOPT_HITS = 3 RECOVER_NEAR_DIST_FACTOR = 2.4 PROVISIONAL_HOLD_MAX = 5 PROVISIONAL_HIT_DECAY = 2 MOTION_DIFF_THR = 19 MOTION_ZONE_MIN_RATIO = 0.0022 MOTION_MAX_ACTIVE_ZONE_RATIO = 0.42 MOTION_ZONE_HEAT_MIN = 0.85 MOTION_ZONE_HOT_FAVOR_BONUS = 0.45 MOTION_ZONE_ENFORCE_MISS_GE = 1 EGO_RESIDUAL_MISS_GE = 1 EGO_RESIDUAL_MIN_PIXELS = 3 EGO_RESIDUAL_MIN_RATIO = 0.010 YOLO_CONF_EFFECTIVE = min(CONF, BT_LOW) apply_anti_fp_profile() # ===== Chase-drone preset overrides (applied after anti-fp profile) ===== # Ужесточаем переключение на альтернативный track, чтобы меньше липнуть на землю. CONFIRM_HITS = 4 ACQUIRE_CONFIRM_SCORE = 8 PREACQ_MIN_HITS = 4 PREACQ_MIN_SCORE = 0.05 TARGET_SWITCH_MISS_FRAMES = 3 TARGET_SWITCH_CONFIRM_HITS = 4 TARGET_SWITCH_IOU_FLOOR = 0.10 TARGET_REACQ_DIST_FACTOR = 5.5 TRACK_SCORE_MIN_ACQUIRE = 0.10 TRACK_SCORE_MIN_REACQUIRE = 0.09 TRACK_SCORE_MIN_SWITCH = 0.14 # Switch gates preset for chase-scene SWITCH_TRAJ_GATE_ENABLE = True SWITCH_TRAJ_MISS_GE = 1 SWITCH_TRAJ_MIN_SPEED = 8.0 SWITCH_TRAJ_COS_MIN = 0.18 SWITCH_TRAJ_PERP_DIAG = 0.28 SWITCH_TRAJ_PERP_MIN = 9.0 SWITCH_TRAJ_REQUIRE_RESIDUAL_BYPASS = True SWITCH_STATIC_GUARD_ENABLE = True SWITCH_TRACK_HIST_WINDOW = 8 SWITCH_STATIC_MIN_DISP = 5.0 SWITCH_STATIC_MIN_DIAG = 0.12 SWITCH_STATIC_REQUIRE_RESIDUAL_BYPASS = True WEAK_REACQ_MISS_GE = 4 WEAK_REACQ_MIN_HITS = 3 WEAK_REACQ_MIN_SCORE = 0.09 WEAK_REACQ_ADOPT_HITS = 5 MOTION_CONF_SWITCH_MIN_SCORE = 0.12 MOTION_CONF_SWITCH_CONFIRM_HITS = 6 MOTION_CONF_SWITCH_DIST_DIAG = 0.70 MOTION_CONF_SWITCH_IOU_FLOOR = 0.10 # Режем псевдодвижение земли. EGO_RESIDUAL_MIN_PIXELS = 3 EGO_RESIDUAL_MIN_RATIO = 0.010 RECOVER_MIN_SCORE = 0.05 RECOVER_TINY_MIN_SCORE = 0.08 RECOVER_TARGET_MIN_HITS = 2 TURN_SAFE_MIN_SCORE = 0.12 # Appearance gate для подавления статичных ложняков. USE_HSV_GATE = True HSV_GATE_MIN_SIM = 0.10 HSV_UPDATE_EVERY = 4 # Wavelet чаще цепляет текстуру земли на chase-сценах. WAVELET_ROI_ENABLE = False # AutoGaze подключаем только на более явном срыве. AUTOGAZE_MISS_GE = 4 AUTOGAZE_CONF_MISS_GE = 3 AUTOGAZE_TOPK = 1 AUTOGAZE_UPDATE_EVERY = 4 AUTOGAZE_RESULT_TTL = 8 # ===== Soft handoff patch for tiny FPV chase targets ===== # Lets YOLO refresh Kalman/KLT even when ByteTrack changes track_id. SOFT_YOLO_HANDOFF_ENABLE = True SOFT_YOLO_MIN_MISS = 1 SOFT_YOLO_MIN_ABSENT = 1 SOFT_YOLO_MIN_SCORE = 0.055 SOFT_YOLO_DIST_DIAG = 8.0 SOFT_YOLO_DIST_MIN = 48.0 SOFT_YOLO_IOU_FLOOR = 0.0 SOFT_YOLO_MAX_AREA_RATIO = 18.0 SOFT_YOLO_MAX_ASPECT_RATIO = 8.0 SOFT_YOLO_TRACK_IOU = 0.02 SOFT_YOLO_TRACK_DIST_DIAG = 2.2 SOFT_YOLO_TRACK_DIST_MIN = 32.0 SOFT_YOLO_REFRESH_KLT = True # Keep a valid KLT anchor alive instead of letting prediction hold run to miss=10. KLT_VALID_HOLD_ENABLE = True KLT_VALID_HOLD_MAX_MISS = 3 # Make handoff less rigid. The old chase preset required several frames plus # approach/fast extras, so swHit often stayed at 1 and the lock was lost. TARGET_SWITCH_MISS_FRAMES = 1 TARGET_SWITCH_CONFIRM_HITS = 1 TARGET_SWITCH_IOU_FLOOR = 0.0 TRACK_SCORE_MIN_SWITCH = 0.07 WEAK_REACQ_MISS_GE = 2 WEAK_REACQ_MIN_HITS = 1 WEAK_REACQ_MIN_SCORE = 0.05 WEAK_REACQ_ADOPT_HITS = 1 MOTION_CONF_SWITCH_MIN_HITS = 1 MOTION_CONF_SWITCH_MIN_SCORE = 0.06 MOTION_CONF_SWITCH_CONFIRM_HITS = 1 MOTION_CONF_SWITCH_DIST_DIAG = 1.25 MOTION_CONF_SWITCH_IOU_FLOOR = 0.0 MOTION_CONF_SWITCH_REQUIRE_RESIDUAL = False APPROACH_MID_SWITCH_EXTRA_MISS = 0 APPROACH_MID_SWITCH_EXTRA_HITS = 0 APPROACH_CLOSE_SWITCH_EXTRA_MISS = 0 APPROACH_CLOSE_SWITCH_EXTRA_HITS = 0 SWITCH_FAST_MANEUVER_EXTRA_MISS = 0 SWITCH_FAST_MANEUVER_EXTRA_HITS = 0 SWITCH_TRAJ_GATE_ENABLE = False STALE_LOCK_BREAK_ENABLE = True STALE_LOCK_BREAK_DIST_DIAG = 0.8 STALE_LOCK_BREAK_MIN_MISS = 1 FAST_HANDOFF_ENABLE = True FAST_HANDOFF_CONFIRM_HITS = 1 FAST_HANDOFF_GUIDANCE_CMD_DAMP = 0.35 USE_HSV_GATE = False CONFIRMED_NO_ID_MAX_MISS = 8 KALMAN_HOLD_MAX = 6 # ===== Anti-flicker handoff patch v2 ===== # Сохраняем мягкий handoff, но не даем ByteTrack/YOLO утащить Kalman # на одиночный ложняк, пока KLT уверенно держит физическую цель. BT_KLT_ANCHOR_GUARD_ENABLE = True BT_KLT_ANCHOR_MIN_Q = 0.55 BT_KLT_ANCHOR_DIST_DIAG = 1.65 BT_KLT_ANCHOR_DIST_MIN = 34.0 BT_KLT_ANCHOR_IOU_FLOOR = 0.015 BT_KLT_ANCHOR_MAX_AREA_RATIO = 9.0 BT_KLT_ANCHOR_MAX_ASPECT_RATIO = 7.0 BT_KLT_ANCHOR_HOLD_ON_REJECT = True BT_KLT_ANCHOR_DEBUG_EVERY = 30 # Не считаем постоянную смену ByteTrack id физическим переключением цели, # если KLT якорь сильный и bbox принят рядом с ним. BT_ID_STABILIZE_WHEN_KLT_VALID = True # Soft YOLO handoff: широкий радиус оставляем только для реального восстановления. # Когда KLT валидный, handoff обязан быть рядом с KLT-якорем. SOFT_YOLO_KLT_MIN_Q = 0.55 SOFT_YOLO_KLT_DIST_DIAG = 1.85 SOFT_YOLO_KLT_DIST_MIN = 34.0 SOFT_YOLO_KLT_IOU_FLOOR = 0.015 SOFT_YOLO_KLT_MAX_AREA_RATIO = 9.0 SOFT_YOLO_LOST_DIST_DIAG = 7.0 SOFT_YOLO_LOST_DIST_MIN = 48.0 # Предыдущий hotfix был слишком быстрый: иногда принимал ложняк на 1 кадр. TARGET_SWITCH_CONFIRM_HITS = 2 WEAK_REACQ_ADOPT_HITS = 2 FAST_HANDOFF_CONFIRM_HITS = 2 STALE_LOCK_BREAK_DIST_DIAG = 1.6 STALE_LOCK_BREAK_MIN_MISS = 2 GUIDANCE_OVERRIDE_MISS_GE = 3 # ===== Safe YOLO re-anchor patch v3 ===== # Fixes stale KLT/ByteTrack hold: if KLT is confident but stuck on the old # position, a repeated YOLO candidate can re-anchor Kalman/KLT after M/N hits. YOLO_REANCHOR_ENABLE = True YOLO_REANCHOR_MISS_GE = 2 YOLO_REANCHOR_ABSENT_GE = 1 YOLO_REANCHOR_MIN_SCORE = 0.065 YOLO_REANCHOR_HITS = 2 YOLO_REANCHOR_TRACK_HITS = 2 YOLO_REANCHOR_WINDOW = 3 YOLO_REANCHOR_REPEAT_DIST_MIN = 46.0 YOLO_REANCHOR_REPEAT_DIST_DIAG = 2.8 YOLO_REANCHOR_PRED_DIST_MIN = 72.0 YOLO_REANCHOR_PRED_DIST_DIAG = 7.0 YOLO_REANCHOR_NEAR_PRED_ONE_SHOT_SCORE = 0.18 YOLO_REANCHOR_MAX_AREA_RATIO = 20.0 YOLO_REANCHOR_MAX_ASPECT_RATIO = 8.0 YOLO_REANCHOR_OSD_REJECT = True YOLO_REANCHOR_OSD_MIN_SCORE = 0.12 YOLO_REANCHOR_RESET_KLT = True # Let the re-anchor path do the recovery work before guidance is reset. STALE_LOCK_BREAK_MIN_MISS = 3 FAST_HANDOFF_CONFIRM_HITS = 2 # Debug: draw only fresh ByteTrack boxes; predicted old BT boxes caused visual "sticking" confusion. DRAW_BT_ONLY_FRESH = True # ===== Multi-hypothesis trajectory prediction patch v4 ===== # Builds several short-term hypotheses when YOLO/ByteTrack lose the target: # constant velocity, acceleration, damped velocity, left/right turn, up/down. # These hypotheses expand the ROI and help YOLO re-anchor without accepting one-frame false positives. TRAJ_PREDICT_ENABLE = True TRAJ_PREDICT_MISS_GE = 1 TRAJ_HISTORY_LEN = 18 TRAJ_HISTORY_LOOKBACK = 8 TRAJ_HISTORY_KEEP_MISS_LE = 2 TRAJ_VEL_HIST_WEIGHT = 0.55 TRAJ_MAX_ACCEL_PX_S2 = 1200.0 TRAJ_HORIZON_MISS_OFFSET = 1 TRAJ_HORIZON_MIN_SEC = 0.08 TRAJ_HORIZON_MAX_SEC = 0.55 TRAJ_BOX_GROW_PER_MISS = 0.08 TRAJ_BOX_GROW_MAX = 1.75 TRAJ_MAX_HYPOTHESES = 7 TRAJ_DUP_CENTER_DIST = 8.0 TRAJ_USE_ACCEL = True TRAJ_MIN_SPEED_FOR_MANEUVER = 8.0 TRAJ_LATERAL_ACCEL_MIN = 90.0 TRAJ_LATERAL_ACCEL_MAX = 620.0 TRAJ_LATERAL_ACCEL_SPEED_GAIN = 5.5 TRAJ_VERTICAL_ACCEL_MIN = 60.0 TRAJ_VERTICAL_ACCEL_MAX = 420.0 TRAJ_VERTICAL_ACCEL_SPEED_GAIN = 3.5 # Use prediction hypotheses for detector search and re-anchor scoring. TRAJ_ROI_ENABLE = True TRAJ_ROI_MISS_GE = 1 TRAJ_ROI_MARGIN = 70 TRAJ_ROI_MIN_SIDE = 170 TRAJ_REANCHOR_ENABLE = True TRAJ_REANCHOR_MIN_SCORE = 0.055 TRAJ_REANCHOR_DIST_MIN = 64.0 TRAJ_REANCHOR_DIST_DIAG = 4.2 TRAJ_USE_PRIMARY_FOR_HOLD = True TRAJ_HOLD_MISS_GE = 1 DRAW_TRAJ_PREDICTIONS = True # Trajectory evidence may adopt faster than a generic far re-anchor, but still requires # repeat confirmation unless the score is strong and close to a predicted hypothesis. YOLO_REANCHOR_NEAR_PRED_ONE_SHOT_SCORE = 0.16 YOLO_REANCHOR_HITS = 2 YOLO_REANCHOR_TRACK_HITS = 1 # ===== Close-stage ROI priority patch v5 ===== # In close stage do not run full-screen YOLO on every detector tick. # Use ROI-KF/ROI-TRAJ while lock is healthy; run FULL-CLOSE only as a periodic # health-check or when the anchor is weak/missing. This reduces false positives # entering ByteTrack while the real target is already locked. CLOSE_PERIODIC_FULLSCAN_ENABLE = True CLOSE_PERIODIC_FULLSCAN_EVERY = 12 CLOSE_FULLSCAN_MISS_GE = 2 CLOSE_FULLSCAN_WHEN_KLT_INVALID = True CLOSE_FULLSCAN_TARGET_ABSENT_GE = 2 from runtime_env import apply_config_env_overrides apply_config_env_overrides(globals())