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++17std::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 资源管理。 DeviceBufferPinnedBufferCudaStream 三个 RAII 封装类确保 CUDA 资源的自动释放,通过 std::unique_ptr 自定义删除器实现异常安全。

模块化架构。 common/cpu/gpu/hybrid 四层分离,CPU 和 GPU 可独立编译,Docker 一键部署。