CIS Test Engine: 高分辨率 CMOS 图像传感器测试系统
Published:
项目概述
面向工业产线的高分辨率 CMOS 图像传感器测试系统,源自竞赛课题”高分辨率 CMOS 图像的异构算法设计与优化”。系统对 50MP(8192×6144)分辨率 的 RAW 图像数据执行三类核心检测任务,同时支持 CPU-only 和 CPU+GPU 混合两种运行模式。
核心检测任务
| 任务 | 算法 | 指标 |
|---|---|---|
| 像素缺陷检测 | 5×5 邻域均值局部自适应阈值 | 暗点/亮点/坏点,准确率 ≥ 99.5% |
| 时域噪声分析 | 10 帧像素级标准差 RMS | 反映读出噪声 + 散粒噪声 |
| 均匀性分析 | 3×3 ROI 网格相对偏差 | 评估传感器响应空间一致性 |
技术架构
| 类别 | 技术 | 说明 |
|---|---|---|
| 编程语言 | C++17 | std::filesystem、结构化绑定等现代特性 |
| GPU 计算 | CUDA 12.1+ | NVIDIA Ampere(sm_86),__half 半精度、Texture Memory |
| CPU 并行 | OpenMP | 所有热循环并行化,reduction 子句 |
| 构建系统 | CMake 3.18+ | -DUSE_GPU=ON/OFF 控制 GPU 模块编译 |
| 容器化 | Docker | 基于 nvidia/cuda:12.2.0-devel-ubuntu22.04 |
GPU 流水线优化
融合 Kernel
将原本分散的 4 个独立 kernel 融合为单个 kernel:
- 图像校正
- 5×5 邻域均值计算
- 暗/亮点检测
- 时序累加
使用 20×20 的 shared memory tile(含 2 像素 halo),减少约 75% 的全局内存访问。
双缓冲流水线
使用两个 CUDA Stream 实现 H2D 传输与 kernel 计算重叠,通过 cudaEvent 同步。
混合精度策略
- FP16:校正后图像和均值图,节省约 50% 显存带宽
- Double:时序累加统计,确保数值稳定性
内存管理
针对 RTX 3060 的 6GB VRAM 进行分层管理:
| 层级 | 内容 | 占用 |
|---|---|---|
| 常驻层 | Dark/Gain Map + 标记图 + 统计缓冲 | 864 MB |
| 流式层 | 双缓冲原始帧 | 576 MB |
| CUDA 运行时 | — | 500 MB |
| 总计 | 1.94 GB |
性能优化成果
单组 50MP 数据处理耗时从初始版本的数秒优化至 0.51 秒,4 组数据 6.8 秒,远超竞赛要求(单组 10 秒、4 组 20 秒)。
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 单组耗时 | 数秒 | 0.51 秒 |
| 4 组耗时 | — | 6.8 秒 |
| GPU 利用率 | 7.7% | 56.5% |
| PCIe 传输占比 | — | 12.3% |
项目亮点
极致的性能优化。 经历 5 个迭代阶段,每个阶段基于 Nsight Systems / Nsight Compute 的实测数据进行针对性优化,从磁盘 I/O 瓶颈识别到 kernel 内存吞吐分析,形成完整的性能工程实践。
多层级 Kernel 融合。 将 4 个独立 kernel 融合为单个 kernel,通过 shared memory tiling 实现数据复用,减少约 75% 的全局内存访问。
精度与性能的平衡。 关键路径采用混合精度策略:FP16 节省带宽,Double 确保数值稳定性,在不损失准确率的前提下显著提升吞吐量。
RAII 资源管理。 DeviceBuffer、PinnedBuffer、CudaStream 三个 RAII 封装类确保 CUDA 资源的自动释放,通过 std::unique_ptr 自定义删除器实现异常安全。
模块化架构。 common/cpu/gpu/hybrid 四层分离,CPU 和 GPU 可独立编译,Docker 一键部署。
