2. 开发环境搭建与工具链配置

深度学习视觉检测平台的开发环境并不是“装一个 Python 就能跑”的简单组合,它由三层相互依赖的组件构成:最底层是 Teledyne 相机 SDK 与驱动,负责把 GigE Vision / USB3 Vision 相机接入操作系统;中间层是 GPU 计算环境(CUDA、cuDNN、显卡驱动),负责承载卷积网络的训练与推理;最上层是深度学习框架与项目工程结构,负责把相机采集到的图像送入模型并输出检测结果。三层中任意一层的版本不匹配,都会在后续章节表现为“相机能开但取不到流”“模型能训但推理报错”这类难以定位的问题。因此本节的目标不是把软件装完,而是建立一个版本可控、可复现、可验证的工具链。

2.1 三层工具链的依赖关系

先建立整体认识。Teledyne 相机 SDK(如 Sapera LT、Spinnaker SDK)提供相机枚举、参数配置、图像采集与缓冲区管理接口,并附带 GenICam 标准支持;深度学习框架(PyTorch、TensorFlow)通过 Python 绑定调用 GPU;GPU 环境则由 NVIDIA 驱动、CUDA Toolkit、cuDNN 三者共同决定。它们之间的版本约束是单向的:框架版本决定可用的 CUDA 版本,CUDA 版本决定可用的驱动最低版本,而相机 SDK 与 GPU 环境基本解耦,只要求操作系统位数与运行库一致。

Teledyne 视觉检测平台三层工具链依赖关系 应用层:深度学习框架与项目工程 PyTorch 2.x torch.cuda 可用性检查 OpenCV / NumPy 图像预处理与张量转换 项目工程结构 configs / src / data / weights 依赖 CUDA 运行时 计算层:GPU 环境 NVIDIA 驱动 ≥ CUDA 要求的最低版本 CUDA Toolkit nvcc / 运行时库 cuDNN 卷积加速算子库 依赖操作系统与驱动 采集层:Teledyne 相机 SDK 与驱动 Spinnaker / Sapera LT 相机枚举与流通道 GenICam / GenTL 标准参数接口 网卡 / USB 驱动 巨帧、带宽、供电

2.2 Teledyne 相机 SDK 安装与验证

以 Windows + Spinnaker SDK 为例,安装顺序应为:先装网卡驱动并确认相机可被系统识别,再装 Spinnaker SDK,最后装 Python 绑定。安装完成后不要急着写代码,先用官方 SpinView 工具验证:打开 SpinView,左侧设备树应出现相机型号;选中相机后点击“Acquisition Start”,在图像窗口应看到实时画面。若设备树为空,优先检查网卡是否设置为巨帧(Jumbo Frame 9014)、是否与相机处于同一网段、防火墙是否拦截了 GVCP 广播。

Python 侧通过 spinnaker_python 包调用,验证脚本如下:

import PySpin

system = PySpin.System.GetInstance()
cam_list = system.GetCameras()
print("检测到相机数量:", cam_list.GetSize())

if cam_list.GetSize() > 0:
    cam = cam_list.GetByIndex(0)
    cam.Init()
    nodemap = cam.GetTLDeviceNodeMap()
    print("相机型号:", cam.DeviceModelName.GetValue())
    cam.DeInit()
cam_list.Clear()
system.ReleaseInstance()

输出“检测到相机数量: 1”并打印出正确型号,说明采集层已打通。这一步是后续所有工作的前提,若此处失败,不要继续配置 GPU 环境。

2.3 GPU 环境配置

GPU 环境的核心是版本对齐。以 PyTorch 2.1 为例,它官方支持 CUDA 11.8 与 CUDA 12.1 两个构建版本。假设工作站使用 RTX 4070,驱动版本为 545.xx,则 CUDA 12.1 可用。安装顺序为:先确认驱动版本满足 CUDA 最低要求,再安装 CUDA Toolkit,然后安装 cuDNN,最后安装对应 CUDA 版本的 PyTorch。

验证命令如下:

nvidia-smi
# 关注右上角 CUDA Version,它表示驱动支持的最高 CUDA 版本

nvcc --version
# 确认 Toolkit 版本

python -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))"

期望输出形如 2.1.0+cu121 True NVIDIA GeForce RTX 4070。若 torch.cuda.is_available() 返回 False,常见原因有三:安装的是 CPU 版 PyTorch、CUDA 与驱动版本不匹配、或环境变量 PATH 中缺少 CUDA 的 bin 目录。此时不要反复重装,先用 nvidia-smi 与 nvcc --version 对比版本,再决定是升级驱动还是更换 PyTorch 构建版本。

2.4 项目工程结构初始化

工具链打通后,需要建立一个可复用的工程骨架。推荐结构如下,各目录职责单一,便于后续章节逐步填充:

teledyne_vision/
├── configs/
│   └── camera.yaml          # 相机 IP、曝光、增益、触发模式
│   └── train.yaml           # 模型、学习率、batch size、epoch
├── src/
│   ├── acquisition/         # Spinnaker 采集封装
│   ├── preprocess/          # 去噪、归一化、ROI 裁剪
│   ├── models/              # 网络定义
│   ├── train/               # 训练循环
│   └── infer/               # 推理与结果输出
├── data/
│   ├── raw/                 # 原始采集图像
│   └── labeled/             # 标注数据
├── weights/                 # 训练权重
├── logs/                    # 训练日志与 TensorBoard
└── requirements.txt

初始化时用虚拟环境隔离依赖,避免与系统 Python 冲突:

python -m venv venv
venv\Scripts\activate
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
pip install opencv-python numpy pyyaml spinnaker-python

最后做一次端到端冒烟测试:用采集模块抓一帧图像,转成张量送入一个随机初始化的模型,确认前向传播能在 GPU 上完成且不报错。这一步通过,说明采集层、计算层、应用层已经贯通,可以进入后续的相机参数配置与数据采集章节。

版本对齐的实用原则:先确定框架版本,再反推 CUDA 版本,最后确认驱动是否满足。不要先装最新驱动再找框架,那样容易陷入版本回退的循环。
Spinnaker SDK 与 Python 绑定必须版本一致,混用不同版本的 PySpin 与 SDK 会在 cam.Init() 阶段抛出异常,且错误信息通常不指向版本问题,排查成本很高。