很高兴能帮助你创建一个YOLO免环境训练包。下面是一个详细的教程,包含操作步骤和示例代码。
核心思路:
教程步骤:
第一步:准备开发环境
安装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
)
关键点:
a.datas
部分。hiddenimports
中。console=True
表示生成带控制台窗口的应用程序,console=False
或 windowed=True
表示生成无控制台窗口的应用程序。根据你的需求选择。第四步:构建可执行文件
在你的 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 动态链接库。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
在同一目录下,你可以直接使用相对路径。
确保将
、
、
、
和
替换为你实际的值。
例如:
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 模型的训练,训练结果将会显示在控制台中。
注意:
通过以上修改,你的 yolo.exe
应用程序现在应该能够接收并处理命令行参数,从而更加灵活地进行 YOLO 模型训练。