4. 图像数据预处理与增强

Teledyne相机(如Linea线阵、Genie Nano面阵、Calibir深度相机等)输出的原始图像,往往不能直接送入深度学习模型。原始数据中可能包含传感器噪声、镜头畸变、无关背景区域、亮度不一致等问题,如果跳过预处理直接训练,模型很容易把噪声或背景当作判别依据,导致现场部署时精度骤降。本节围绕一条完整的工业预处理链路展开:从相机原始帧出发,依次经过去噪、畸变校正、ROI裁剪、归一化,再进入训练阶段的工业数据增强,最终得到适合网络输入的张量。

一、去噪:先判断噪声类型,再选滤波器

Teledyne面阵相机在低照度或高增益下,暗电流噪声和读出噪声会明显增强;线阵相机在高速扫描时,行间噪声表现为细密条纹。去噪的目标不是把图像“磨平”,而是抑制随机噪声、保留缺陷边缘。常用方法有三类:

  • 高斯滤波:适合抑制高斯型随机噪声,但会模糊边缘,对细小划痕不利。
  • 中值滤波:对椒盐噪声和孤立坏点效果好,3×3或5×5核即可,边缘保留优于高斯。
  • 双边滤波:在空间距离和灰度差两个维度加权,能在去噪同时保留边缘,适合表面缺陷检测,但计算量较大。

实际工程中建议先用相机采集一张“无缺陷但同光照”的参考图,观察噪声分布:若噪声呈随机颗粒,用高斯或双边;若出现固定亮暗点,先做坏点校正再中值滤波。示例参数:对Genie Nano 5MP相机在增益12dB下采集的金属表面图,采用cv2.bilateralFilter(img, d=7, sigmaColor=45, sigmaSpace=45),可在保留划痕边缘的同时将背景标准差从约8灰度级降到约3灰度级(示例值,需按实际标定)。

二、畸变校正:用棋盘格标定,把像素映射回真实几何

工业镜头(尤其是短焦或远心镜头)会引入径向畸变和切向畸变,表现为直线变弯、边缘拉伸。畸变校正依赖相机内参和畸变系数,通常用棋盘格或圆点标定板完成。以Teledyne相机为例,采集15~20张不同姿态的棋盘格图像,调用OpenCV标定:

ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(
    objpoints, imgpoints, gray.shape[::-1], None, None)
# K: 内参矩阵, dist: [k1,k2,p1,p2,k3]
undist = cv2.undistort(img, K, dist, None, newK)

标定后重投影误差应控制在0.2像素以内(示例目标)。若产线相机固定不动,标定一次即可长期复用;若更换镜头或调整焦距,必须重新标定。畸变校正应在ROI裁剪之前做,否则裁剪区域会随畸变发生形变,导致同一物理位置在不同图像中不对应。

三、ROI裁剪:把算力集中在真正有信息的位置

工业检测中,缺陷通常只出现在工件特定区域。以电池极片检测为例,相机视野为2048×1536,但极耳区域仅占中间约600×400像素。若整图送入网络,不仅浪费算力,还会让背景干扰训练。ROI裁剪有两种方式:

  • 固定ROI:机械定位稳定时,直接按标定坐标裁剪,速度快、可复现。
  • 动态ROI:先用传统视觉(如阈值+轮廓)定位工件,再按相对坐标裁剪,适应来料位置波动。

裁剪后建议保留10~20像素余量,避免缺陷被切边。同时记录ROI在原图中的偏移量,便于后续把检测结果映射回全图坐标。

四、归一化:统一亮度与数值范围

Teledyne相机输出可能是8位、10位或12位灰度。归一化分两步:先把像素值线性映射到[0,1],再按数据集均值和标准差做标准化。对于多相机或多工位系统,建议按通道分别统计均值和方差,避免不同光源造成分布偏移。示例:某产线三台相机分别统计得到均值[0.42,0.44,0.41]、标准差[0.18,0.17,0.19],训练时统一使用这组参数,推理时也必须保持一致,否则会出现“训练好、现场差”的问题。

Teledyne相机图像预处理与工业增强链路 相机原始帧 8/10/12bit · 含噪 畸变 · 背景 去噪 高斯/中值/双边 保边抑噪 畸变校正 棋盘格标定 K · dist · newK ROI裁剪 固定/动态定位 保留偏移量 归一化 [0,1] 均值/方差 工业数据增强策略(训练阶段) 几何增强 旋转 ±15° 平移 ±5% 缩放 0.9~1.1 翻转(按对称性) 光度增强 亮度 ±10% 对比度 0.9~1.1 Gamma 0.8~1.2 高斯噪声 σ≤0.02 缺陷仿真增强 划痕/凹坑贴图 随机位置与角度 控制缺陷面积比 保留标注同步 工业约束 不破坏缺陷语义 保持类别比例 验证集不增强 增强参数可复现

五、工业数据增强:不是越多越好,而是越像现场越好

工业缺陷样本通常稀少,增强是扩充训练集的关键手段。但工业场景与自然图像不同:不能随意旋转导致缺陷语义改变,也不能用强色彩抖动破坏灰度特征。建议按以下原则组织:

  • 几何增强:旋转、平移、缩放、翻转。对于有方向性的缺陷(如划痕方向),旋转角度应限制在±15°以内;对于对称工件可开启水平翻转。
  • 光度增强:亮度、对比度、Gamma、高斯噪声。模拟不同批次光源衰减和相机增益变化,幅度不宜过大,避免把正常样本变成“伪缺陷”。
  • 缺陷仿真增强:在正常样本上叠加划痕、凹坑、脏污贴图,并同步生成标注。这是工业小样本最有效的手段之一,但贴图必须来自真实缺陷采样,且面积比例要控制。

增强策略必须与验证集隔离:验证集和测试集只做归一化,不做随机增强,否则评估结果会虚高。同时,所有增强参数应记录在配置文件中,保证实验可复现。

建议把预处理链路固化为一个可配置的Pipeline:去噪→畸变校正→ROI裁剪→归一化→增强。每个环节的参数写入YAML,训练和推理共用同一份预处理代码,避免“训练用Python、部署用C++”导致的结果不一致。

六、一条可复用的预处理配置示例

下面给出一份面向Teledyne面阵相机的预处理配置片段,字段可直接对应到实际代码:

preprocess:
  denoise:
    method: bilateral
    d: 7
    sigma_color: 45
    sigma_space: 45
  undistort:
    camera_matrix: [[3200,0,1024],[0,3200,768],[0,0,1]]
    dist_coeffs: [-0.12, 0.03, 0.0005, -0.0003, 0.0]
  roi:
    x: 720
    y: 560
    w: 600
    h: 400
    margin: 15
  normalize:
    mean: [0.42, 0.44, 0.41]
    std:  [0.18, 0.17, 0.19]
  augment:
    rotate_deg: 15
    translate_ratio: 0.05
    scale_range: [0.9, 1.1]
    brightness: 0.10
    contrast: 0.10
    gaussian_noise_std: 0.02

判断预处理是否合格,可以看三个信号:一是校正后棋盘格直线是否恢复笔直;二是ROI内缺陷是否完整、无切边;三是训练集与验证集的像素均值/方差是否接近。若验证集精度远高于现场测试,优先检查归一化参数和增强幅度是否与现场分布一致。预处理不是一次性工作,而应随相机、镜头、光源和来料变化持续校准。