一、写在前面

最近我们给客户交付了一套基于深度学习视觉检测的工业质检方案。项目的核心思路是:使用工业相机采集产品图像,通过目标检测算法识别关键区域中的目标或缺陷,然后根据检测结果判断产品是否合格。

在算法实现上,我们采用的是 ultralytics 库中的 YOLOv8。整个训练流程大致如下:

  1. 使用 Labelme 对图像进行矩形框标注;
  2. 将 Labelme 生成的 .json 标注文件转换为 YOLO 格式;
  3. 使用 YOLOv8 进行目标检测模型训练;
  4. 训练完成后得到 .pt 模型;
  5. 根据部署需要,将 .pt 模型导出为 .onnx
  6. 最终在客户现场的检测软件中调用模型完成推理。

这套流程在我们自己的开发电脑上已经跑通。但是现在进入交付阶段,客户提出了一个很现实的问题:客户的训练机器无法联网。

客户机器的大致配置如下:

项目配置
操作系统Windows 10 64位
显卡NVIDIA GeForce RTX 3050
任务离线安装深度学习训练环境
主要软件Python、PyTorch、Ultralytics、Labelme
主要用途标注数据、训练 YOLOv8 模型、导出 ONNX 模型

由于目标机器不能联网,我们不能直接在客户机器上执行:

pip install torch ultralytics labelme

而是需要在一台可以联网的电脑上,提前下载好所有安装包、驱动、Python 安装程序以及 Python 依赖库的 .whl 文件,然后将这些文件拷贝到客户机器上进行离线安装。

本文就记录这一整套过程,目标是形成一份可以反复复用的工业现场离线部署教程。


二、整体思路

离线安装深度学习环境,最容易出问题的地方不在于某一条命令,而在于“依赖不完整”。

比如只下载了 ultralytics,但没有下载它依赖的 opencv-pythonnumpymatplotlibpyyaml 等库;或者只下载了 torch,但下载成了 CPU 版本,导致客户机器上的 RTX 3050 无法使用 GPU 训练。

因此,推荐采用下面的“两台机器协同”方式:

联网机器:
    1. 下载 NVIDIA 显卡驱动
    2. 下载 Python 安装包
    3. 创建临时 Python 环境
    4. 在线安装 torch、ultralytics、labelme 等库
    5. 导出 requirements_frozen.txt
    6. 根据 requirements_frozen.txt 下载全部 whl 文件
    7. 整理成一个离线安装包

客户离线机器:
    1. 安装 NVIDIA 显卡驱动
    2. 安装 Python
    3. 创建虚拟环境
    4. 从本地 wheelhouse 离线安装所有 Python 包
    5. 验证 torch 是否能识别 RTX 3050
    6. 验证 ultralytics、labelme 是否能正常使用
    7. 开始数据转换、模型训练和 ONNX 导出

三、准备阶段:确认 Python、PyTorch 与 CUDA 版本

3.1 为什么推荐 Python 3.13?

Windows下做深度学习训练,不建议盲目追新。Python 版本过新,可能导致某些库还没有对应的 Windows wheel;Python 版本过旧,又可能导致新版本的 ultralytics 不再支持。

综合兼容性考虑,推荐使用:

Python 3.13.x 64位

例如:

python-3.13.7-amd64.exe

注意,一定要下载 64 位版本。文件名里通常会带有:

amd64

不要下载 32 位版本,否则很多深度学习库无法正常安装。

3.2 PyTorch 的 CUDA 版本怎么选?

客户机器是 RTX 3050,属于 NVIDIA RTX 系列显卡,可以用于 CUDA 加速训练。

这里需要特别说明一个容易混淆的问题:

安装 PyTorch GPU 版本,并不一定需要单独安装完整的 CUDA Toolkit。

对于大多数普通训练场景,只要安装好 NVIDIA 显卡驱动,然后安装带 CUDA 支持的 PyTorch wheel 即可。PyTorch 的 CUDA wheel 已经包含运行所需的 CUDA 运行时组件。

四、在联网机器上制作离线安装包

下面操作都在一台可以联网的 Windows 电脑上完成。建议这台电脑的 Python 版本、系统位数尽量与客户机器保持一致。

4.1 下载 Python 安装包

到 Python 官网下载 Windows 64 位安装程序,例如:

python-3.13.7-amd64.exe

4.2 下载 NVIDIA 显卡驱动

到 NVIDIA 官网下载适用于:

GeForce RTX 3050
Windows 10 64-bit

的正式版驱动程序。

4.3 创建在线下载用的虚拟环境

打开 PowerShell 或 CMD,执行:

cd /d D:\offline_yolo_env

python -m venv .venv_download

.\.venv_download\Scripts\activate

python -m pip install --upgrade pip setuptools wheel

说明:

  • .venv_download 是联网机器上的临时环境;
  • 它的作用是先在线安装一遍完整环境;
  • 环境安装成功后,再导出完整依赖清单。

4.4 在线安装 PyTorch GPU 版本

以 CUDA 13.0 wheel 为例:

pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu130

安装完成后,先验证一下:

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

如果联网机器没有 NVIDIA 显卡,torch.cuda.is_available() 可能返回 False,这不一定代表安装包有问题。关键是看 torch.__version__ 中是否带有类似:

+cu130

例如:

2.12.0+cu130

这说明安装的是 CUDA 版本的 PyTorch。

4.5 在线安装 Ultralytics、Labelme 等库

继续安装项目所需库:

pip install ultralytics labelme labelme2yolo onnx onnxruntime opencv-python pillow matplotlib pandas pyyaml tqdm

4.6 导出完整依赖版本

在线安装成功后,导出当前环境的完整依赖清单:

pip freeze > D:\offline_yolo_env\requirements_frozen.txt

这个文件非常重要。它记录的是“已经在线安装并验证成功”的所有库版本。

4.7 下载所有 whl 文件

执行下面命令,把 requirements_frozen.txt 中的所有依赖下载到 wheelhouse 目录:

pip download ^
  -r D:\offline_yolo_env\requirements_frozen.txt ^
  -d D:\offline_yolo_env\wheelhouse ^
  -i https://pypi.tuna.tsinghua.edu.cn/simple ^
  --extra-index-url https://download.pytorch.org/whl/cu130

参数说明:

-r requirements_frozen.txt

表示按照完整依赖清单下载。

-d wheelhouse

表示把下载好的 .whl 文件保存到 wheelhouse 目录。

-i https://pypi.tuna.tsinghua.edu.cn/simple

表示使用国内镜像源下载普通 Python 包。

--extra-index-url https://download.pytorch.org/whl/cu130

表示额外使用 PyTorch 官方 CUDA 13.0 wheel 源下载 torch 相关包。

下载完成后,检查:

dir D:\offline_yolo_env\wheelhouse

正常情况下,里面应该有大量 .whl 文件。

五、编写离线安装脚本

为了方便客户现场安装,我们编写一个批处理脚本:

D:\offline_yolo_env\scripts\install_offline.bat

内容如下:

@echo off
REM ============================================================
REM Windows 离线安装 YOLOv8 深度学习环境脚本
REM 适用场景:
REM   1. 客户机器不能联网
REM   2. 已提前准备好 Python 安装包、NVIDIA 驱动、wheelhouse
REM   3. 当前脚本放在 offline_yolo_env\scripts 目录下
REM ============================================================

REM 获取当前脚本所在目录
set "SCRIPT_DIR=%~dp0"

REM offline_yolo_env 根目录 = scripts 的上一级目录
for %%I in ("%SCRIPT_DIR%..") do set "ROOT_DIR=%%~fI"

echo.
echo ============================================================
echo 离线环境根目录:
echo %ROOT_DIR%
echo ============================================================
echo.

REM 进入根目录
cd /d "%ROOT_DIR%"

REM 创建 Python 虚拟环境
REM 注意:这里要求系统已经安装好 Python,并且 python 命令可用
echo [1/4] 正在创建虚拟环境 .venv ...
python -m venv .venv

REM 激活虚拟环境
echo [2/4] 正在激活虚拟环境 ...
call "%ROOT_DIR%\.venv\Scripts\activate.bat"

REM 使用本地 wheelhouse 升级 pip、setuptools、wheel
echo [3/4] 正在离线安装基础构建工具 ...
python -m pip install --no-index --find-links="%ROOT_DIR%\wheelhouse" --upgrade pip setuptools wheel

REM 根据 requirements_frozen.txt 离线安装全部依赖
echo [4/4] 正在离线安装项目依赖 ...
python -m pip install --no-index --find-links="%ROOT_DIR%\wheelhouse" -r "%ROOT_DIR%\requirements_frozen.txt"

echo.
echo ============================================================
echo 离线安装完成,开始验证环境
echo ============================================================
echo.

python "%ROOT_DIR%\scripts\verify_env.py"

echo.
pause

六、编写环境验证脚本

创建:

D:\offline_yolo_env\scripts\verify_env.py

内容如下:

"""
verify_env.py

功能:
    验证离线安装后的深度学习环境是否可用。

检查内容:
    1. Python 是否可用
    2. torch 是否安装成功
    3. CUDA 是否可用
    4. 当前 GPU 名称
    5. ultralytics 是否安装成功
"""

import sys


def main():
    print("=" * 60)
    print("Python 环境信息")
    print("=" * 60)
    print("Python 可执行文件:", sys.executable)
    print("Python 版本:", sys.version)

    print("\n" + "=" * 60)
    print("PyTorch / CUDA 检查")
    print("=" * 60)

    try:
        import torch

        print("torch 版本:", torch.__version__)
        print("CUDA 是否可用:", torch.cuda.is_available())

        if torch.cuda.is_available():
            print("CUDA 版本:", torch.version.cuda)
            print("GPU 数量:", torch.cuda.device_count())
            print("当前 GPU:", torch.cuda.get_device_name(0))
        else:
            print("警告:torch.cuda.is_available() 返回 False")
            print("请检查:")
            print("1. 是否安装了 NVIDIA 显卡驱动")
            print("2. 是否安装了 GPU 版本 torch")
            print("3. torch 版本中是否包含 +cuXXX")
            print("4. 是否误装了 CPU 版本 torch")

    except Exception as e:
        print("torch 导入失败:", repr(e))

    print("\n" + "=" * 60)
    print("Ultralytics 检查")
    print("=" * 60)

    try:
        import ultralytics

        print("ultralytics 版本:", ultralytics.__version__)
        print("ultralytics 导入成功")
    except Exception as e:
        print("ultralytics 导入失败:", repr(e))

    print("\n" + "=" * 60)
    print("\n环境验证结束。")


if __name__ == "__main__":
    main()

七、在客户离线机器上安装环境

将整个目录:

D:\offline_yolo_env

拷贝到客户机器上。

建议仍然放到:

D:\offline_yolo_env

尽量避免放在中文路径、空格很多的路径或者层级特别深的路径中。

7.1 安装 NVIDIA 显卡驱动

进入:

D:\offline_yolo_env\installers\

双击运行:

NVIDIA-GeForce-Driver-Win10.exe

安装完成后重启电脑。

重启后打开 CMD,执行:

nvidia-smi

如果能看到 RTX 3050 以及驱动版本,说明显卡驱动安装成功。

如果提示:

'nvidia-smi' 不是内部或外部命令

可以尝试进入下面目录执行:

cd /d "C:\Program Files\NVIDIA Corporation\NVSMI"
nvidia-smi

7.2 安装 Python

进入:

D:\offline_yolo_env\installers\

双击运行:

python-3.13.7-amd64.exe

安装时一定要勾选:

Add python.exe to PATH

然后点击:

Install Now

安装完成后打开新的 CMD,执行:

python --version
pip --version

如果能正常显示版本号,说明 Python 安装成功。

7.3 执行离线安装脚本

进入:

D:\offline_yolo_env\scripts\

双击运行:

install_offline.bat

或者在 CMD 中执行:

cd /d D:\offline_yolo_env\scripts
install_offline.bat

安装完成后,会自动执行 verify_env.py

重点关注下面几行:

torch 版本: 2.x.x+cu126
CUDA 是否可用: True
当前 GPU: NVIDIA GeForce RTX 3050
ultralytics 导入成功

如果以上信息都正常,说明离线深度学习环境安装成功。


通过这套流程,我们可以在客户无法联网的情况下,仍然完整搭建深度学习训练环境,并支持后续模型迭代。这对于工业质检项目的现场交付非常实用。

更多推荐