RAD-C++ 高性能无监督异常检测系统
零样本 · 精准 · 工业级性能



项目概述
RAD-C++ 是一个基于纯C实现的高性能无监督异常检测系统,采用DINOv3视觉Transformer作为特征编码器,通过构建特征记忆库实现无需训练的零样本异常检测。本项目将原本需要PyTorch深度学习框架的Python实现,成功移植为仅依赖ONNX Runtime的轻量级C解决方案,大幅提升了推理速度并降低了部署门槛。
核心特性
| 特性 |
说明 |
| 零样本检测 |
无需训练,仅需正常样本构建记忆库即可检测异常 |
| 高性能推理 |
C++实现 + ONNX Runtime,比Python版本快3-5倍 |
| 精准定位 |
像素级异常热力图,精确定位缺陷位置 |
| 多线程加速 |
OpenMP并行处理,充分利用多核CPU |
技术架构
1. 核心组件
┌─────────────────────────────────────────────────────────────┐
│ RAD-C++ 架构 │
├─────────────────────────────────────────────────────────────┤
│ 输入层 │ 图像加载 → 预处理 (Resize/Crop/Normalize) │
├────────────┼────────────────────────────────────────────────┤
│ 特征编码 │ DINOv3 Encoder (ONNX) → 提取CLS + Patch特征 │
├────────────┼────────────────────────────────────────────────┤
│ 记忆库 │ Memory Bank ← 训练阶段存储正常样本特征 │
├────────────┼────────────────────────────────────────────────┤
│ 异常检测 │ KNN检索 + 位置感知匹配 → 计算异常分数 │
├────────────┼────────────────────────────────────────────────┤
│ 输出层 │ 异常分数 + 热力图可视化 + 叠加图 │
└─────────────────────────────────────────────────────────────┘
2. 关键技术
DINOv3 视觉Transformer
- 自监督预训练:无需标注数据,从大量图像学习视觉表示
- 多层次特征:提取中间层特征,捕获不同粒度信息
- Patch级特征:支持像素级异常定位
特征记忆库 (Memory Bank)
class MemoryBank {
std::vector<std::vector<float>> cls_features;
std::vector<std::vector<float>> patch_features;
std::vector<float> cls_mean, cls_std;
};
位置感知KNN检索
- 传统KNN:仅比较特征相似度
- 位置感知KNN:同时考虑空间位置关系,提升定位精度
- 多尺度融合:融合多层特征,平衡检测精度和召回率
快速上手
环境要求
- 操作系统:Windows 10/11 (x64)
- 编译器:MinGW-w64 或 MSVC 2019+
- CMake:>= 3.16
- 依赖库:
- ONNX Runtime >= 1.16
- OpenBLAS >= 0.3.0 (可选,推荐)
安装步骤
git clone https://github.com/yourusername/rad_cpp.git
cd rad_cpp
.\build.ps1
.\build_memory_bank.ps1 -Category metal_nut
.\detect_single.ps1 -ImagePath "./data/mvtec/metal_nut/test/bent/000.png" -Category metal_nut
使用示例
1. 构建记忆库(训练阶段)
.\build_memory_bank.ps1 -Category metal_nut
.\build_memory_bank.ps1 -Category metal_nut -ImageSize 1024 -CropSize 896
.\build_memory_bank.ps1 -Category metal_nut -UseRoi -RoiRatio 0.8
2. 单张图像检测
.\detect_single.ps1 `
-ImagePath "./test.png" `
-Category metal_nut
.\detect_single.ps1 `
-ImagePath "./test.png" `
-Category metal_nut `
-VisThreshold 0.05
3. 批量检测
.\detect_batch.ps1 -Category metal_nut -DefectType bent
.\detect_batch.ps1 -Category metal_nut -TestAll
4. 评估性能
.\evaluate.ps1 -Category metal_nut
核心参数说明
图像预处理参数(训练与推理必须一致)
| 参数 |
说明 |
默认值 |
建议值 |
image_size |
图像缩放尺寸 |
512 |
小图256-512,大图1024 |
crop_size |
中心裁剪尺寸 |
448 |
需为16的倍数 |
resize_mask |
异常图输出尺寸 |
256 |
最终热力图分辨率 |
检测参数
| 参数 |
说明 |
默认值 |
建议值 |
k_image |
图像级最近邻数量 |
150 |
50-200,越大越精确但越慢 |
use_positional_bank |
使用位置感知KNN |
true |
保持默认 |
pos_radius |
位置感知半径 |
1 |
保持默认 |
ROI参数(感兴趣区域)
| 参数 |
说明 |
默认值 |
use_roi |
启用ROI裁剪 |
false |
roi_ratio |
ROI占原图比例 |
0.8 |
性能表现
推理速度
| 配置 |
单张推理时间 |
FPS |
| CPU + OpenBLAS |
~200ms |
~5 |
检测精度(MVTec metal_nut)
| 指标 |
数值 |
| AUROC |
0.9980 |
| AP |
0.9995 |
| Best F1 |
0.9894 |
项目结构
rad_cpp/
├── CMakeLists.txt # CMake构建配置
├── build.ps1 # 编译脚本
├── build_memory_bank.ps1 # 训练脚本
├── detect_single.ps1 # 单张推理脚本
├── detect_batch.ps1 # 批量推理脚本
├── evaluate.ps1 # 评估脚本
├── include/ # 头文件
│ ├── config.hpp # 配置管理
│ ├── dinov3_encoder.hpp # DINOv3编码器
│ ├── memory_bank.hpp # 特征记忆库
│ ├── rad_detector.hpp # 异常检测器
│ └── utils.hpp # 工具函数
├── src/ # 源文件
│ ├── main.cpp # 主程序入口
│ ├── config.cpp # 配置实现
│ ├── dinov3_encoder.cpp # 编码器实现
│ ├── memory_bank.cpp # 记忆库实现
│ ├── rad_detector.cpp # 检测器实现
│ ├── math_utils.cpp # 数学工具
│ └── utils.cpp # 工具实现
├── models/ # 模型文件
│ ├── dinov3_vits16.onnx # DINOv3 ONNX模型
│ └── memory_bank_*.bin # 特征记忆库
└── data/ # 数据集
└── mvtec/
└── metal_nut/ # MVTec样本数据
技术亮点
1. 纯C++高性能实现
- 去除Python依赖,单可执行文件部署
- 使用ONNX Runtime进行高效推理
- OpenMP多线程加速特征提取
2. 智能参数管理
- 训练参数自动保存到记忆库
- 推理时自动加载,确保一致性
- 命令行参数覆盖灵活配置
3. 完善的评估体系
- 支持AUROC、AP、F1等多种指标
- 自动计算最佳分类阈值
- 可视化热力图和叠加图
4. 企业级功能
- ROI感兴趣区域检测
- 批量处理支持
- 性能基准测试工具
应用场景
- 工业质检:检测产品表面缺陷(划痕、变色、变形等)
- 医疗影像:识别医学图像中的异常区域
- 安防监控:检测视频帧中的异常物体或行为
- 食品安全:检测食品包装缺陷或异物
源码获取
联系微信:RC16348,洛卡
备注:RAD C++