【创建一个YOLO免环境训练包】
YOLO免环境训练包
- 如果你需要保持原装命令
很高兴能帮助你创建一个YOLO免环境训练包。下面是一个详细的教程,包含操作步骤和示例代码。
核心思路:
- 使用PyTorch预编译版本: 利用PyTorch官方提供的预编译包,它包含了CUDA动态库,从而避免了用户单独安装CUDA Toolkit。
- 选择合适的YOLO代码: 确保你使用的YOLO代码库支持PyTorch,并且结构清晰,方便打包。
- 使用PyInstaller打包: 配置PyInstaller正确地将PyTorch、YOLO代码和必要的动态链接库打包成一个可执行文件。
- 处理动态链接库: 关键在于告诉PyInstaller哪些动态链接库是PyTorch依赖的,需要包含进最终的可执行文件中。
教程步骤:
第一步:准备开发环境
-
安装Python: 确保你的系统上安装了Python 3.8 或更高版本。建议创建一个新的虚拟环境来管理项目依赖。
# 创建虚拟环境 (可选) python -m venv yolo_env # 激活虚拟环境 (Windows) yolo_env\Scripts\activate # 激活虚拟环境 (macOS/Linux) source yolo_env/bin/activate
-
安装PyTorch预编译版本: 根据你的操作系统和CUDA版本选择合适的PyTorch预编译包。由于你希望免环境运行,我们假设目标机器上可能没有特定的CUDA驱动版本,因此选择包含最广泛兼容性的版本。通常,最新的稳定版本会包含较新的CUDA动态库。
访问 PyTorch 官方网站 (https://pytorch.org/get-started/locally/),选择你的操作系统、Package 为
pip
,Language 为Python
,Compute Platform 选择你希望支持的 CUDA 版本(例如,如果目标机器可能有较旧的显卡,可以选择一个相对较旧但仍然广泛支持的版本)。复制对应的pip install
命令并在你的虚拟环境中运行。例如,安装支持 CUDA 11.8 的 PyTorch 预编译版本:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
如果你希望支持更新的 CUDA 版本,可以替换
cu118
为cu121
等。请注意,选择过新的 CUDA 版本可能会导致在旧显卡上无法运行。 -
安装YOLO代码库和依赖: 选择一个你熟悉的基于 PyTorch 的 YOLO 代码库。例如,你可以选择 Ultralytics 的 YOLOv5 或 YOLOv8。这里以 YOLOv8 为例:
pip install ultralytics
根据你选择的 YOLO 代码库,可能还需要安装其他依赖。请参考该代码库的官方文档。
-
安装PyInstaller:
pip install pyinstaller
第二步:准备YOLO代码
-
创建YOLO项目文件夹: 创建一个文件夹,用于存放你的YOLO代码和相关文件。例如,命名为
yolo_standalone
. -
将YOLO代码放入项目文件夹: 将你选择的 YOLO 代码库的相关脚本(例如,用于训练、验证、推理的 Python 文件)复制到
yolo_standalone
文件夹中。 -
创建主入口脚本: 创建一个 Python 脚本作为你的应用程序的入口点,例如
main.py
。在这个脚本中,你需要导入并调用 YOLO 代码库中的相应函数来执行训练或其他操作。示例
main.py
(基于 Ultralytics YOLOv8):from ultralytics import YOLO def train_model(data_path, epochs=100): # 加载预训练模型 model = YOLO('yolov8n.pt') # 你可以选择其他模型 # 训练模型 results = model.train(data=data_path, epochs=epochs) return results def main(): data_path = 'coco128.yaml' # 你的数据集配置文件 epochs = 5 # 示例训练轮数 print(f"开始使用数据集 {data_path} 训练模型,共 {epochs} 轮...") train_results = train_model(data_path, epochs) print("训练完成!") print(train_results) if __name__ == "__main__": main()
确保你的数据集配置文件(例如
coco128.yaml
)也在yolo_standalone
文件夹中,或者在你的代码中指定正确的路径。
第三步:配置PyInstaller
你需要创建一个 PyInstaller 的 spec 文件来告诉 PyInstaller 如何打包你的应用程序。
-
生成 spec 文件: 在你的
yolo_standalone
文件夹中打开命令行或终端,运行以下命令:pyi-makespec main.py --onefile --windowed
main.py
: 你的主入口脚本。--onefile
: 将所有内容打包成一个单独的可执行文件。--windowed
: 如果你的应用程序有图形界面,可以使用这个选项来创建无控制台窗口的应用程序。对于命令行工具,可以省略此选项。
这会生成一个名为
main.spec
的文件。 -
编辑 spec 文件: 打开
main.spec
文件,你需要修改它以包含 PyTorch 相关的动态链接库。找到a.binaries
部分,你需要添加 PyTorch 和 CUDA 相关的 DLL 文件。如何找到 PyTorch 和 CUDA 相关的 DLL 文件?
在你的虚拟环境中,PyTorch 的库通常安装在
your_virtual_env_path\Lib\site-packages\torch
目录下。CUDA 相关的 DLL 文件通常在your_virtual_env_path\Lib\site-packages\torch\lib
目录下。你需要将这些目录下的
.dll
和.pyd
文件添加到a.binaries
中。你可以使用 Python 代码来辅助查找这些文件。示例 Python 代码 (在虚拟环境中运行):
import torch import os torch_dir = os.path.dirname(torch.__file__) torch_lib_dir = os.path.join(torch_dir, 'lib') print("PyTorch 目录:", torch_dir) print("PyTorch 库目录:", torch_lib_dir) # 列出 torch 目录下的 .dll 和 .pyd 文件 torch_binaries = [(os.path.join(torch_dir, f), '.') for f in os.listdir(torch_dir) if f.endswith(('.dll', '.pyd'))] print("\nPyTorch 目录下的二进制文件:") for binary in torch_binaries: print(binary[0]) # 列出 torch\lib 目录下的 .dll 文件 torch_lib_binaries = [(os.path.join(torch_lib_dir, f), 'torch\\lib') for f in os.listdir(torch_lib_dir) if f.endswith('.dll')] print("\nPyTorch 库目录下的 DLL 文件:") for binary in torch_lib_binaries: print(binary[0]) # 列出 CUDA 相关的 DLL 文件 (可能在 torch\lib 或其他子目录下) cuda_related_files = [] for root, _, files in os.walk(torch_lib_dir): for file in files: if file.lower().startswith(('cudart', 'cublas', 'cufft', 'cusolver', 'cusparse', 'nvcuda')): cuda_related_files.append((os.path.join(root, file), os.path.relpath(root, torch_dir))) print("\nCUDA 相关 DLL 文件:") for file in cuda_related_files: print(file[0], "->", file[1])
运行这段代码,你会得到 PyTorch 和 CUDA 相关的 DLL 文件路径。将这些文件路径添加到你的
main.spec
文件中的a.binaries
部分。修改后的
main.spec
文件示例 (仅为说明,你需要根据你的实际路径进行修改):# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( ['main.py'], pathex=[], binaries=[ ('your_virtual_env_path\\Lib\\site-packages\\torch\\_C.cp311-win_amd64.pyd', '.'), ('your_virtual_env_path\\Lib\\site-packages\\torch\\_dlpack.cp311-win_amd64.pyd', '.'), ('your_virtual_env_path\\Lib\\site-packages\\torch\\_pytree.pyd', '.'), ('your_virtual_env_path\\Lib\\site-packages\\torch\\lib\\c10.dll', 'torch\\lib'), ('your_virtual_env_path\\Lib\\site-packages\\torch\\lib\\c10_cuda.dll', 'torch\\lib'), ('your_virtual_env_path\\Lib\\site-packages\\torch\\lib\\torch_cpu.dll', 'torch\\lib'), ('your_virtual_env_path\\Lib\\site-packages\\torch\\lib\\torch_cuda.dll', 'torch\\lib'), ('your_virtual_env_path\\Lib\\site-packages\\torch\\lib\\cudart64_11.dll', 'torch\\lib'), # 示例 CUDA DLL ('your_virtual_env_path\\Lib\\site-packages\\torch\\lib\\cublas64_11.dll', 'torch\\lib'), # 示例 CUDA DLL # ... 添加更多 PyTorch 和 CUDA 相关的 DLL 文件 ], datas=[ ('coco128.yaml', '.'), # 包含你的数据集配置文件 # ... 如果你的 YOLO 代码依赖其他数据文件,也需要添加 ], hiddenimports=['ultralytics'], # 显式导入 YOLO 库 hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='yolo', # 输出的可执行文件名 debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, # 如果是命令行应用,保持 True windowed=True, # 如果是 GUI 应用,设置为 True )
关键点:
- 将你在 Python 代码中使用的所有数据文件(例如,数据集配置文件、预训练模型权重等)添加到
a.datas
部分。 - 如果 PyInstaller 没有自动检测到你的 YOLO 库,你需要将其添加到
hiddenimports
中。 console=True
表示生成带控制台窗口的应用程序,console=False
或windowed=True
表示生成无控制台窗口的应用程序。根据你的需求选择。
- 将你在 Python 代码中使用的所有数据文件(例如,数据集配置文件、预训练模型权重等)添加到
第四步:构建可执行文件
-
在你的
yolo_standalone
文件夹中打开命令行或终端,运行以下命令:pyinstaller main.spec
PyInstaller 将会开始打包你的应用程序。这个过程可能需要一些时间。
-
构建完成后,你会在
yolo_standalone
文件夹下找到一个dist
文件夹。如果你的 spec 文件中使用了--onefile
选项,那么你的可执行文件yolo.exe
将会直接在dist
文件夹中。
第五步:测试可执行文件
-
将
dist
文件夹(或者dist
文件夹中的yolo.exe
文件,如果使用了--onefile
)复制到一个没有安装 Python、PyTorch 和 CUDA Toolkit 的干净 Windows 机器上。 -
打开命令提示符或 PowerShell,导航到包含
yolo.exe
的文件夹,然后运行它:cd dist yolo.exe
或者,如果使用了
--onefile
:cd dist yolo.exe
检查应用程序是否能够正常运行,并且能够执行你的 YOLO 训练或其他操作。如果遇到任何错误,你需要回到前面的步骤,检查你的 spec 文件是否配置正确,是否包含了所有必要的依赖。
第六步:使用说明
创建一个简单的 README.txt
文件,包含如何使用你的 yolo.exe
应用程序的说明。例如:
YOLO 免环境训练包
本程序用于执行 YOLO 模型训练。
使用方法:
1. 将 yolo.exe 文件复制到你的目标机器上。
2. 确保数据集配置文件(例如 coco128.yaml)与 yolo.exe 在同一目录下,或者在程序运行时指定正确的路径。
3. 打开命令提示符或 PowerShell,导航到 yolo.exe 所在的目录。
4. 运行命令:yolo.exe
程序将会开始执行 YOLO 模型的训练,训练结果将会显示在控制台中。
注意:
- 本程序基于 PyTorch 预编译版本,无需单独安装 CUDA Toolkit。
- 首次运行可能需要一些时间来加载必要的库。
注意事项和常见问题:
- 动态链接库缺失: 如果你在目标机器上运行
yolo.exe
时遇到关于 DLL 文件缺失的错误,你需要回到 spec 文件中,仔细检查是否遗漏了相关的 PyTorch 或 CUDA 动态链接库。 - 数据文件路径: 确保你的代码中处理数据文件(例如数据集配置文件、预训练模型权重)的路径是正确的。在打包后的应用程序中,相对路径是相对于可执行文件所在的目录。
- PyTorch 版本兼容性: 确保你选择的 PyTorch 预编译版本与你的 YOLO 代码库兼容。
- 文件大小: 打包后的可执行文件可能会比较大,因为它包含了整个 PyTorch 库和相关的 CUDA 动态链接库。这是使用预编译版本带来的不可避免的缺点。
- 目标机器兼容性: 虽然预编译版本包含了 CUDA 动态库,但目标机器仍然需要安装与这些动态库兼容的 NVIDIA 驱动程序。如果目标机器上没有安装 NVIDIA 显卡或驱动程序,那么涉及 GPU 计算的部分将无法运行(PyTorch 会尝试回退到 CPU 计算,但性能会大幅下降)。
- 显式导入: 有时候 PyInstaller 可能无法自动检测到所有需要导入的模块。如果在运行时遇到
ModuleNotFoundError
,你需要将缺失的模块添加到 spec 文件中的hiddenimports
列表中。
如果你需要保持原装命令
为了让打包出的 yolo.exe
能够接收和处理命令行参数,我们需要修改 main.py
脚本来使用 argparse
模块。下面是修改后的教程和代码:
第二步:准备YOLO代码 (修改)
-
创建YOLO项目文件夹: (保持不变)
-
将YOLO代码放入项目文件夹: (保持不变)
-
创建主入口脚本: 修改
main.py
文件以处理命令行参数。修改后的
main.py
(基于 Ultralytics YOLOv8):import argparse from ultralytics import YOLO def train_model(model_path, data_path, epochs, imgsz, batch): # 加载预训练模型 model = YOLO(model_path) # 训练模型 results = model.train(data=data_path, epochs=epochs, imgsz=imgsz, batch=batch) return results def main(): parser = argparse.ArgumentParser(description="YOLO Training Script") parser.add_argument("mode", choices=['train'], help="Operating mode: train") parser.add_argument("--model", required=True, help="Path to the model file (e.g., yolov8n.pt)") parser.add_argument("--data", required=True, help="Path to the data YAML file (e.g., coco128.yaml)") parser.add_argument("--epochs", type=int, default=100, help="Number of training epochs") parser.add_argument("--imgsz", type=int, default=640, help="Image size for training") parser.add_argument("--batch", type=int, default=16, help="Batch size for training") args = parser.parse_args() if args.mode == 'train': print(f"开始使用模型 {args.model} 和数据集 {args.data} 训练模型,共 {args.epochs} 轮,图像尺寸 {args.imgsz},批次大小 {args.batch}...") train_results = train_model(args.model, args.data, args.epochs, args.imgsz, args.batch) print("训练完成!") print(train_results) if __name__ == "__main__": main()
代码解释:
- 我们导入了
argparse
模块来处理命令行参数。 ArgumentParser
用于创建一个参数解析器,并描述程序的用途。add_argument
方法用于定义程序可以接受的参数:mode
: 必需参数,指定操作模式,这里我们只支持train
。--model
: 必需参数,模型文件路径。--data
: 必需参数,数据集 YAML 文件路径。--epochs
: 可选参数,训练轮数,默认为 100。--imgsz
: 可选参数,图像尺寸,默认为 640。--batch
: 可选参数,批次大小,默认为 16。
parser.parse_args()
解析命令行中传递的参数。- 我们根据解析到的参数调用
train_model
函数。
- 我们导入了
第三步:配置PyInstaller
你之前生成的 main.spec
文件应该仍然适用,因为我们只是修改了 main.py
的内部逻辑,没有改变需要打包的依赖。如果你还没有生成 main.spec
文件,请按照之前的步骤生成:
pyi-makespec main.py --onefile --windowed
然后,务必检查并根据你的实际情况修改 main.spec
文件,确保包含了 PyTorch 相关的动态链接库、数据文件和 hiddenimports
。
第五步:测试可执行文件 (修改)
-
将
dist
文件夹(或者dist
文件夹中的yolo.exe
文件)复制到一个没有安装 Python、PyTorch 和 CUDA Toolkit 的干净 Windows 机器上。 -
打开命令提示符或 PowerShell,导航到包含
yolo.exe
的文件夹。现在,你可以使用以下格式运行yolo.exe
并传递参数:cd dist yolo.exe train --model yolov8n.pt --data coco128.yaml --epochs 5 --imgsz 320 --batch 8
或者,如果你的数据集配置文件
coco128.yaml
和模型文件yolov8n.pt
与yolo.exe
在同一目录下,你可以直接使用相对路径。确保将
<model_path>
、<data_yaml_path>
、<num_epochs>
、<image_size>
和<batch_size>
替换为你实际的值。例如:
cd dist yolo.exe train --model yolov8n.pt --data coco128.yaml --epochs 10 --imgsz 416 --batch 16
检查应用程序是否能够正确解析命令行参数并开始训练。
第六步:使用说明 (修改)
修改你的 README.txt
文件,以反映新的命令行参数使用方式:
YOLO 免环境训练包
本程序用于执行 YOLO 模型训练。
使用方法:
1. 将 yolo.exe 文件复制到你的目标机器上。
2. 确保你的模型文件(例如 yolov8n.pt)和数据集配置文件(例如 coco128.yaml)与 yolo.exe 在同一目录下,或者在运行命令时指定正确的完整路径。
3. 打开命令提示符或 PowerShell,导航到 yolo.exe 所在的目录。
4. 运行命令,格式如下:
```bash
yolo.exe train --model <模型文件路径> --data <数据集配置文件路径> --epochs <训练轮数> --imgsz <图像尺寸> --batch <批次大小>
例如:
yolo.exe train --model yolov8n.pt --data coco128.yaml --epochs 10 --imgsz 416 --batch 16
<模型文件路径>
: YOLO 模型文件的路径 (例如 yolov8n.pt)。<数据集配置文件路径>
: 数据集 YAML 文件的路径 (例如 coco128.yaml)。<训练轮数>
: 可选,训练的轮数,默认为 100。<图像尺寸>
: 可选,训练的图像尺寸,默认为 640。<批次大小>
: 可选,训练的批次大小,默认为 16。
程序将会开始执行 YOLO 模型的训练,训练结果将会显示在控制台中。
注意:
- 本程序基于 PyTorch 预编译版本,无需单独安装 CUDA Toolkit。
- 首次运行可能需要一些时间来加载必要的库。
通过以上修改,你的 yolo.exe
应用程序现在应该能够接收并处理命令行参数,从而更加灵活地进行 YOLO 模型训练。