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 环境基本解耦,只要求操作系统位数与运行库一致。
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 上完成且不报错。这一步通过,说明采集层、计算层、应用层已经贯通,可以进入后续的相机参数配置与数据采集章节。
cam.Init() 阶段抛出异常,且错误信息通常不指向版本问题,排查成本很高。