# surface-ai
**Repository Path**: soon14/surface-ai
## Basic Information
- **Project Name**: surface-ai
- **Description**: https://github.com/celien99/surface-ai
- **Primary Language**: C++
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-20
- **Last Updated**: 2026-07-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🏭 Surface AI Framework
> **工业级表面缺陷检测框架 —— "一切皆是 Surface"**
[](https://en.cppreference.com/w/cpp/20)
[](https://cmake.org/)
[]()
[]()
**Surface AI** 是一套从零设计的 C++20 工业表面缺陷检测框架,覆盖 **采集 → 成像 → AI 推理 → 异常检测 → 知识检索 → 规则决策 → 贝叶斯自动调优 → 可视化** 的完整链路。框架不与任何具体产品耦合,产品仅作为元数据注入。
- 🧠 **PatchCore + PCA 双检测器**,FAISS 向量检索引擎,GPU 加速
- 📚 **SQLite 知识图谱** + FAISS 混合检索(向量 + 元数据双路径 + RRF/加权融合)
- ⚖️ **自研 AST 规则引擎** + 决策树推理器,YAML 存储,全链路可溯源
- 🔄 **在线自进化**:多信号共识门控 + 新颖性检测 + 双缓冲热更新 FeatureBank,支持多 SKU/多工位独立进化
- 🎯 **贝叶斯自动调优**(GP + EI),离线优化 detection 参数,熔断自动回滚
- ⚡ **C++20 协程** + 无锁 SPSC 队列 + CUDA Stream 异步推理,工业级吞吐
- 🖥️ **Qt6/QML 工业深色 UI**,4 屏仪表板(Pipeline / 检测 / 仪表板 / 配置)
- 🐳 **Docker 一键部署**,systemd 守护,OPC UA 工业协议
---
## 系统架构
```mermaid
graph TB
subgraph L1["📷 采集"]
Camera["ICamera
GenICam / FakeCamera"]
end
subgraph L2["🖼️ 成像"]
Raw["RawImage"] --> Pipe["预处理链
Debayer · WB · Resize"]
Pipe --> Surf["SurfaceImage"]
end
subgraph L3["🧠 AI 推理"]
Engine["IInferenceEngine
TensorRT / Mock"]
Adapt["模型适配器
DINOv3 · CLIP"]
Emb["IEmbedder
PatchEmbedder · GlobalEmbedder"]
Det["IDetector
PatchCore · PcaDetector"]
Engine --> Adapt --> Emb --> Det
end
subgraph L4["📚 知识 & 检索"]
KG["KnowledgeGraph
SQLite 属性图"]
VP["VectorPath
FAISS TopK / Range"]
MP["MetadataPath
SQLite 过滤"]
Fusion["IScoreFusion
Weighted · RRF"]
KG --> VP & MP --> Fusion
end
subgraph L5["⚖️ 决策"]
Rule["RuleEngine
AST 表达式 · YAML 规则"]
Tree["DecisionTree
分支节点 · 加权 Sigmoid"]
Reason["IReasoner
裁决 · 溯源 · 证据"]
SAM2["SAM2Segmenter
异常区域边界精细化"]
Rule --> Reason
Tree --> Reason
Reason -.->|可选,默认禁用| SAM2
end
subgraph L6["🎯 编排 & 进化"]
PL["Pipeline
7-Stage · YAML 驱动"]
Evo["CoresetEvolution
在线自进化 · BankKey 路由"]
Tune["TuningScheduler
GP+EI 贝叶斯优化"]
PL --> Evo
PL -.->|读取 KG 反馈| Tune
end
subgraph L7["🖥️ 呈现"]
VM["ViewModels
Pipeline · Inspection · Dashboard"]
UI["QML 4-Screen
工业深色 UI"]
VM --> UI
end
Camera --> Raw
Surf --> Engine
Det --> KG
Fusion --> Rule
Reason --> PL
PL --> VM
```
> **注意**:TuningScheduler 的 GP+EI 优化器完整可用,但优化结果的热重载(自动写入 detection 阈值/规则权重/裁决边界)尚未绑定——ParameterApplier 回调接口已预留,参数产出写入 KG,但运行时自动热更新路径待实现。
---
## 主链路
一帧图像从采集到最终裁决的完整数据流:
```
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Capture │──→│Preprocess│──→│Inference │──→│ Detect │──→│RuleEval │──→│ Reason │──→│ Export │
│ │ │ │ │ │ │ │ │ │ │ │ │ │
│ RawImage │ │SurfaceImg│ │Embedding │ │Detection │ │ FactBase │ │Reasoning │ │ JSON │
│ │ │ │ │ │ │ Result │ │+Resolved │ │ Result │ │ +PPM │
└──────────┘ └──────────┘ └──────────┘ └────┬─────┘ │ Rules │ │(verdict │ └──────────┘
│ └──────────┘ │ severity │
│ │ │ evidence)│
▼ ▼ └─────┬────┘
┌────────────────────────────┐ │
│ KnowledgeGraph │ │
│ InspectionRecorder 写入 │ │
│ FactBuilder 读取+检索 │ │
└────────────┬───────────────┘ │
│ │
┌────────────▼───────────────┐ │
│ CoresetEvolution (后台) │◀───────┘
│ 多信号共识 · 新颖性检测 │ result callback
│ 双缓冲热更新 FeatureBank │ per-BankKey 路由
└────────────────────────────┘
```
| # | 阶段 | 输入 → 输出 | 核心职责 |
|---|------|------------|---------|
| 1 | Capture | — → `RawImage` | 相机帧抓取(GenICam / FakeCamera),支持硬件/软件/自由运行触发模式 |
| 2 | Preprocess | `RawImage` → `SurfaceImage` | 去拜耳、白平衡、缩放、ROI 提取、HDR 合成 |
| 3 | Inference | `SurfaceImage` → `Embedding` | DINOv3 补丁特征 / CLIP 全局特征提取(TensorRT) |
| 4 | Detect | `Embedding` → `DetectionResult` | PatchCore k-NN 异常评分 / PCA 子空间建模,BankKey(surface_id, position_id) 多工位路由 |
| 5 | RuleEval | `DetectionResult` → `FactBase` + `ResolvedRules` | 构建事实库(检测结果 + KG 路径解析 + FAISS 向量检索),AST 规则评估,冲突消解 |
| 6 | Reason | `FactBase` + `ResolvedRules` → `ReasoningResult` | 决策树遍历,加权 Sigmoid 评分,生成裁决(OK/NG/WARN)+ 证据链 + 全链路溯源 |
| 7 | Export | `ReasoningResult` → JSON + PPM | 检测报告输出,缺陷区域标注图,回调 UI 更新 |
**后台自进化闭环:** 每帧检测完成后,结果回调根据 `(surface_id, position_id)` 路由到对应工位的 `CoresetEvolution` 实例 → `AssessAndOffer` 评估帧的正常性(5 路信号共识)和新颖性(覆盖率 < 60%)→ `CandidateBuffer` 累积候选帧 → 后台线程合并 + 贪心 coreset 重选 + 双缓冲热切换 `FeatureBank` → 写入 `KnowledgeGraph` 演化记录。单工位和 Multi-Position 模式均支持。
**后台调优闭环(离线):** `TuningScheduler` 周期性从 `KnowledgeGraph` 读取历史检测记录 → 用高斯过程 + 预期改进(GP+EI)在 `TuningSpace` 中寻优 → 产出最优参数向量。参数热重载接口(`ParameterApplier`)已预留但尚未与 detection 参数联动。
---
## 功能特性
### AI 检测
- **PatchCore**:coreset k-NN 异常检测,PCA 白化,自适应阈值(目标 FPR),混合 k-NN×PCA 评分
- **PcaDetector**:PCA 子空间建模,4 种评分(重建误差 / 马氏 / 余弦 / 欧几里得)
- **后处理**:高斯平滑、双线性上采样、4-连通分量标记、区域提案排序
- **镜面反射过滤**:四线索融合(亮度/去饱和度/LoG曲率/过曝剪切),抑制光泽表面伪影
- **多信号共识**:正态性评估 + 检测分数 + 规则匹配 + 推理裁决 + PCA 子空间,5 路联合判否
### 多 SKU & 在线自进化
- **BankKey 路由**:`(surface_id, position_id)` 键值路由,每个产品/工位独立 PatchCore 实例 + FeatureBank
- **CoresetEvolution**:后台线程周期性评估每帧正常性/新颖性,双缓冲热更新 FeatureBank
- **NoveltyFilter**:覆盖率阈值判定(< 60% 为新类型),触发 coreset 扩展
- **CandidateBuffer**:有界缓冲累积候选帧(max 50 帧 / 50000 patch),双触发条件(20 帧或 20000 patch)
- **NormalityScorer**:基于 FeatureBank 自查询的 P50/P95/P99/均值/标准差统计量
- **安全门控**:正常性分数 < 0.80 时跳过进化,防止缺陷帧污染 coreset
### 特征提取
- **DINOv3**(ViT 补丁特征)、**CLIP**(全局 [CLS] 特征)
- 多层特征聚合(Concat / Mean / Group),显著性掩码(Percentile / Otsu)
- PCA 降维 + 球化白化 + 空间池化(Avg / Max),流式 PCA 支持大数据集
- 双存储 Embedding(GPU/CPU),零拷贝共享指针,LRU 特征缓存
### 知识 & 检索
- **知识图谱**:SQLite 属性图,节点 + 边 + JSON 属性,最大深度 3 遍历
- **向量检索**:FAISS TopK / Range / Hybrid 三种模式,GPU 加速
- **元数据检索**:SQLite 结构化过滤(=、≠、<、>、Like、In)
- **混合检索**:Weighted 线性加权 / RRF 倒数排名融合,双路径编排
- 知识演化变更日志,SAVEPOINT 快照,统一 KnowledgeStore 门面
### 规则 & 决策
- **AST 表达式引擎**:字面量 / 字段引用 / 二元 & 一元运算 / 内置函数 / 图路径表达式
- **YAML 规则存储**:优先级 + 条件 + 动作 + 覆盖层次
- **决策树**:分支节点(数值范围分派)+ 叶子节点(加权 Sigmoid 公式)
- **全链路溯源**:TraceRecorder 记录每一步(表达式→规则→树分支→评分),EvidenceCollector 汇总证据
- **FactBuilder**:自动从 DetectionResult + KnowledgeGraph + VectorPath 构建事实库
- **SAM2Segmenter**(可选):对异常区域做边界精细化掩膜,默认禁用(预留,未激活)
### 贝叶斯自动调优
- **TuningSpace**:连续/离散参数空间,线性约束,YAML 定义
- **BayesianOptimizer**:GP 代理 + EI 采集函数,RBF 核 + Cholesky 分解 + L-BFGS-B
- **KnowledgeGraphObjective**:从历史检测记录计算 FP/FN 代价,支持仿真模式
- **TuningScheduler**:后台周期调度,监控窗口 + NG 率异常检测 + 熔断自动回滚
- **待完成**:`ParameterApplier` 回调接口已定义,但尚未绑定到 PatchCore/DecisionTree 的运行时参数热更新
### 流水线 & 调度
- **7-Stage Pipeline**:Capture → Preprocess → Inference → Detect → RuleEval → Reason → Export
- **YAML 驱动**:拓扑声明 + 依赖解析(Kahn 算法)+ 类型兼容性校验
- **StageQueue\**:有界 SPSC 无锁环形缓冲区,三种背压策略(阻塞/丢旧/降级)
- **Scheduler**:StageType → WorkerPool 固定映射,队列深度/P99延迟/丢帧指标采集(已合并入 pipeline 模块)
### 可视化
- **4 屏工业 UI**:Pipeline 状态 / 检测详情 / 产量仪表板 / YAML 配置编辑器
- **FrameProvider**:QQuickImageProvider 环形缓冲区缓存,零拷贝帧传递
- **实时热力图**:异常分数覆盖层,缺陷 bounding box 标注
### 工业接口
- **GenICam / GigE Vision** 相机采集,**OPC UA** PLC 通信
- **FakeCamera**:合成帧生成器(正弦纹理 + Perlin 噪声),无硬件可跑全链路
- **spdlog** 异步日志,双级溢出策略(Trace/Debug 丢弃,Warning+ 阻塞)
---
## 快速开始(Docker)
### 前置条件
| 依赖 | 说明 |
|------|------|
| **Docker** | ≥ 20.10 |
| **nvidia-container-toolkit** | GPU 容器运行时 |
| **NVIDIA GPU** | 驱动 ≥ 525,CUDA 12.4 |
### 三步运行
```bash
# 1. 构建镜像
docker compose build
# 2. 训练 Coreset(使用正常样本构建特征库)
docker compose --profile train run seat_aoi_train
# 3. 批量检测
docker compose --profile detect up seat_aoi_detect
```
### 运行模式
```bash
# 训练模式:从正常样本图像目录构建 Coreset
./seat_aoi train \
--image-dir /data/normal/ \
--coreset-algo greedy \
--coreset-max-samples 10000 \
--coreset-output /app/resources/coresets/default.bin
# 批量检测模式(Headless):处理待检图像目录,输出 JSON 报告
./seat_aoi --image-dir /data/samples/ \
--coreset /app/resources/coresets/default.bin \
--output-dir /data/results/
# GUI 实时模式:FakeCamera 模拟帧源,全链路可视化
./seat_aoi
# Review 模式:回顾历史检测结果(读取 review_index.json)
./seat_aoi --review-dir /data/results/
```
### Docker 服务说明
`docker-compose.yml` 定义了两个活跃服务,均使用 `nvidia` runtime:
| 服务 | Profile | 用途 |
|------|---------|------|
| `seat_aoi_train` | `--profile train` | 一次性训练,生成 coreset 文件 |
| `seat_aoi_detect` | `--profile detect` | 批量检测,处理完退出 |
```bash
# 训练
docker compose --profile train run seat_aoi_train
# 批量检测
docker compose --profile detect up seat_aoi_detect
```
---
## 原生构建(Ubuntu 22.04 x64)
### 系统依赖
```bash
sudo apt-get update && sudo apt-get install -y \
build-essential cmake gcc-12 g++-12 \
libspdlog-dev libyaml-cpp-dev libsqlite3-dev \
libopen62541-dev libaravis-dev libfaiss-dev \
qt6-base-dev libgl1-mesa-dev libomp-dev
```
### 安装 vcpkg
```bash
git clone https://github.com/Microsoft/vcpkg.git ~/vcpkg
~/vcpkg/bootstrap-vcpkg.sh
export VCPKG_ROOT=~/vcpkg
```
### 构建 & 测试
```bash
cmake --preset linux # 配置
cmake --build --preset linux # 构建
ctest --preset linux # 运行全部测试
# 按名称过滤
ctest --preset linux -R "tuning"
# 运行单个测试用例
cd build/linux && ctest -R "BayesianOptimizer.FindsMinimumOfQuadratic" --output-on-failure
# 直接运行测试二进制(支持 --gtest_filter)
cd build/linux && ./tests/detection/sai_detection_test --gtest_filter="PatchCore*"
```
---
## 技术栈
| 关注点 | 选型 | 说明 |
|--------|------|------|
| 语言标准 | **C++20** | 协程(`co_await`)、Concepts |
| 并发模型 | **C++20 Coroutines** + 固定 WorkerPool | GPU 通过 CUDA Stream + callback 恢复协程 |
| 错误处理 | **`tl::expected`**(别名 `Result`) | 默认返回 `Result`;异常仅用于构造/初始化失败 |
| 推理后端 | **TensorRT** | FP16/INT8、动态 shape、多 GPU |
| 向量检索 | **FAISS** | 进程内检索,可选 faiss-gpu |
| 规则引擎 | **自研 AST 表达式引擎** + YAML | 不用 Lua — 避免任意代码执行风险 |
| 知识图谱 | **SQLite**(进程内属性图) | SAVEPOINT 快照,演化变更日志 |
| 配置格式 | **YAML**(yaml-cpp) | Pipeline / 规则 / 决策树 / 调优参数统一 YAML |
| 参数寻优 | **贝叶斯优化**(GP + EI) | 离线后台线程,周期性读 KG 反馈,熔断自动回滚 |
| GUI | **Qt 6** | QML + C++ ViewModel 层 |
| PLC 通信 | **OPC UA**(open62541) | 工业标准协议 |
| 相机采集 | **GenICam / GigE Vision** | 标准工业相机接口 |
| 日志 | **spdlog** | 异步 sink,双级溢出策略 |
| 测试 | **GoogleTest + gmock** | |
| 部署 | **Docker + systemd** | nvidia-container-toolkit |
---
## 模块总览
19 个模块,每个模块对应一个命名空间 `sai::`,编译为独立静态库 `sai_`。
| # | 模块 | 核心职责 |
|---|------|---------|
| 1 | `core` | Object/Resource 基类、TypeRegistry、Context(DI 容器)、生命周期状态机 |
| 2 | `memory` | ArenaAllocator、GpuPool(CUDA)、PinnedPool(CUDA)、PooledPtr 智能池化指针 |
| 3 | `plugin` | PluginManager、Manifest 解析(Capability/License/Version 已合并) |
| 4 | `runtime` | `Task` C++20 协程、WorkerPool、TaskGraph、PipelineExecutor、GpuStreamQueue(CUDA) |
| 5 | `infra` | Logger(spdlog 封装)、ConfigSchema/ConfigStore(yaml-cpp)、inotify 热重载 |
| 6 | `device` | IDevice/ICamera/ILightController 硬件抽象、RingBuffer、FakeCamera |
| 7 | `image` | Image/RawImage/SurfaceImage/GpuImage 类型体系、ROI、预处理链 |
| 8 | `io` | IImporter/BasicImporter、IExporter/JsonExporter |
| 9 | `inference` | IInferenceEngine(TensorRT/Mock)、DINOv3/CLIP/SAM2 适配器、多层特征聚合 |
| 10 | `embedding` | Embedding(double 存储)、PatchEmbedder/GlobalEmbedder、DimensionReducer/PCA、FeatureCache |
| 11 | `detection` | PatchCore、PcaDetector、FeatureBank(FAISS)、CoresetEvolution、MultiSignalConsensus、SpecularFilter |
| 12 | `knowledge` | KnowledgeGraph(SQLite 属性图)、KnowledgeEvolution、KnowledgeSnapshot、KnowledgeStore |
| 13 | `retrieval` | VectorPath(FAISS TopK/Range/Hybrid)、MetadataPath、WeightedFusion/RRFFusion、HybridRetriever |
| 14 | `rule` | RuleEngine(AST 表达式 + YAML 规则)、FactBase/ConflictResolver、FactBuilder |
| 15 | `reasoner` | DecisionTree、IReasoner/DefaultReasoner(Sigmoid 评分 + 全链路溯源)、EvidenceCollector |
| 16 | `tuning` | TuningSpace、BayesianOptimizer(GP+EI)、KnowledgeGraphObjective、TuningScheduler |
| 17 | `pipeline` | Pipeline(YAML 驱动 7-Stage)、PipelineBuilder、StageQueue\(SPSC 无锁)、Scheduler |
| 18 | `visualization` | PipelineViewModel、InspectionViewModel、DashboardViewModel、FrameProvider、QML 4 屏 UI |
> 注:原独立的 `scheduler` 模块(#18)已合并入 `pipeline` 模块。模块总数 18 个。
---
## 项目结构
```
surface-ai/
├── CMakePresets.json # CMake preset(Linux x64, vcpkg)
├── vcpkg.json # vcpkg 清单
├── vcpkg-overlays/ # 自定义 vcpkg ports(FAISS w/ GPU)
├── Dockerfile # 生产镜像
├── docker-compose.yml # 多服务编排(train / detect)
│
├── docs/
│ ├── superpowers/specs/ # 阶段设计 spec(Approved)
│ ├── superpowers/plans/ # 执行计划(task-by-task)
│ └── surface-ai/
│ ├── design/ # 14 节冻结设计文档(中文)
│ └── glossary-and-contracts.md # 跨批次接口契约(活文档)
│
├── .superpowers/sdd/ # SDD 工作流:per-task brief / report / review diff
│
├── apps/seat-aoi/
│ ├── main.cpp # 参考应用入口
│ └── resources/
│ ├── pipeline.yaml # Pipeline 拓扑
│ ├── rules/ # 规则 YAML
│ ├── trees/ # 决策树 YAML
│ └── tuning/ # 贝叶斯调优 YAML
│
├── include/sai/ # 公开头文件(18 个模块)
├── src/ # 实现文件 + per-module CMakeLists.txt
└── tests/ # GoogleTest 套件(模块测试 + 集成测试)
```
---
## 贡献指南
### 工作流
本项目使用 **Superpowers Spec-Driven Development (SDD)**:
```
Spec(审批)→ Plan(checkbox 任务)→ Brief → Report → Review Diff → Commit
```
`.superpowers/sdd/` 是任务账本——恢复工作前先读它。
### 设计文档规范
- 所有设计文档遵循固定的 **14 节结构**,验证命令:`grep -c "^## [0-9]" ` —— 预期 `14`
- **Design 章节严禁清单式罗列**("支持 A/B/C/D"),必须做明确决策
- 跨批次接口以 `docs/surface-ai/glossary-and-contracts.md` 为唯一事实来源——每个概念/接口归属一个批次,其他批次引用、不重定义
### 代码风格
- 不过度防御,避免深层嵌套,优先 early return;树/图结构优先用递归
- 错误处理用 `Result` 的 monadic 链(`and_then`/`or_else`)
- 模板方法留在头文件,非模板方法移入 `.cpp`
- 模块 CMakeLists.txt 在 target 级别做编译门控,不使用 `#ifdef`
### 语言约定
| 内容 | 语言 |
|------|------|
| 设计文档 / Spec | **中文** |
| 代码标识符 / 注释 | **English** |
| Git 提交描述 | **中文** |
| Commit message 结构 | 英文 type/scope + 中文描述 |
### Git 提交规范
**约定式提交 + Gitmoji**,格式:`(): <中文描述>`
| type | emoji | 用途 |
|------|:-----:|------|
| `feat` | ✨ | 新功能 |
| `fix` | 🐛 | 修复 Bug |
| `chore` | 🔧 | 构建/工具/依赖/日常 |
| `refactor` | ♻️ | 重构(无新功能无修复) |
| `docs` | 📝 | 仅文档/注释 |
| `style` | 💄 | 不影响含义的格式 |
| `perf` | ⚡ | 性能优化 |
| `test` | ✅ | 测试 |
| `ci` | 💚 | CI/CD 配置 |
---
## License
This project is proprietary. All rights reserved.