# illegal-parking **Repository Path**: jsicu/illegal-parking ## Basic Information - **Project Name**: illegal-parking - **Description**: 违停识别 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-07 - **Last Updated**: 2026-07-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README --- title: Illegal Parking And Loitering Detector emoji: car colorFrom: red colorTo: yellow sdk: docker pinned: false --- ## GPU / CPU 自动切换 程序创建 YOLO 检测器时会自动检查当前 Python 环境中可用于推理的 CUDA GPU: - CUDA 可用时,车辆和人员检测自动使用 GPU。 - GPU 模型加载失败,或运行过程中遇到驱动、CUDA、显存异常时,会重新在 CPU 加载模型并重试当前帧。 - GPU 推理保持 FP32,检测阈值和后处理逻辑不变,避免为了提速降低识别精度。 - 没有可用 GPU 时直接使用 CPU,程序可以正常运行。 如果启动日志显示 `the installed PyTorch build is CPU-only`,说明当前环境安装的是 CPU 版 PyTorch。请根据显卡驱动支持的 CUDA 版本,从 [PyTorch 官方安装页](https://pytorch.org/get-started/locally/) 安装 CUDA 版 PyTorch,然后重新启动程序。 启动时终端会显示最终使用的设备和发生 CPU 回退的原因。 # 违停与人员入侵检测 Demo 这是一个基于离线视频的规则检测 Demo,核心链路为 `YOLOv8 + SORT + 区域/警戒线规则`。 当前支持三类能力: - 车辆违停 - 人员逗留 - 人员入侵 整体处理流程如下: 1. 使用 `yolov8n.pt` 检测画面中的车辆和人员 2. 分别使用独立的 SORT 跟踪器跟踪车辆和人员 3. 按多边形区域和警戒线规则逐帧判定 4. 输出告警结果、裁剪图、JSON 和标注视频 ## 当前能力 ### 车辆规则 - `vehicle_no_parking_zone` / `no_parking_zone` - 车辆进入禁停区域并满足停留阈值后触发 - `footpath` - 车辆进入人行道区域并满足停留阈值后触发 `footpath_parking` - `crossing` - 车辆持续遮挡斑马线区域后触发 `blocking_crossing` ### 人员规则 - `person_loitering_zone` - 人员在指定区域内停留达到阈值后触发 `person_loitering` - `person_intrusion_zone` - 人员底部中心点进入禁入区域并达到阈值后触发 `person_intrusion` - `person_intrusion_line` - 人员穿越警戒线时触发 `person_line_crossing` - 若为单向线且反方向穿越,则触发 `person_reverse_crossing` ## 标注与配置方式 页面中的 Step 2 现支持三种绘制模式: - `Polygon` - 用于车辆违停区域 - 用于人员逗留区域 - 用于人员入侵 ROI 区域 - `Line` - 用于人员入侵警戒线 - `Transform/Edit` - 用于移动、选择、删除已绘制对象 每个对象都可以单独配置: - 规则类型 - 对象编号 / 显示名称 - 阈值 - 启用时间窗 - 白名单时间窗 - 线类型 - 允许方向 ## 人员入侵规则说明 ### 1. ROI 入侵 - 判定点使用人员框的底部中心点 - 人员进入禁入区域后开始计时 - 达到阈值后触发 `person_intrusion` - 默认阈值为 `2 秒` ### 2. 警戒线越线 - 支持 `Bidirectional` 和 `Single direction` - 默认确认帧数为 `2 帧` - 方向依赖于画线时的起点和终点顺序 - 单向线逆向穿越时触发 `person_reverse_crossing` ### 3. 时间窗 启用时间窗和白名单时间窗都使用“视频相对秒数区间”表示,例如: ```text 0-60,120-180 ``` 规则如下: - 启用时间窗为空:始终启用 - 白名单时间窗为空:不做白名单抑制 - 当前 `timestamp_sec` 不在启用时间窗内:跳过该规则 - 当前 `timestamp_sec` 落在白名单时间窗内:抑制该告警 ## 输出结果 运行后会生成: - `output/violations_raw.json` - `output/violations.json` - `output/crops/` - `output/annotated.mp4` 其中告警 JSON 在原有字段基础上,新增了以下字段(有值时输出): - `zone_id` - `zone_name` - `rule_label` - `trigger_point` - `direction` - `dwell_sec` - `threshold_sec` 另外,入侵相关截图文件名中也会带上 `zone_id`。 ## 主要文件 - `src/app.py` - Streamlit 页面,负责视频上传、绘制、参数配置和结果展示 - `src/pipeline.py` - 主处理流程,负责检测、跟踪、规则判定和结果输出 - `src/violations.py` - 违停、逗留、ROI 入侵、越线/逆行规则引擎 - `src/zone_checker.py` - 多边形区域和警戒线几何判定 - `src/dedup_violations.py` - 告警去重逻辑 ## 运行方式 三个算法共用 `E:\model\.venv`。在 `E:\model` 下执行: ```powershell .\setup-env.ps1 .\run.ps1 -Target illegal-park ``` 浏览器打开: ```text http://localhost:8501 ``` ## 测试命令 在 `E:\model` 下使用共享环境做回归: ```powershell .\.venv\Scripts\python.exe IllegalParkModel\test_violations.py .\.venv\Scripts\python.exe IllegalParkModel\test_tracker.py .\.venv\Scripts\python.exe IllegalParkModel\test_dedup.py .\.venv\Scripts\python.exe -m py_compile IllegalParkModel\src\zone_checker.py IllegalParkModel\src\violations.py IllegalParkModel\src\pipeline.py IllegalParkModel\src\app.py IllegalParkModel\src\detector.py IllegalParkModel\src\trackers.py IllegalParkModel\src\sort_tracker.py ``` `test_violations.py` 当前覆盖: - 车辆违停 - 人员逗留 - 人员 ROI 入侵阈值触发 - 离开后再次进入时的计时重置 - 双向警戒线越线 - 单向警戒线逆向穿越 - 启用时间窗抑制 - 白名单时间窗抑制 ## 当前边界 - 当前仍是离线视频 Demo,不是 RTSP 实时服务 - 时间窗基于视频相对秒数,不接真实日期/班次 - 人员检测仍然只使用 COCO `person` - 不包含身份识别、PPE 识别、外部白名单系统集成 - 警戒线方向依赖于 UI 中画线时的起点和终点顺序