RAD无监督工业异常检测检索式框架C++实现高性能记忆库构建与推理!
本项目基于C++和ONNXRuntime实现的高性能无监督异常检测项目。采用DINOv3视觉Transformer作为特征编码器,通过构建正常样本特征内存库,实现无需训练(仅构建特征记忆库)的零样本异常检测。支持单张/批量图像检测,可生成热力图可视化异常区域,适用于工业质检等场景。项目结构清晰,提供完整的构建脚本和评估工具,已在MVTec数据集上验证效果。

RAD-C++ 高性能无监督异常检测系统

零样本 · 精准 · 工业级性能

微信图片_20260330132543_1312_240.png
000_heatmap.png
微信图片_20260330132840_1313_240.png

项目概述

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 (可选,推荐)

安装步骤

# 1. 克隆仓库 git clone https://github.com/yourusername/rad_cpp.git cd rad_cpp # 2. 编译项目 .\build.ps1 # 3. 构建记忆库(训练) .\build_memory_bank.ps1 -Category metal_nut # 4. 单张图像推理 .\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 # ROI训练(只检测中心区域) .\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 # 输出示例: # ======================================== # Performance Metrics # ======================================== # AUROC: 0.9823 # AP: 0.9756 # Best F1: 0.9432 # Best Thresh: 0.0432

核心参数说明

图像预处理参数(训练与推理必须一致)

参数 说明 默认值 建议值
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++

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

RAD(Retrieval-basedAnomalyDetection,基于检索的异常检测)

下一篇
已经是最后一篇啦~
评论请先登录 登录
全部评论 0
Lv.0
0
关注
0
粉丝
0
创作
0
获赞
相关阅读
  • 读码器TCP通讯配置全解析:从客户端到服务器的实战指南
    2026-03-09 浏览 0
  • 突破标签印刷缺陷检测瓶颈,海康机器人推出高效易用型解决方案
    2026-03-10 浏览 0
  • 【计算成像】超越像素:计算光学与下一代工业视觉系统
    2026-03-09 浏览 0
  • 诚邀参会|2026年4C智能工业视觉检测专项挑战赛(本科+高职)线上启动会,邀您共启新程!
    2026-03-20 浏览 0
  • 如何适用3dmvs进行图像后处理
    2026-03-23 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器