前两天同事换了台新 Windows 开发机,跑过来问我:Anaconda 装好了,Python 也装了,为什么 import torch 还是各种报错,YOLO 根本跑不起来?这种问题我一年至少要答十几次,每次听下来都是同一个套路——环境变量乱了、虚拟环境没建、CUDA 和 torch 版本对不上。今天干脆把我自己在 Windows 和 Linux 两头反复搭建 YOLO 运行环境的经验整理成一篇完整的实操记录,从 Anaconda 安装、镜像源配置、虚拟环境创建,到 YOLO 模型跑通、常见问题排查,全部串起来讲一遍。
这篇内容适合刚接触目标检测的开发者,也适合那些已经装了 Anaconda 但始终没法把 YOLO 跑顺的人。我不讲太多源码原理,重点放在“怎么一步步搭起来”“为什么这么搭”“搭的时候最容易在哪翻车”这三件事上。
1. 动手前的整体设计:为什么是 Anaconda 而不是别的方案
1.1 Anaconda 到底解决了什么问题
很多新手一开始会问:我直接用 pip 装依赖不行吗?为什么非要 Anaconda?这个问题其实问到点子上了。YOLO 这类深度学习项目,依赖的不是一两个包,而是一整条工具链:torch、opencv-python、numpy、pillow、matplotlib、ultralytics,以及底层涉及的一些二进制库。裸 Python 环境里直接 pip 安装,时间一长必然出现版本冲突——今天装 A 包要 numpy 1.x,明天装 B 包强制把 numpy 升到 2.x,然后你发现 YOLO 莫名其妙开始报错,整个环境直接没法用了。
Anaconda 的核心价值就两个字:隔离。它可以在同一台机器上创建完全独立的虚拟环境,每个环境拥有自己的 Python 解释器和一套依赖。YOLO 用 Python 3.10 + torch 2.1,其他项目用 Python 3.9 + torch 1.13,互不干扰。另外 conda 本身会处理很多非 Python 的底层依赖,比如某些图像处理库的 DLL/SO 文件,pip 在这块处理得并不好。
还有一个隐藏优势是 conda 对系统级依赖的收纳。比如说 Linux 下 OpenCV 依赖的 libGL.so.1,经常有人装完 opencv-python 后 import cv2 报错,就是因为系统缺这个库。用 conda 创建环境时,它会顺手把这类依赖放进环境目录里,很大程度上避开系统库缺失的问题。
1.2 动手前先定三件事:GPU、系统、YOLO 版本
我见过太多人拿到教程就照抄命令,结果卡在第一步:他不知道自己的机器是 N 卡还是 A 卡,也不知道自己的 Ubuntu 到底装没装驱动。所以在敲任何命令之前,先花五分钟把下面三件事定下来。
第一,你的机器有 NVIDIA 独立显卡吗?这直接决定了你要装 CPU 版还是 GPU 版的 PyTorch。如果只是跑 YOLO 推理、做小规模测试,CPU 版完全能跑,就是慢一点。如果要训练模型,尤其是训练自定义数据集,没有 GPU 基本等于坐牢。个人经验:用 YOLOv8n 在 CPU 上推理一张 640x640 的图片,大概需要 100~300ms,训练一个小数据集可能要几小时;而同样的任务放到 RTX 3060 上,推理只要 10~20ms,训练时间能缩短几十倍。
第二,你的系统是 Windows 还是 Linux?这两者的环境搭建思路相同,但细节差异不小。Windows 上相对无脑,显卡驱动装好后,PyTorch 通过 pip 装上就能用 CUDA;Linux 上你要检查驱动版本和 CUDA 版本是否匹配,还经常遇到权限问题。如果你的最终目标是部署到服务器,那建议从一开始就以 Linux 环境为主,Windows 只做开发调试。
第三,用哪个 YOLO 版本?目前社区主流是 Ultralytics 公司维护的 YOLOv5 和 YOLOv8 系列,这套实现最大的优点是用 pip install ultralytics 就能装好,不需要编译 C 代码,模型权重也是预训练好的,下载就能用。还有一类是老牌的 Darknet 框架,也就是 YOLOv4 那一系,需要自己编译源码,功能强大但折腾成本高。我的建议:除非你有特殊需求,否则直接用 Ultralytics 系,环境搭建的工作量能少掉一半以上。
1.3 环境版本参考表
下面这组版本组合是我在多个项目中验证过、相对稳妥的搭配,直接照着用不会踩太多坑:
| 项目 | Windows 推荐 | Linux 推荐 |
|---|---|---|
| 系统 | Windows 10/11 64位 | Ubuntu 20.04 / 22.04 |
| Anaconda | Anaconda 2024.x | Anaconda 2024.x |
| Python | 3.10 | 3.10 |
| PyTorch | torch 2.x + CUDA 12.x | torch 2.x + CUDA 12.x |
| Ultralytics | 8.x 最新版即可 | 8.x 最新版即可 |
这里要特别说明为什么 Python 选 3.10。Ultralytics 官方文档明确支持 Python 3.8~3.12,理论上 3.12 也行,但很多第三方依赖(尤其是老版本的 torch)对 Python 3.11/3.12 的预编译 wheel 支持并不同步。Python 3.10 是当前兼容面积最广的版本,torch、opencv、onnxruntime 这些核心库的预编译包都覆盖得很好。别一上来就装最新的 Python 3.12,省下的那点性能提升,抵不上你后面排查依赖兼容性消耗的时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Anaconda 安装与配置的核心细节
2.1 Windows 安装 Anaconda 的几个关键选项
Anaconda 在 Windows 上是图形化安装,界面很简单,但有几个选项值得注意。安装路径选择是第一个坑:默认路径是 C:\Users\用户名\anaconda3,如果用户名是中文,或者路径里有空格,后续很多深度学习库在编译或读取文件时可能出问题。建议安装时直接改到 D:\anaconda3 这种纯英文、无空格的路径下。
安装过程中会问是否把 Anaconda 加入 PATH 环境变量,这里我推荐不勾选。很多人不理解:不加入 PATH,那我怎么用 conda 命令?其实 Anaconda 自带一个“Anaconda Prompt”终端,进去之后 conda 命令是自动可用的。如果勾选了 Add to PATH,系统的 python 命令可能会被 Anaconda 覆盖,和你机器上原有的其他 Python 环境打架,得不偿失。更稳妥的做法是装完后,在 Anaconda Prompt 里操作所有 conda 命令。
2.2 Linux 安装 Anaconda 的命令行操作
Linux 下没有图形安装界面,全靠命令行。官方安装脚本是一个 .sh 文件,下载后用 bash 执行即可:
bash复制wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh
bash Anaconda3-2024.10-1-Linux-x86_64.sh
安装过程中会询问安装路径,默认是 ~/anaconda3,这个可以作为首选。它还会问是否运行 conda init,这里要选 yes。conda init 的作用是把 conda 的初始化代码写进当前用户的 ~/.bashrc,这样以后打开终端就能直接用 conda 命令。
有一点要特别提醒:不要为了方便用 sudo 安装 Anaconda。Anaconda 默认安装在用户目录下,这本身就足够了。用 sudo 安装会导致环境文件属于 root 用户,后面普通用户操作时各种权限不足。如果已经装到 root 目录了,最简单的办法就是删除重装,别在那里挣扎着改权限,浪费时间。
安装完成后,重新打开一个终端,验证一下:
bash复制conda --version
能输出版本号就说明安装成功。
2.3 镜像源配置:解决 conda 404 报错的关键
配置镜像源是我认为整篇教程里最实用的一步,因为大部分人在国内网络环境下,直接用官方的 conda 源下载包,速度慢不说,还经常遇到一个经典报错:
code复制UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel anaconda/pkgs/free
这个报错出现的原因很多老教程没讲清楚。以前默认配置里会带上 anaconda/pkgs/free 和 anaconda/pkgs/msys2 这两个频道,但后来 Anaconda 官方把 free 和 msys2 频道迁移到了 archive 路径下,老的频道地址不再有效。所以一旦你的 conda 配置里还残留这些旧频道,就会 404。解决办法是把通道配置重置,改用国内镜像源。
我用的清华 TUNA 镜像源配置方式如下:
bash复制conda config --remove-key channels
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
conda config --set show_channel_urls yes
依次执行完这四条命令后,可以再看一眼当前配置:
bash复制conda config --show channels
另外建议顺手把 pip 的镜像源也换了,因为后面安装 PyTorch 和 Ultralytics 时主要用的是 pip。创建一个 pip.ini(Windows)或 pip.conf(Linux)配置文件,内容如下:
ini复制[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
配置好之后,下载速度会明显提升,很多超时问题也会消失。
2.4 创建虚拟环境的完整操作
环境搭建到这里差不多进入正题了。打开终端(Windows 用 Anaconda Prompt,Linux 用普通终端),执行:
bash复制conda create -n yolo python=3.10 -y
这条命令会创建一个名为 yolo 的虚拟环境,Python 版本锁定为 3.10。创建完成后,激活环境:
bash复制conda activate yolo
激活后,终端提示符前面会出现 (yolo) 字样,这就说明已经进入虚拟环境了。这里顺手列几个常用的环境管理命令,方便查:
| 操作 | 命令 |
|---|---|
| 查看已有环境 | conda env list |
| 激活环境 | conda activate yolo |
| 退出环境 | conda deactivate |
| 删除环境 | conda env remove -n yolo |
| 导出环境配置 | conda env export > environment.yml |
| 从配置创建环境 | conda env create -f environment.yml |
之所以强调用虚拟环境而不是直接装在 base 里,是因为 base 是 Anaconda 自带的全局环境,如果你在 base 里装深度学习依赖,某一次 pip 升级把某个包搞坏了,你连最基本的 conda 命令都可能跑不了,恢复成本极高。独立环境坏了直接删掉重建,不影响其他任何项目。
3. 从零到跑通 YOLO:Windows 与 Linux 的实操过程
3.1 Windows 下跑通 YOLOv8 最小 demo
激活虚拟环境后,先后安装 PyTorch 和 Ultralytics。如果你的机器没有 NVIDIA GPU,装 CPU 版:
bash复制pip install torch torchvision
如果你有 NVIDIA GPU,建议安装 CUDA 12.x 版本的 PyTorch,目前官方推荐的安装命令是:
bash复制pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
注意这里的 --index-url 会覆盖之前配置的 pip 镜像源,下载速度可能变慢。如果遇到网络问题,可以先不指定 index-url,直接 pip install torch torchvision,让 pip 从清华镜像拉取默认版本,虽然可能不是最新的 CUDA 版本,但也能正常用。
然后安装 YOLO 本体:
bash复制pip install ultralytics
这个过程会拉取很多依赖包,包括 opencv-python、numpy、matplotlib、pandas、pillow 等,只需要耐心等待。装完后,测试一段最简推理代码。先准备一张图片,比如 bus.jpg,然后写一个 Python 脚本 detect.py:
python复制from ultralytics import YOLO
# 加载预训练模型,首次运行会自动下载权重文件
model = YOLO("yolov8n.pt")
# 对图片进行推理
results = model("bus.jpg", save=True, project="runs", name="detect_demo")
# 打印检测结果
for result in results:
for box in result.boxes:
cls_id = int(box.cls[0])
conf = float(box.conf[0])
xyxy = box.xyxy[0].tolist()
print(f"类别: {result.names[cls_id]}, 置信度: {conf:.2f}, 坐标: {xyxy}")
运行这个脚本:
bash复制python detect.py
如果一切正常,你会看到模型下载、推理进度条,最后在 runs/detect_demo/ 目录下生成标注了检测框的图片。这里有个小坑要提前告诉你:第一次运行 YOLO("yolov8n.pt") 时,ultralytics 会自动下载权重文件,如果网络不好,下载可能卡住失败。解决方案是手动把 yolov8n.pt 下载到当前目录,或者放到 C:\Users\你的用户名\AppData\Roaming\Ultralytics\ 下,这样官方代码检测到本地已有权重,就不会再尝试下载。
3.2 Linux 下搭建的关键差异与初始化脚本
Linux 下的安装流程和 Windows 基本一致,但有几个额外的注意点。首先检查显卡驱动和 CUDA:
bash复制nvidia-smi
如果提示找不到命令,说明驱动没装好。nvidia-smi 输出右上角会显示当前驱动支持的 CUDA 版本,比如 CUDA Version: 12.2。这意味着你的驱动可以支持最高 CUDA 12.2 的运行时,PyTorch 只要装的 CUDA 版本不超过这个就能用。驱动、CUDA 和 PyTorch 三者的关系可以简单理解为:驱动是底层,CUDA 是中间层,PyTorch 是上层应用,上层不能比底层要求的版本更高。
如果 nvidia-smi 正常,就激活环境、装依赖,流程和 Windows 一样。为了方便之后频繁进入环境,我个人习惯写一个初始化脚本 setup_yolo.sh:
bash复制#!/bin/bash
source ~/anaconda3/etc/profile.d/conda.sh
conda activate yolo
python -c "import torch; print('PyTorch:', torch.__version__, 'CUDA:', torch.cuda.is_available())"
每次打开新的终端,直接 bash setup_yolo.sh 就能一步到位,省得每次手动敲 conda activate。
Linux 下还有一个 Windows 不太会遇到的问题是权限。如果你把数据集放在 /opt/、/root/ 这类系统目录下,默认用户没有写权限,训练过程中模型保存权重时就会报 Permission denied。最省事的做法是把数据放在用户目录下,比如 ~/datasets/,一路都用自己的权限,不用碰 chmod 那些东西。
3.3 IDE 配置与数据集目录准备
命令行跑通只能算迈出第一步,实际开发中大家还是用 IDE。PyCharm 配置 Anaconda 环境的方法比较直观:打开 Settings -> Project -> Python Interpreter,点击齿轮图标选择 Add Interpreter -> Conda Environment -> Existing Environment,然后选择你创建的 yolo 环境下的 Python 解释器路径。Windows 下这个路径通常是 D:\anaconda3\envs\yolo\python.exe,Linux 下是 ~/anaconda3/envs/yolo/bin/python。选完后,PyCharm 里的终端也会自动激活这个环境。
使用 VSCode 的话,按 Ctrl+Shift+P 打开命令面板,输入 Python: Select Interpreter,选择同样的路径即可。
另一个避不开的问题是数据集目录结构。YOLO 训练自定义数据集,要求图片和标签严格按下面这种方式组织:
code复制datasets/
└── my_dataset/
├── images/
│ ├── train/
│ └── val/
├── labels/
│ ├── train/
│ └── val/
└── data.yaml
data.yaml 文件里指定训练集、验证集路径以及类别名称,内容大致如下:
yaml复制train: ../datasets/my_dataset/images/train
val: ../datasets/my_dataset/images/val
nc: 2
names: ['person', 'car']
这里最容易犯的错是路径写错。train 和 val 字段的路径是基于 data.yaml 所在目录的相对路径,不是绝对路径。如果路径错了,训练时会报错找不到图片,或者是生成了空的标签文件。建议在训练前写几行代码检查一下数据集:
python复制import os
from ultralytics.data import YOLODataset
dataset = YOLODataset(img_path="datasets/my_dataset/images/train", data=dict(yaml_file="datasets/my_dataset/data.yaml"))
print(f"图片数量: {len(dataset)}")
如果数量是 0,说明路径有问题,赶紧排查,别等到训练跑到一半才发现。
4. 常见问题与排查技巧实录
4.1 conda 通道 404 与 SSL 报错
这类报错是出现频率最高的,尤其是照着老教程配置环境时。报错信息通常像这样:
code复制UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel anaconda/pkgs/free
解决方法我之前在配置镜像源时已经说过:删除旧渠道、添加新镜像。如果执行 conda clean -a 后仍然报错,可以用 conda config --show channels 查看当前实际生效的渠道,确认是不是还有残留的 free 或 msys2。
还有一类 SSL 报错,特征是:
code复制CondaHTTPError: HTTP 000 CONNECTION FAILED for url <...>
常见原因是 conda 配置里设了 ssl_verify: true,而镜像源证书不全导致握手失败。临时处理方式是把校验关掉:
bash复制conda config --set ssl_verify false
但我不建议永久关闭,解决完问题后最好改回来,或者换一个证书更完整的镜像源。排查这类问题有一个通用心法:先看完整报错信息的 URL,确认它访问的是哪个源,再对症下药,不要一看报错就重装 Anaconda,那个成本太高了。
4.2 CPU 推理慢与多进程反而更慢
很多人初次跑 YOLO 用的是 CPU 版,推理一张图感觉慢,就想着用多进程加速。搜一下能看到一个很典型的词:“yolo cpu 多进程慢1.4秒”。这个现象我实际测过,原因其实不复杂。
YOLOv8n 在 CPU 上推理单张 640x640 图片,耗时一般在 50~200ms 之间。如果你用 Python 的 multiprocessing 给每张图开一个进程,进程创建、数据序列化传输、上下文切换的开销很容易达到几百毫秒甚至几秒。也就是说,任务本身只有几十毫秒,进程管理开销反而成了大头,最终比单线程还慢 1.4 秒非常正常。
更合理的方式是变批量处理。把多张图片组成一个 batch,一次性喂给模型推理,利用模型内部的并行计算,整体吞吐量会明显更高。一个简单的例子:
python复制from ultralytics import YOLO
model = YOLO("yolov8n.pt")
image_paths = ["img1.jpg", "img2.jpg", "img3.jpg"]
results = model(image_paths) # 传一个列表,模型内部会分批处理
如果为了多进程加速,我建议只对超大图片做解码、预处理这些 CPU 密集操作做并行,模型推理本身保持单进程。
还有一个相关的问题是显存不足。GPU 推理时如果报 CUDA out of memory,通常的解决办法是调小 batch 参数,或者换更小的模型。YOLO 从 n/s/m/l/x 依次变大,显存占用和精度也是依次递增。显存只有 4G 的话,老老实实用 yolov8n 或 yolov8s,别碰 l 和 x。
4.3 检测结果出现大量重叠框
YOLO 输出结果如果出现重叠框非常多的情况,原因基本有两个:置信度阈值(conf)设置太低,或者 NMS 的 IoU 阈值(iou)设置太高。ultralytics 里对这两个参数的默认值是 conf=0.25、iou=0.7,但在某些密集场景或者模型没训练好的情况下,默认值不一定合适。
调节方式是在推理时传入参数:
python复制results = model("bus.jpg", conf=0.4, iou=0.5, save=True)
那么 conf 降阈值和 iou 升阈值分别会带来什么效果?可以简单记一下:conf 调高,会过滤掉低置信度的框,减少误检;iou 调低,会让 NMS 更激进,重叠严重的框就会被抑制掉。如果图像中目标本身就很密集,比如人群检测,重叠一部分是正常的,这时候别为了“消除重叠”盲目调低 iou,很可能把正确的检测框也一起删掉。
另外有一个经验值供参考:绝大多数目标检测场景下,conf=0.3~0.5、iou=0.5~0.7 是比较合理的区间。如果用了极端值(比如 conf=0.01)仍然每个目标只有少量框,怀疑是不是模型权重文件和模型结构不匹配,或者你输入图片的尺寸被压得太厉害。一般 640x640 是安全的输入分辨率,太小了会丢失小目标。
4.4 Windows 控制台中文乱码与编码问题
Windows 用户在跑 YOLO 时大概率会遇到中文乱码,比如打印日志里的中文变成了一堆“鈥斺€??”这样的字符。这个问题的根源是 Windows 命令行的默认编码是 GBK,而 Python 3 默认输出 UTF-8 编码的字符串,两者不一致就显示成乱码。
最直接的办法是把命令行代码页切换为 UTF-8。在 cmd 或者 Anaconda Prompt 里执行:
cmd复制chcp 65001
这样当前的命令行窗口就会用 UTF-8 编码显示,乱码问题消失。注意这个设置只在当前窗口生效,每次打开新窗口都要重新执行。
如果你不想每次手动敲,也可以在 Python 脚本最开头加上下面两行:
python复制import sys
sys.stdout.reconfigure(encoding='utf-8')
这个技巧在 Windows 上尤其好用,代码里打印中文日志就不会乱码了。默认情况下如果路径中包含中文,例如 C:\Users\张三\datasets,OpenCV 读取图片时可能会返回 None,因为 OpenCV 底层走的是 C++ 的文件读取接口,对中文路径支持不佳。最省心的解决办法就是从一开始就把路径设计成纯英文:用户名如果是中文,就把数据放到非用户目录下,比如 D:\yolo_data。
4.5 镜像源导致的包安装版本偏差
还有一个高频问题:明明安装了最新版 PyTorch,但跑起来提示 CUDA 不可用。这种情况多半是你安装的 torch 是 CPU 版。用 pip list | grep torch 查看时,如果版本号后面带有 +cpu 后缀,说明装的就是 CPU 版。解决方式是在删除现有 torch 后,按官方命令重新从 --index-url 指定的 CUDA 版本源安装一次,安装完再用 python -c "import torch; print(torch.cuda.is_available())" 验证。输出 True 就说明 CUDA 可用。
5. 环境复用、进阶扩展与经验总结
5.1 同一套环境做实例分割和多模态扩展
环境跑通之后,你会发现在 Ultralytics 体系里扩展任务其实非常顺滑。之前用 YOLOv8 做检测,是想跑实例分割的话只需要换个模型权重文件:
python复制from ultralytics import YOLO
model = YOLO("yolov8n-seg.pt")
results = model("bus.jpg", save=True)
不需要重新安装任何依赖,同一个虚拟环境直接支持检测、分割、姿态估计、分类等任务。这个设计很大程度上得益于 Ultralytics 把各个任务统一到了同一个底层接口上,训练和推理代码结构一致,对开发者来说非常友好。
如果对多模态模型感兴趣,Ultralytics 官方也推出了 YOLO-World 这类开放词汇检测模型,可以通过自然语言提示进行目标检测。这类模型对 torch 版本有一定要求,如果遇到不兼容,建议新建虚拟环境单独测试,别把之前跑通的 YOLO 检测环境搞坏。我的习惯是:凡是验证新特性,一律建新环境,跑通了再考虑是否迁移。
5.2 环境复现与跨机器迁移的两种姿势
环境搭好只是开始,真正让人头疼的是换机器之后要把这套环境完整复制过去。我在团队协作中经常遇到:代码传到服务器上跑不了,本地好好的。大多数情况是环境不一致。
最完整的复现方式是 conda 导出环境:
bash复制conda env export > environment.yml
拿到另一台机器上执行:
bash复制conda env create -f environment.yml
这会把环境中所有包和版本号都固定下来,适合完整复现。但缺点也很明显,环境文件可能很大,而且它记录的平台信息未必与目标机器完全匹配,跨 Windows/Linux 迁移时容易出现各种奇怪问题。所以我的建议是:跨系统迁移时不直接用 environment.yml,而是只保留 requirements.txt,在目标机器上重建虚拟环境后重新安装 torch 和 ultralytics:
bash复制pip freeze > requirements.txt
然后在目标机器上先建好环境和 Python 版本,再执行 pip install -r requirements.txt,最后单独安装对应平台的 torch。这样可以避免 conda 导出文件里的平台差异导致的不可用问题。
5.3 我踩过几次坑之后的一些建议
最后说几句实在话。环境搭建这件事,80% 的问题根本不在于 YOLO 本身,而在于 Python 版本、PyTorch 版本、CUDA 驱动、路径设置这四个变量没有对齐。如果你在跑代码时遇到诡异的问题,我的第一反应永远是先去命令行里执行这行代码:
bash复制python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
这行命令的输出能帮你判断 90% 的环境问题:torch 版本不对、CUDA 不可用、Python 解释器选错环境,全部都能看出来。等你把环境跑通一次,后面的路就顺了。另外一个很实用的小建议是,把环境搭建的关键命令整理成一个笔记文件,存到自己的知识库里。每次在新机器上搭 YOLO 环境时照着执行一遍,遇到报错再补充进去,几次之后,你就再也不怕换机器了。
