2. 工业视觉数据采集方案

数据采集是工业视觉模型开发的第一道物理关口。模型再强,也无法从一张过曝、失焦或错位的图像中恢复出缺陷信息。本节围绕相机、光源、镜头、触发同步、材质成像策略与元数据管理六个环节,说明如何把"拍得到"变成"拍得稳、拍得可追溯"。

一、相机选型:先算分辨率,再定接口与快门

选型的第一步不是看品牌,而是算清空间分辨率需求。以检测 0.1 mm 的划痕为例,按"缺陷至少占 3 个像素"的经验准则,单像素对应实际尺寸应不大于 0.033 mm。若视野(FOV)为 100 mm × 80 mm,则横向像素数至少为 100 / 0.033 ≈ 3030,纵向约 2424,因此 500 万像素(2448×2048)不够,应选 800 万~1200 万像素面阵相机。

分辨率确定后,再匹配接口与帧率。产线节拍 60 件/分钟、每件拍 4 个面,则需 4 帧/秒以上;若用卷帘快门拍摄运动中的工件,会产生果冻效应,应改用全局快门。接口方面,GigE 适合长距离布线(≤100 m),USB3.0 适合短距离高带宽,Camera Link 适合高速多相机同步。示例参数:1200 万像素、全局快门 CMOS、GigE Vision、帧率 9 fps,可满足上述节拍并留有余量。

二、光源与镜头:把缺陷"照出来"

光源的核心作用是制造对比度,而非单纯照亮。常见方案包括:环形光用于一般表面均匀照明;条形光用于边缘和划痕的定向增强;同轴光用于高反光金属表面的镜面缺陷;背光用于轮廓和尺寸测量;穹顶光用于曲面反光件的均匀漫射。

镜头需与相机靶面和视野匹配。放大倍率 β = 传感器尺寸 / FOV。以 2/3 英寸传感器(8.8 mm × 6.6 mm)、FOV 100 mm 为例,β ≈ 0.088。工作距离 WD 与焦距 f 的关系近似为 f ≈ WD × β / (1 + β)。若 WD 设为 300 mm,则 f ≈ 300 × 0.088 / 1.088 ≈ 24 mm,可选 25 mm 定焦镜头。同时需关注景深:光圈越小景深越大,但进光量下降,需与曝光时间权衡。

工业视觉采集链路:从光路到元数据 光路与成像 光源 工件 缺陷 镜头 相机 FOV 100×80 mm | β≈0.088 | f≈25 mm | WD≈300 mm 分辨率 ≥ 3030×2424 px | 全局快门 | GigE 曝光 800 μs | 增益 6 dB | 帧率 9 fps 触发与同步 编码器 2000 ppr 触发控制器 分频/延时 相机1 相机2 编码器脉冲 → 分频 → 硬触发,抖动 < 10 μs 多相机共用同一触发源,保证空间对齐 延时补偿:根据传送带速度与相机间距设定 数据流与元数据管理 图像采集 RAW / PNG 元数据绑定 时间戳/工位/批次 曝光/增益/触发号 本地缓存 SSD 环形队列 上传/入库 对象存储 + 索引 标注与版本 数据集快照 元数据字段示例: image_id | timestamp | station_id | batch_no | exposure_us | gain_db | trigger_id | light_mode | lens_id | camera_sn | label | defect_type | review_status 关键原则:图像与元数据同生命周期存储,任何一张图都能回溯到当时的采集参数与工件身份。

三、触发与同步:让每一帧都落在正确位置

连续采集会产生大量冗余帧,且难以与工件一一对应。工业现场通常采用硬触发:编码器随传送带转动输出脉冲,经触发控制器分频后驱动相机曝光。例如编码器 2000 ppr、传送带每转移动 200 mm,则每脉冲对应 0.1 mm;若要求每 5 mm 拍一张,分频系数为 50。

多相机场景下,所有相机必须共用同一触发源,否则各视角图像在时间上错位,后续拼接或融合会失败。若相机安装位置不同,还需设置延时补偿:延时 = 相机间距 / 传送带速度。例如间距 300 mm、速度 500 mm/s,则延时 600 μs。触发抖动应控制在 10 μs 以内,否则运动模糊会随速度放大。

四、不同材质与缺陷的成像策略

金属拉丝表面:采用低角度条形光,使划痕产生明暗对比,避免同轴光导致整面均匀反光。透明薄膜:采用背光加偏振片,抑制表面反射,突出内部杂质。黑色橡胶:提高增益并延长曝光,但需注意噪声,可配合红外光源增强吸收差异。PCB 焊点:采用多角度彩色光,利用不同颜色在不同高度焊点上的反射差异判断虚焊。

缺陷类型也决定策略:划痕适合定向暗场;凹坑适合同轴光或低角度光;脏污适合均匀漫射光;尺寸测量适合背光轮廓。实际调试时,固定相机与镜头,逐一更换光源角度和亮度,观察缺陷对比度变化,选择信噪比最高的组合。

五、采集脚本与元数据管理

采集脚本应完成四件事:监听触发信号、抓取图像、绑定元数据、写入缓存并上传。以下为伪代码示例:

on_trigger(trigger_id):
    img = camera.grab(timeout=100ms)
    meta = {
        "image_id": uuid(),
        "timestamp": now_iso(),
        "station_id": STATION,
        "batch_no": current_batch,
        "exposure_us": camera.exposure,
        "gain_db": camera.gain,
        "trigger_id": trigger_id,
        "light_mode": LIGHT_MODE,
        "camera_sn": camera.serial
    }
    save_local(img, meta)          # SSD 环形队列
    upload_async(img, meta)        # 对象存储 + 索引
    if queue_full():
        drop_oldest()              # 防止磁盘写满

元数据必须与图像同生命周期存储。缺少曝光、增益、光源模式等字段,后续复现或排查成像异常将无从下手。建议每条记录包含:图像 ID、时间戳、工位、批次、曝光、增益、触发号、光源模式、镜头编号、相机序列号、标签、缺陷类型、复核状态。数据集版本应与采集批次绑定,确保训练集可追溯。

调试建议:先用一张标准件在目标工位采集 20 张图,统计缺陷区域与背景的灰度差。若对比度低于 30 灰度级,优先调整光源角度而非后期增强。
常见误区:只保存图像不保存元数据;多相机不共触发;用卷帘快门拍运动工件;光源亮度固定不随环境光变化。这些都会在模型上线后以"偶发漏检"的形式暴露,且极难回溯。

采集方案的本质,是在分辨率、节拍、对比度和可追溯性之间找到平衡点。相机决定上限,光源决定下限,触发决定稳定性,元数据决定可复现性。四者缺一,数据闭环就无法真正闭合。