提到YOLO环境配置,网上能搜到几十篇教程,但多数不是“复制粘贴成功”就是“照着装完还是一堆报错”。我在不同机器上把这条路走过好几遍——Windows台式机、Ubuntu服务器、没有独显的笔记本、AMD显卡的老平台——踩过的坑基本能列一长串。这篇文章想把环境配置这件事从底层逻辑讲清楚:显卡与CUDA的关系、Python环境隔离、PyTorch版本配对、YOLO源码部署、数据集准备,以及训练时必然遇到的显存问题。目的是让你不只“装完能跑”,还能在报错时自己定位病根。适合第一次接触YOLO的学习者,也适合换新机器后需要重建环境的老手。
1. 先搞清三件事:GPU、显存与CUDA的真实关系
1.1 没有NVIDIA显卡能不能用YOLO
当然能。YOLO的推理和训练都可以跑在CPU上,只是速度差别很大。用CPU跑YOLOv8n在640x640分辨率下推理一张图,一般在几百毫秒到一两秒;用NVIDIA显卡跑同样的模型,往往只需要十几到几十毫秒。训练端的差距更明显,CPU训练一个epoch可能要几十分钟,GPU可能几分钟就结束了。
所以这里就分出了三条路线:
- 有NVIDIA显卡:走CUDA路线,这是跑YOLO最主流、最省心的方式。
- 有Apple Silicon芯片的Mac:用MPS后端,PyTorch原生支持,性能也不错。
- 只有CPU或者AMD显卡:也能跑,但要注意选择合理的模型规模和推理方案。
新手最容易犯的错,是还没搞清自己电脑是什么配置就开始敲命令。先打开任务管理器(Windows)或者运行nvidia-smi(Linux),确认自己到底有没有NVIDIA独立显卡,再决定后面的每一步。
1.2 显存大小直接决定你能训练多“重”的模型
YOLO不同规格的模型,体积和显存占用差距非常大。从命名就能看出来:yolov8n(nano)、yolov8s(small)、yolov8m(medium)、yolov8l(large)、yolov8x(xlarge)。nano模型参数量只有300万左右,xlarge则超过6800万。
显存不够是训练阶段最普遍的问题。我自己的经验,在8GB显存的笔记本上,yolov8n配batch=16、imgsz=640可以跑得很稳;换yolov8s就得降到batch=8;如果硬上yolov8l,大概率直接报CUDA out of memory。推理阶段显存占用小很多,哪怕老显卡也能扛住。
给个大致的参考:
| 显存 | 可跑的模型规格 | 训练batch建议 |
|---|---|---|
| 4GB | yolov8n / yolov8s | 4~8 |
| 8GB | yolov8n / yolov8s | 8~16 |
| 12GB | yolov8m / yolov8l | 8~16 |
| 24GB+ | yolov8x | 16~32 |
注意这只是经验值,实际占用还受图片分辨率、数据集类别数量、是否开启数据增强等因素影响。
1.3 AMD显卡(RX 580)到底能不能跑YOLO、要不要装CUDA
这是被问得最多的一个问题,尤其很多老电脑用的是AMD Radeon RX 580。结论先说:RX 580能跑YOLO,但装不了CUDA,也不需要装CUDA。
CUDA是NVIDIA自己推出的并行计算架构,只对NVIDIA的显卡有效。AMD的对应方案叫ROCm,但在Windows平台上一直没有正式支持,而RX 580所在的Polaris架构在Linux的ROCm官方支持列表里也基本被淘汰了。网上能看到一些在RX 580上折腾ROCm的教程,但过程复杂、兼容性差,对新手极其不友好,我个人不建议在这个方向上浪费时间。
那么问题来了:手上只有AMD显卡,又想学YOLO怎么办?
- 直接CPU跑:这是性价比最高的路线。用
yolov8n这种小模型做推理、做学习,完全够用。训练也能跑,就是慢一点,用来理解整个流程没有问题。 - 用ONNX Runtime的DirectML执行提供程序:可以在Windows上调用AMD/Intel显卡做加速推理,但Ultralytics官方包的
device参数里已经没有DirectML了,需要配合旧版本或自己构建,属于进阶玩法,新手先别碰。 - 换NVIDIA显卡:如果是想认真做深度学习,这依然是目前最稳妥的选择。
2. Anaconda虚拟环境与Python版本:第一道保险
2.1 为什么非要搞虚拟环境
我见过太多人直接在系统Python里pip install一堆包,装到后面依赖冲突、版本错乱,最后连系统工具都被搞坏。深度学习项目对包版本非常敏感,numpy、opencv-python、torch、torchvision之间都有版本匹配关系。虚拟环境相当于给每个项目单独开一个“房间”,房间里的包互不干扰,这套机制是深度学习环境配置里的基本功。
Anaconda和Miniconda是两套方案。Anaconda自带很多预装包,适合不想折腾的人;Miniconda只带conda本身,安装包全靠后面自己装,更轻量,我个人更推荐Miniconda。装好后打开Anaconda Prompt(Windows)或终端(Linux/macOS),后面所有操作都在这里进行。
2.2 创建YOLO专用环境
创建环境的命令很简单:
conda create -n yolo python=3.10 -y我选择Python 3.10而不是最新的3.12,主要原因是PyTorch和众多依赖包对3.10的兼容性最稳定。Python 3.11也可以,但3.12在一些旧依赖上还会出现编译错误,没必要冒险。环境创建好之后激活它:
conda activate yolo python --version看到输出Python 3.10.x,说明当前终端的Python已经切到了新环境。这里有个关键区分:屏幕左侧显示的(yolo)前缀,代表你确实在虚拟环境里。很多人的问题是“明明装了包,import还是报错”,十有八九是因为终端不在激活的虚拟环境中。
2.3 PyCharm和VSCode怎么选这个环境
环境建好之后,代码编辑器里也要把解释器指过来。
PyCharm的操作路径:File -> Settings -> Project -> Python Interpreter -> Add Interpreter -> Conda Environment -> Existing Environment,在列表里选yolo。
VSCode则是先按Ctrl+Shift+P,输入Python: Select Interpreter,在弹出的列表里选yolo环境。选完之后,打开终端时VSCode会自动帮你激活这个环境。
3. PyTorch安装绕不开的版本配对:CUDA、cuDNN与pip源
3.1 先查你的驱动支持到哪个CUDA版本
PyTorch的GPU版安装,核心是版本匹配。先运行:
nvidia-smi注意看右上角的CUDA Version,比如显示CUDA Version: 12.4,这是你的显卡驱动最高能支持的CUDA版本,不等于你已经装了CUDA。
不少新手看到这里就慌了:是不是要去NVIDIA官网下个12.4的CUDA Toolkit?其实不用。PyTorch的安装包里面自带了CUDA运行时,你只需要保证显卡驱动支持到对应版本即可。驱动支持的CUDA版本只要不低于PyTorch需要的版本,就能正常运行。真正需要手动装完整版CUDA Toolkit的场景是编译自定义CUDA算子,对普通YOLO使用来说完全不需要。
一个直观的类比:显卡驱动像手机系统底层,PyTorch里自带的CUDA像是安装在系统上的App。App要求系统不低于某个版本,但不需要你自己去“装”系统底层。
3.2 选择合适的PyTorch安装命令
去PyTorch官网(pytorch.org)的Get Started页面,选好你的操作系统、包管理工具、CUDA版本,它会直接给出安装命令。
以CUDA 12.1为例,用pip安装的命令是:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121不想用官方源、想用国内镜像提高速度的话,可以加上清华源。但PyTorch官方源的GPU包下载,很多时候清华源也有镜像,速度通常都不错,看情况选择即可。
3.3 安装后必须做的一次验证
装完之后,不要急着去跑YOLO,先花十秒钟验证PyTorch的GPU版本是否正常:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"如果输出True和你的显卡型号,说明GPU链路已经通了。这一步很多人会跳过,等到训练时报错再回头找,往往会浪费一两个小时。
3.4 两个高频坑:装成CPU版与版本不一致
第一个坑是装成了CPU版。CPU版的安装命令不带--index-url或者用的是cpu后缀,装完之后torch.cuda.is_available()会返回False。跑是能跑,但速度会让你怀疑人生。
第二个坑是CUDA版本和显卡驱动不匹配,症状是PyTorch能import,但跑模型时报各种CUDA error,比如CUDA driver version is insufficient for CUDA runtime version。这种问题通常出现在显卡驱动太老、装了过新的PyTorch版本时。解决办法就是升级显卡驱动,或者换成更低版本CUDA的PyTorch安装命令重新装一遍。
4. YOLO源码与依赖安装:目录结构和requirements.txt里的坑
4.1 官方推荐的安装方式
Ultralytics提供两种安装方式,一种是直接pip安装发布版,一种是克隆源码后以开发者模式安装。
pip install ultralytics这是最简洁的方式,适合只想用YOLO做推理或训练的正常用户。如果你打算看源码、改模型结构、加模块,那就用git方式:
git clone https://github.com/ultralytics/ultralytics cd ultralytics pip install -e .pip install -e .表示以开发模式安装当前目录下的项目,改动源码后不需要重新安装就能生效,对做YOLO改进的人来说很方便。需要注意,这个命令要求你先创建并激活了conda环境,否则会装到系统Python里。
4.2 源码目录结构里最值得注意的几个文件夹
克隆下来之后,你会看到这样一个结构:
ultralytics/cfg:存放所有模型配置和数据配置,模型定义就在这个目录下的多个yaml文件里。ultralytics/models:存放模型结构的Python代码,如果要改网络结构,主要就是改这里。ultralytics/data:数据加载、增强相关的代码。runs:运行输出目录,训练和推理的结果默认都存在这里(第一次运行时自动创建)。
如果是用pip install ultralytics安装的,没有源码目录,运行时会从安装包里读取各种配置。需要看源码时,用python -c "import ultralytics; print(ultralytics.__file__)"就能找到安装位置。
4.3 镜像源与依赖冲突
克隆源码后直接用pip install -r requirements.txt在国内网络环境下可能会很慢或者直接超时。加个镜像源能解决大部分问题:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simplerequirements.txt里的核心依赖是torch、torchvision、opencv-python、numpy、matplotlib这些。最容易出问题的其实是opencv-python。如果系统里已经装了opencv-contrib-python,两个包会冲突,导致import cv2时报错。解决办法是只保留其中一个。另外,如果requirements.txt里的opencv版本和你已有的冲突,可以先删掉已装的版本再让它重新装。
4.4 环境验证:用一张公共图片跑第一次推理
依赖装完,别急着自己准备数据集,先用官方自带的图片验证环境是否真的通了:
yolo predict source='https://ultralytics.com/images/bus.jpg' model=yolov8n.pt这条命令会先下载预训练权重yolov8n.pt(如果当前目录没有的话),然后对一张公交车图片做目标检测,检测结果保存到runs/detect/predict目录下。看到输出里出现大量person、bus、stop sign等检测框图片,说明你的环境已经全部打通了。
如果权重文件下载不动,多半是GitHub访问问题,可以手动去github.com/ultralytics/assets/releases下载对应的.pt文件,放到当前目录,再重新运行命令。这里强烈建议先把模型下载好再跑训练,避免训练过程中卡在下载环节。
5. 数据集准备与yaml配置:从VisDrone转换说起
5.1 YOLO标注格式到底是什么
YOLO格式的标注不是直接用矩形框的像素坐标,而是每张图片对应一个同名.txt文件,每一行代表一个目标:
class_id x_center y_center width height注意:坐标都是归一化后的,就是除以图片宽度或者高度得到的0到1之间的浮点数。比如一张640x480的图片里,框的左上角在(160, 120),宽320,高240,归一化后就是:
0 0.5 0.5 0.5 0.5转换脚本里最常犯的错就是忘了归一化,或者把中心坐标写成了左上角坐标。你可以在后面跑训练时看到大量框位置错乱的图,原因基本都出在这。
5.2 VisDrone2019数据集怎么转成YOLO格式
VisDrone是无人机视角下目标检测的经典数据集,被很多YOLO改进论文当成benchmark。它的原始标注格式和YOLO差别很大,需要转换。
VisDrone的标注文件是gt_000001.txt,每行格式是:
bbox_left bbox_top bbox_width bbox_height score category truncation occlusion其中category的范围是0到11,但注意它的类别定义里包含了ignored regions(类别0)和others(类别11),转换时通常要过滤掉。它真正的10个有效类别是:
| VisDrone原始ID | 类别名 | YOLO类别ID(映射后) |
|---|---|---|
| 1 | pedestrian | 0 |
| 2 | people | 1 |
| 3 | bicycle | 2 |
| 4 | car | 3 |
| 5 | van | 4 |
| 6 | truck | 5 |
| 7 | tricycle | 6 |
| 8 | awning-tricycle | 7 |
| 9 | bus | 8 |
| 10 | motor | 9 |
转换的思路其实很简单:读取原始txt,跳过score低于阈值的目标(无人机视角很多边缘模糊的小目标),过滤掉类别0和11,然后根据图片实际宽高把框的坐标归一化,最后写到训练集和验证集各自的labels目录里。在你自己的数据上转换,逻辑是一样的。
5.3 数据集目录结构与data.yaml编写
YOLO训练要求的数据集目录结构很固定:
dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── data.yaml对应的data.yaml文件内容类似:
path: /path/to/dataset train: train/images val: val/images nc: 10 names: ['pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor']path可以写绝对路径,也可以不写然后靠train和val的相对路径指向当前目录下的数据。最稳妥的做法是写绝对路径,很多坑都是因为路径没写对导致找不到图片。
5.4 先跑一个epoch验证数据
数据准备完,直接启动完整训练前,我强烈建议先只跑一个epoch,比如:
yolo detect train data=data.yaml model=yolov8n.pt epochs=1这一步能用极短时间暴露大量问题。如果出现标签类别数超过nc的报错、图片路径找不到的报错,都在这一步暴露出来。跑起来之后,重点看一下训练输出的前几张样本图,确认标注框贴在图上的真实目标上。我见过不少转换完的数据,框的位置明显不对,但训练过程不报错,模型最后学出来效果也很差,源头就在这里。
6. 训练命令的完整拆解与显存不足自救
6.1 一条训练命令的每个参数
以最常见的训练命令为例:
yolo detect train data=data.yaml model=yolov8s.pt epochs=100 batch=16 imgsz=640 device=0 workers=4逐个参数拆开看:
data:训练数据配置文件的路径。model:这里有两个作用。指定一个.pt预训练权重文件,就会在它的基础上继续训练,也就是迁移学习;如果指定一个.yaml模型结构文件,就是从头训练,不加载任何权重。epochs:训练轮数。数据集简单,几十轮就够;复杂任务或者数据量大,100到300轮都很正常。batch:一次迭代喂给模型的图片张数。显存不够时的第一调整对象。imgsz:输入图像被缩放的边长。默认640,如果显存吃紧可以降到512甚至416。device:指定用哪块GPU,0代表第一块显卡,cpu代表用CPU训练。workers:数据加载线程数,Windows下不宜设太大,4或8足够。
6.2 batch的大小不是越大越好
很多新手以为batch调得越大训练越快。实际上,batch过大会导致显存溢出,batch过小则训练不稳定、收敛慢。正确的做法是在显存允许的范围内尽量用大一点的batch。Ultralytics提供了一个自动寻找最大batch的功能,把batch设置成-1:
yolo detect train data=data.yaml model=yolov8s.pt epochs=100 batch=-1它会自动测试当前硬件条件下能用的最大batch值。第一次用新机器训练时,我很推荐先这样试一次,看到它测出的最大值之后,再手动把batch设成这个值附近的合理数字。
6.3 CUDA out of memory的完整自救流程
CUDA out of memory是训练时最常遇到的报错,但别一看到就直接把batch降到1。按优先级排查:
- 关闭占用显存的其它程序,比如浏览器里开了大量视频、其它训练进程没关干净。
- 降低batch大小,从16降到8,再降到4。
- 降低
imgsz,从640降到512。 - 换更小的模型,从
yolov8s换成yolov8n。 - 打开
torch.cuda.empty_cache()清理缓存。
要注意的是,哪怕你只用了4GB显存,训练一个小模型时报显存不足,也有可能是PyTorch的显存碎片问题,此时重启一下训练进程往往能解决。
6.4 训练结果怎么看
训练结束后,结果保存在runs/detect/train/目录下,里面最有用的两个文件是:
weights/best.pt:验证集效果最好的模型权重,后续推理部署都用它。weights/last.pt:最后一次epoch的权重,用于断点续训。results.png:训练过程中的loss曲线和mAP曲线,快速判断模型是否收敛、是否过拟合。
results.png里重点看train/box_loss、val/box_loss和metrics/mAP50-95这几条曲线。如果训练loss持续下降但验证loss开始上涨,说明过拟合了,需要早停或者加大数据增强。
7. 跑通之后最常踩的几个环境报错与排查链路
7.1 CUDA out of memory
这个报错出现时,完整报错里会带一段调用栈,最后一行类似:
RuntimeError: CUDA out of memory. Tried to allocate 512.00 MiB (GPU 0; 8.00 GiB total capacity; 7.50 GiB already allocated; 0 bytes free)按照上一节的排查链路处理即可。这里单独提一个环境层面容易忽略的点:一些老显卡的驱动其实已经不支持新版PyTorch需要的CUDA算力,但驱动更新之后就能解决。所以遇到显存问题时,先确认nvidia-smi里的驱动版本是不是最新,再谈batch调参。
7.2 No module named 'torch'
激活了conda环境,但在PyCharm或VSCode里运行代码时依然报这个错,本质原因是编辑器里的Python解释器不是你建的那个yolo环境。这和前面章节说的情况一样——回到编辑器设置里把解释器选对就行。
7.3 AssertionError: Label class xx exceeds nc=xx
这是标签类别数超出配置导致的。比如data.yaml里nc: 10,但某个标注txt里出现了类别ID 10(YOLO的类别ID从0开始,合法范围是0到9)。出现这个报错,排查思路是:
- 检查数据转换脚本的类别映射是否正确。
- 检查是否遗漏了过滤
ignored regions这类无效类别。 - 写一个统计脚本,循环遍历所有labels文件,找出哪些txt出现了超过
nc-1的类别ID。
这个报错如果直接出现在训练的中途,千万别想着调大nc蒙混过关,那是把问题掩盖起来,模型最终学出来的结果必然有问题。
7.4 中文路径与FileNotFoundError
YOLO训练对路径里的中文很敏感,尤其是Windows系统。如果你的用户名是中文,C:\Users\张三\...这种路径,在读取图片、保存结果时会出现各种诡异的FileNotFoundError。解决方案很粗暴:把项目和数据集中放到一个纯英文路径下,比如D:\yolo\。这个坑很多人要花半天才反应过来,建议从一开始就避开。
7.5 其它杂项:git拉不动、pip超时、GPU利用率低
Git拉不动源码,可以换用GitHub镜像或者直接从官网下载zip压缩包解压。pip安装超时,配置一下全局镜像源即可。GPU利用率低、训练时显卡占用率忽高忽低,常见原因是workers设成0或者数据读取速度跟不上,把workers调到4~8通常会明显改善;另外Windows下在yolo train命令里加了workers但数据是机械硬盘,读图速度也会拖后腿。
环境配置这件事,说白了就是一套固定的链条:显卡驱动 -> CUDA运行时 -> Python虚拟环境 -> PyTorch -> YOLO源码 -> 数据格式 -> 训练参数。每一步的验证方法其实都很简单,关键是不要跳步。我自己的习惯是,每装完一个环节就立刻验证一次,一旦哪一步出了错,定位范围会大幅缩小。把这个流程跑过两三遍之后,你基本就不会再被环境问题卡住了,后面的重心就可以全部放到模型改进和数据优化上。