Skip to content

Repository files navigation

XFDemo indoor fire hydrant inspection

XFDemo

让每一个 AI 结论,都能回到图像证据。

Evidence-first multimodal fire-safety inspection
VLM · YOLO · Specialist Review · Deterministic Harness · Human Feedback

GitHub Stars GitHub Forks GitHub Issues

Vue 3 Flask VLM YOLO assisted Human in the loop

30 秒看懂 · 推理架构 · 快速开始 · 参与共建


XFDemo 不是又一个 VLM Prompt Wrapper。

它是一条面向真实视觉巡检的证据链:模型负责观察,YOLO 负责定位,专项复核负责质疑,确定性规则负责守住边界,人工复核负责持续纠错。

30 秒看懂 XFDemo

01 · SEE 02 · LOCATE 03 · VERIFY 04 · GUARD 05 · TRACE
VLM 理解全图语义 YOLO 定位可见组件 专项模型复核争议项 规则阻止无证据结论 保存链路并支持人工纠错
一张巡检图
   │
   ├── VLM:看到了什么?整体是否异常?
   ├── YOLO:哪些组件真的可见?分别在哪里?
   ├── Specialist Review:缺失、方向、折弯是否成立?
   ├── Harness:标签和证据是否一致?范围有没有串用?
   └── Report:只输出最终成立的异常与对应证据

为什么值得关注

单次 VLM 输出在真实巡检中很容易遇到这些问题:

常见问题 XFDemo 的处理方式
首轮识别到了异常,后续复核却把它覆盖 专项复核只拥有自己负责的标签,不允许清空其他证据
YOLO 没检出组件,系统就断言“组件缺失” YOLO 只提供辅助候选框,未检出不能单独证明缺失
透明箱门同时显示外观和内部,模型范围串用 先做检查范围对齐,再调用对应检测链路
自然弧度被误判为软管严重折弯 使用折弯专项证据门槛和反例约束
报告结论与正文证据互相矛盾 按“最终标签 → 对应证据”重新构建报告
线上误判无法定位是哪个环节造成的 保存阶段耗时、状态、模型摘要和 YOLO 可视化

产品能力

内部组件定位
组件级定位
YOLO 检测框与 VLM 语义互相校验
缺失类专项复核
缺失类专项复核
水枪、水带等高误判标签独立验证
箱体外观识别
外观与标识识别
内部组件和箱体外观使用独立范围

不只是一个检测页面

  • 智能检测:上传图片,生成带证据的结构化检测报告。
  • 检测历史:查看原图、YOLO 可视化、最终标签和完整推理链路。
  • 人工复核:确认或修正模型结论,记录问题来源和复核依据。
  • 数据集看板:浏览严格清洗版本、标签、Prompt 版本和数据拆分。
  • 多模态检索演示:展示以图搜图、以文搜图和以图搜文的交互链路。
  • 法规库与知识图谱演示:为后续可验证法规引用和关系检索预留产品形态。
  • 型材计数:独立 YOLO 服务演示多任务接入方式。

推理架构

flowchart LR
    UI["Vue 3"] --> API["Flask API"]
    API --> SCOPE{"检查范围"}

    SCOPE -->|内部组件| VLM["VLM 初检"]
    SCOPE -->|箱体外观| VLM
    SCOPE -->|可定位目标| YOLO["YOLO 辅助检测"]

    VLM --> JUDGE["二次复核"]
    YOLO --> JUDGE

    JUDGE --> MISSING["缺失专项"]
    JUDGE --> DIRECTION["栓口方向专项"]
    JUDGE --> BEND["软管折弯专项"]

    MISSING --> MERGE["标签与证据合并"]
    DIRECTION --> MERGE
    BEND --> MERGE

    MERGE --> HARNESS["确定性 Harness"]
    HARNESS --> REPORT["最终报告"]
    HARNESS --> TRACE["推理链路"]

    REPORT --> HISTORY["历史与人工复核"]
    TRACE --> HISTORY

    classDef primary fill:#E53935,color:#fff,stroke:#C62828;
    classDef evidence fill:#FDECEC,color:#8E1B18,stroke:#E57373;
    classDef output fill:#202124,color:#fff,stroke:#111;
    class VLM,YOLO,JUDGE primary;
    class MISSING,DIRECTION,BEND,MERGE,HARNESS evidence;
    class REPORT,TRACE,HISTORY output;
Loading

Harness 到底做了什么

  1. 检查范围对齐 区分内部组件、箱体外观和双范围可见,避免内部模型与外观模型串用。

  2. 标签别名归一化 将模型产生的同义表达映射到标准标签,减少 Prompt 变化造成的标签漂移。

  3. 证据门控 缺失、方向、折弯等高风险标签必须满足各自的可见证据条件。

  4. 专项结果隔离 每个专项只能修改自己负责的标签,不能覆盖其他阶段已经成立的异常。

  5. 冲突消解 组件明确可见时阻止“未检出即缺失”;视角或证据不足时返回无法判断。

  6. 报告重建 最终报告按照“最终标签 → 对应证据”生成,确保结论、标签和正文一致。

技术栈

Layer Stack
Web Vue 3 · Vite · Vue Router · Lucide
API Flask · Python
Vision OpenAI-compatible / Anthropic-compatible VLM API
Detection Ultralytics YOLO
Orchestration Staged Pipeline · Specialist Review · Rule Harness
Observability JSONL History · Stage Trace · YOLO Visualization
Deployment Docker · Nginx · Gunicorn

快速开始

1. 获取代码

git clone https://github.com/Chan-Developer/XFDemo.git
cd XFDemo

2. 启动后端

推荐使用 Python 3.11。

python -m venv .venv
source .venv/bin/activate
pip install -r requirements-backend.txt

在项目根目录创建 .env,至少配置一个兼容 OpenAI API 的视觉模型:

FIRST_VL_PROVIDER=openai
FIRST_VL_API_BASE=https://your-vlm-endpoint.example/v1
FIRST_VL_API_KEY=your-api-key
FIRST_VL_MODEL=your-vision-language-model

JUDGE_VL_PROVIDER=openai
JUDGE_VL_API_BASE=https://your-vlm-endpoint.example/v1
JUDGE_VL_API_KEY=your-api-key
JUDGE_VL_MODEL=your-judge-model

尚未准备 YOLO 权重时,可以先使用纯 VLM 模式:

YOLO_ENABLED=0
python -m backend.app
curl http://127.0.0.1:5000/health

3. 启动前端

推荐使用 Node.js 18 或更高版本。

cd frontend
npm ci
npm run dev

访问 http://127.0.0.1:3000。Vite 会把 /api 请求代理到 http://127.0.0.1:5000

启用 YOLO 辅助检测

仓库不包含模型权重。准备内部组件和外观模型后,在 .env 中配置:

YOLO_ENABLED=1
YOLO_PYTHON=/path/to/yolo/python
YOLO_INTERNAL_WEIGHTS=/path/to/fire_hydrant_internal.pt
YOLO_APPEARANCE_WEIGHTS=/path/to/fire_hydrant_appearance.pt
YOLO_CLASSES_FILE=/path/to/classes.json
YOLO_DEVICE=0
YOLO_CONF=0.20

YOLO 是辅助证据源,检测框不会直接决定最终合规结论。

项目结构

XFDemo/
├── backend/
│   ├── api/                         # Flask 路由
│   ├── config/                      # 环境与路径配置
│   ├── infrastructure/              # VLM、YOLO、型材计数客户端
│   └── modules/
│       ├── inspection/              # Prompt、复核、规则与报告生成
│       ├── history/                 # 检测历史与人工复核
│       └── dataset/                 # 数据集查询服务
├── frontend/                        # Vue 3 + Vite
├── services/pipes_counting/         # 型材计数推理服务
├── tools/
│   ├── data_pipeline/               # 数据处理与统计
│   ├── training/qwen25vl/           # 多模态微调数据构建
│   └── research/vision_attention/   # 离线研究工具
├── resources/                       # 参考图与演示样例
├── scripts/                         # 启动、推理和部署脚本
├── deploy/                          # Docker 与 Nginx 配置
├── archive/legacy/                  # 历史实现,仅供追溯
├── artifacts/                       # 模型与导出物,不提交 Git
├── output/                          # 离线任务产物,不提交 Git
└── runtime/                         # 在线运行产物,不提交 Git

能力边界

模型权重、训练数据、API Key、检测历史、日志和运行产物不会提交到仓库。你需要使用自己的模型服务、权重和数据完成部署。

法规库、多模态检索和知识图谱当前包含演示能力,不应直接用于真实执法、正式合规认定或其他高风险决策。

Roadmap

  • 固定人工标注回归集与端到端评测脚本
  • 检测历史迁移到结构化数据库
  • 组件级置信度校准和跨模型冲突统计
  • 法规知识库的可验证引用与版本管理
  • 可复现的 Docker Compose 开发环境
  • 英文界面与英文文档

一起把它做得更可靠

欢迎通过 Issues 分享误判样例、Prompt 设计、YOLO 数据集、评测方法或工程建议。

提交问题时,请尽量包含:

  • 脱敏后的原始图片
  • 期望结论和可见证据
  • 实际输出与推理链路
  • 使用的模型、配置和复现步骤

Star XFDemo

Built for traceable multimodal inspection.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages