先说个会劝退新人的现实:CPU上跑YOLO,速度确实比不上GPU,但它绝不是什么“不可用”的东西。我自己给实验室低年级同学配过很多次环境,多数人一开始都是“一台普通笔记本、没有独显、又想学目标检测”的状态。YOLO目标检测环境配置(CPU版)真正难的点,从来不是YOLO本身,而是Python版本、PyTorch版本、依赖库之间的拉扯,以及一堆看起来莫名其妙的报错。
这篇文章我不打算给你堆冷冰冰的命令,而是按零基础小白也能一步步照做的方式,从Anaconda安装、CPU版PyTorch选择、Ultralytics库安装,到真正跑出一张图的检测结果,全程讲清楚“为什么要这样做”以及“哪里最容易翻车”。如果你手上正好是纯CPU电脑,且刚接触目标检测,这篇文章可以直接当配置手册用。
1. 先弄明白自己的预期:CPU跑YOLO到底能跑到什么程度
很多人在配置环境之前,就已经被网上那些“GPU推理毫秒级”的视频带偏了。等自己在CPU上跑起来,发现一张图要几百毫秒,立刻觉得是不是自己配错了。其实不是配错了,是预期没建立好。
1.1 我实测过的CPU推理参考数据
下面这组数据是我在同一颗Intel i5-1240P处理器上、固定输入尺寸640×640、纯CPU推理时记录下来的大概区间,不同电脑会有浮动,但量级基本可以参考:
| 模型 | 参数量 | 单张图片CPU推理耗时 | 使用体验 |
|---|---|---|---|
| YOLO11n | 约250万 | 0.15~0.4秒 | 图片检测很流畅 |
| YOLO11s | 约940万 | 0.5~1.0秒 | 图片检测可以接受 |
| YOLO11m | 约2000万 | 1.2~2.5秒 | 只能用来调流程 |
| YOLO11x | 约5700万 | 3秒以上 | 不建议CPU硬跑 |
这里说的“推理耗时”指的是模型从拿到图像到输出检测框的时间,不包括权重下载、图像加载和保存结果的时间。如果你用的是老一代的YOLOv5s或YOLOv8s,数据也差不多。CPU跑视频的话,1080P视频基本只能跑到每秒1到3帧,拿来看检测效果勉强够,做实时监控肯定不够。
1.2 CPU方案适合谁,不适合谁
CPU版YOLO环境配置适合这几种情况:
- 学生刚入门,只想理解目标检测的运行逻辑、看检测框效果;
- 还没买GPU,想先用代码把整个流程跑通,后面再无缝迁移到GPU环境;
- 处理离线批量图片,对单张耗时没有硬性要求;
- 搞数据集标注辅助,把检测结果导出成csv或txt再人工核对。
不适合的情况也很明显:实时视频检测、高并发推理、工业级部署场景,这些还是老老实实等有GPU环境时再碰。CPU环境的意义是“让你入门”,不是让你拿它当生产力工具。
2. 环境准备第一步:装Anaconda/Miniconda,并把虚拟环境管理明白
0基础配置Python环境,我最不推荐的方式就是直接去python.org下个Python装完就开干。你后面会发现opencv、numpy、torch这些库把系统Python环境搅得一团乱,卸载都卸不干净。正确做法是用Anaconda或者Miniconda管理虚拟环境。
2.1 为什么非要搞一个虚拟环境
你可以把虚拟环境理解成一个个独立的小房间:每个房间里都有自己的一套Python解释器和第三方库版本。YOLO项目用的环境是Python 3.10,里面装PyTorch 2.x、OpenCV 4.x;另一个项目可能用的是Python 3.8、numpy 1.19,互不干扰。环境配错了直接删掉重建,几秒钟恢复原状,不会把电脑搞坏。
我建议选Miniconda而不是Anaconda。Anaconda自带的工具和库太多,安装包就好几个G,很多根本用不上。Miniconda只有conda核心和Python,后面需要什么库再单独装,干净轻量。当然你已经装了Anaconda也没关系,后面操作逻辑是一样的。
2.2 安装步骤和创建环境的具体命令
去Miniconda官网下载对应系统的安装包,Windows下就是一个exe。安装时记得勾选“Add Miniconda3 to my PATH”,这样以后在cmd或PowerShell里可以直接用conda命令。装好之后打开命令行,先验证:
conda --version如果能看到conda版本号,说明安装成功。接着创建一个用于YOLO的独立环境:
conda create -n yolo_cpu python=3.10 -yyolo_cpu是环境名字,你可以随意改。python=3.10这个版本号我特意标出来,是因为Ultralytics官方要求的Python支持范围里,3.10目前是最稳的选择。Python 3.12、3.13虽然也能装,但很多依赖库编译版本还没有完全跟进,新手遇到报错会怀疑人生。创建完成后激活环境:
conda activate yolo_cpu激活成功后,命令行前面会出现(yolo_cpu)字样。这时候你再输入python --version,看到的是环境里Python 3.10版本,和系统全局Python无关了。
注意:如果你的电脑网络下载conda包很慢,可以在创建环境前先配置国内镜像源,执行
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/,后面创建环境的速度会明显提升。
3. 安装CPU版PyTorch:不要照抄默认命令,这一步决定你后面顺不顺
PyTorch是整个YOLO跑起来的计算核心。网上搜“PyTorch安装”会出来一堆教程,但里面大多数命令默认安装的是GPU版本,即包含CUDA运算库。你在无GPU电脑上装这个,不仅白白下载好几个G的文件,还可能因为CUDA版本和显卡驱动不匹配出现诡异报错。
3.1 怎么确定装的是CPU版而不是GPU版
CPU版的PyTorch和GPU版的PyTorch,在Python代码层面没有区别,但底层实现完全不同。CPU版安装包小得多,而且不依赖显卡驱动。装完之后用一个简单命令就能验证:
import torch print(torch.__version__) print(torch.cuda.is_available())CPU版应该出现类似2.1.2+cpu这样的版本号,torch.cuda.is_available()返回False。如果返回True但你电脑又没装NVIDIA驱动,那大概率是装了错误的带CUDA版本。
3.2 CPU版PyTorch安装命令和提速技巧
在激活的yolo_cpu环境里,执行下面这条命令安装CPU版:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu--index-url参数是指定PyTorch官方CPU版本下载源,不加这个参数,pip会从默认PyPI源装到带CUDA的版本。torchvision是PyTorch官方配套的图像处理库,YOLO的很多流程会用到它。
如果你习惯用国内PyPI镜像,也可以这样装:
pip install torch torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple这种装法默认拿到的是普通版本而不是+cpu版,但只要电脑上没有GPU,也能正常使用推理,只是安装包体积会大一点。我个人更推荐第一种官方CPU源,干净省事。
安装完之后验证一下:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"看到2.x.x+cpu和False,这步就成了。
4. 安装Ultralytics YOLO库:一条命令的安装背后还有隐藏坑
环境里有了Python和PyTorch,接下来装YOLO本体库Ultralytics。它同时支持YOLOv8和YOLO11(也就是网上叫的YOLOv11),所以不需要纠结“装哪个版本YOLO”,装一个库全部能用。
4.1 Ultralytics安装命令和依赖库
在命令行激活yolo_cpu环境的基础上,直接执行:
pip install ultralytics安装过程中会自动拉取一堆依赖库,包括opencv-python、matplotlib、pandas、pyyaml等等。这一步偶尔会卡在opencv的安装上,因为opencv-python默认源下载很慢。如果卡了很久,可以手动先装opencv,再装ultralytics:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后,输入下面命令确认:
yolo --version如果能显示版本号,说明Ultralytics装好了。
4.2 第一次运行不是“运行”,而是权重下载问题
很多人以为装完库就能直接检测了,结果第一次运行先卡在权重下载。Ultralytics默认会自动下载预训练模型权重,比如yolo11n.pt,这个文件约6MB,不算大,但下载地址在国外,网络不稳定时经常超时。
新手最友好的做法是:提前用浏览器手动下载好权重文件,然后把它放到你执行命令的那个目录下。这样运行时只要当前目录存在这个.pt文件,就不会触发自动下载。不要把它放到乱七八糟的路径,你以后每个项目目录下放一份对应的权重文件,反而最省心。
第一次跑检测,我建议用官方示例图片:
yolo predict model=yolo11n.pt source='https://ultralytics.com/images/bus.jpg'这条命令会下载bus.jpg到内存中,跑完自动在runs/detect/predict下生成标注好的结果图。如果在线图片下载不了,就自己找一张本地照片,把source换成照片路径。
5. 用Python脚本跑通第一段检测:不只是出个框那么简单
命令行验证能出结果之后,你应该立刻转到Python脚本方式。因为之后不管是批量检测图片、处理视频还是部署到服务里,都是通过Python代码调用,命令行只是一个快速验证工具。
5.1 三行代码就能完成一次目标检测
在yolo_cpu环境里,新建一个detect.py,放在和权重文件相同的目录下,写入:
from ultralytics import YOLO model = YOLO("yolo11n.pt") results = model.predict(source="test.jpg", save=True, conf=0.3) print(results[0].boxes)这里的model.predict参数里,source是检测目标,可以是单张图片路径、文件夹路径、视频路径、摄像头设备号,甚至是图片URL;save=True表示自动保存标注结果;conf=0.3是置信度阈值,低于0.3的检测框会被过滤掉。
运行:
python detect.py第一次运行可能会看到类似这样的输出:
0: 480x640 2 persons, 1 bus, 1 traffic light, 210.3ms Speed: 3.1ms preprocess, 210.3ms inference, 1.8ms postprocess5.2 检测结果里到底装了什么
很多小白看到results[0].boxes就不知道下一步怎么处理了。简单说,results[0]代表第一张图的检测结果,.boxes对象里面最常用的几个属性:
boxes.xyxy:每个检测框的左上角x1、y1和右下角x2、y2坐标;boxes.conf:每个检测框的置信度,0到1之间;boxes.cls:每个检测框对应的类别编号。
配合默认模型自带的类别表,你就可以知道“第0类是人、第1类是自行车、第5类是公交车”等等。把这三个属性拼接到一起,就构成了最基础的检测结果数据表。
对于第一次接触目标检测的读者,我的建议是先不急着改代码,而是去runs/detect/predict文件夹里看生成的标注图。亲眼看到图上的框和类别标签,你才算真正“跑通”了YOLO。
5.3 怎么判断检测结果好还是不好
第一次结果出来,如果一张图里一个物体都没框出来,不一定是环境问题,很可能是置信度阈值设太高了。你可以把conf从0.3降到0.1再跑一次,看看能不能框出来。如果框出来了,说明目标确实存在,只是模型不太确信。
反过来说,如果框出来了一堆乱七八糟的东西,那就是置信度阈值太低。这个值就像筛子孔大小:孔太大漏掉目标,孔太小塞满垃圾,你得根据自己的实际图片微调。
5.4 视频和摄像头检测也可以直接跑
CPU上跑视频确实慢,但为了验证功能,你可以用一个小尺寸视频跑一跑:
results = model.predict(source="test.mp4", save=True, conf=0.3)Ultralytics会自动逐帧处理视频并在原视频上画框,最终生成一个带检测结果的视频文件。视频太长时间太长的话,建议先用剪辑工具截取10秒片段测试,不然CPU跑几十秒视频可能要等好几分钟。
6. 环境明明配好了,一运行就报错:我把评论区和私信里最多的问题汇总了
这一部分希望你不用全看完,遇到对应问题再跳过来找答案。但说实话,评论区里反复被问的那些报错,翻来覆去就这几种,提前扫一眼能帮你省掉很多抓狂时间。
6.1 五类最常见的报错和处理方式
| 报错信息 | 常见原因 | 解决办法 |
|---|---|---|
ModuleNotFoundError: No module named 'cv2' | opencv-python没装上 | 执行pip install opencv-python |
ModuleNotFoundError: No module named 'torch' | PyTorch没装或者装错了环境 | conda activate yolo_cpu后重装torch |
AttributeError: module 'numpy' has no attribute 'float' | numpy版本过高,与旧依赖不兼容 | 执行pip install numpy==1.26.4 |
urllib.error.URLError: <urlopen error timed out> | 权重下载超时 | 手动下载pt文件放到当前目录 |
FileNotFoundError: test.jpg doesn't exist | 图片路径写错或是在错误目录运行 | 检查当前工作目录,用绝对路径替代相对路径 |
这里面最容易阴沟翻船的是“明明装好了,运行还是报No module”。这种情况95%是因为你在命令行激活了yolo_cpu环境,但VSCode或PyCharm里选的Python解释器还是系统默认那个。IDE里的解释器不换,你命令行做得再多也没用。
6.2 一个完整的排查链路演示
举个真实场景:你执行python detect.py,报错ModuleNotFoundError: No module named 'torchvision'。不要直接顺手pip install torchvision了事,先按下面顺序排查:
第一步,确认当前环境:
conda info --envs看当前激活环境前面是否有*号,确保在yolo_cpu里。
第二步,看已装包:
pip list | findstr torchWindows下用findstr,Mac/Linux用grep。如果输出里有torch但没有torchvision,说明PyTorch安装时漏装了对应对应版本的torchvision。
第三步,检查版本是否匹配:
python -c "import torch; print(torch.__version__)"这里是2.1.2的话,torchvision应该装0.16.2版本。
pip install torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cpu这种“先定位、再重装”的链路,比盲目重装整个环境可靠得多。多数依赖问题都是版本错位导致,不是你电脑不行。
6.3 图像加载失败的隐藏原因:中文路径
另一个非常容易踩的地方是Windows系统用户名为中文,或者图片存放在带中文的路径下。OpenCV在某些版本下读取中文路径会出现imread成功但返回空数组的问题,届时Visible显示不出图,代码又不报错,非常迷惑。我的建议很简单:项目目录直接用英文,比如D:\yolo_test,图片名也用英文,不要用“测试图片.jpg”这种。
7. CPU推理提速的几条实战经验:同样的电脑,换个参数天差地别
CPU再怎么优化也追不上GPU,但“多少能跑”和“能跑得更快”之间往往只是几个参数的事。这些经验我自己在批量处理几千张图片时反复验证过,很值得提前知道。
7.1 模型优先选nano,输入尺寸别迷信640
在CPU上推理耗时最敏感的其实是模型大小。YOLO11n比YOLO11s能快一倍多,虽然精度略低,但作为入门验证用途完全够。如果你处理的是手机拍摄的普通照片,把输入尺寸从640降到416,甚至320,速度立刻翻倍,只损失少量小目标检测精度。
results = model.predict(source="test.jpg", save=True, imgsz=416, conf=0.3)imgsz参数控制的是输入到网络里的尺寸,不是输出图像尺寸。YOLO内部会把原图缩放成这个尺寸再检测。小尺寸对小目标检测不友好,但背景简单、目标较大的场景下,肉眼几乎看不出区别。
7.2 导成ONNX格式再用onnxruntime推理,CPU效率更高
这是默认状态下比较容易被忽视的一条优化路径。Ultralytics官方支持将模型导出为ONNX中间格式,然后用onnxruntime在CPU上执行。ONNX Runtime针对CPU指令集做了很多内核优化,对于Intel和AMD处理器来说,通常能比纯PyTorch CPU推理快20%~50%。
导出方法非常简单:
model = YOLO("yolo11n.pt") model.export(format="onnx", imgsz=640)生成yolo11n.onnx后,再运行推理:
yolo predict model=yolo11n.onnx source=test.jpg完全同一套命令行用法,只是把权重文件后缀从.pt换成了.onnx,就能直接用更高效率的onnxruntime跑。第一次转换前需要先装onnxruntime:
pip install onnxruntime如果你确定自己的电脑只是做离线推理、不需要训练,那么这一步可以说是无成本的白捡性能收益。
7.3 线程数不是越多越好,数据加载别开太多
CPU推理在多线程库下经常出现“开8个线程比开4个线程还慢”的怪现象。原因是线程切换、内存带宽竞争反而拖慢了计算。遇到这种情况,设置环境变量限制OpenMP线程数:
set OMP_NUM_THREADS=4另外,运行批量图片检测时,workers参数控制并行加载图片的进程数。CPU推理本来就很吃内存,workers=0反而更稳定,避免一次性加载太多图片把内存打满:
results = model.predict(source="images_folder", save=True, workers=0)我自己在批量处理几千张图片时,最常用的配置是imgsz=416, conf=0.25, workers=0。速度比默认配置提升明显,结果也基本不受影响。如果你不是做严格精度实验,这个配置可以直接拿来用。
最后说个我自己的感受。配置CPU版YOLO环境这件事,难度根本不在“YOLO”三个字母上,而在你愿不愿意把每个步骤背后的原理弄明白。我见过太多人跑通一次检测后兴奋地截图发朋友圈,但第二天换台电脑、换个目录就完全不会配了,那说明环境还没真正变成自己的东西。
按上面的步骤走一遍之后,如果你还有余力,建议自己再做一个小实验:把yolo11n.pt分别命名为a.pt和b.pt,然后分别用命令行和Python脚本检测同一张图,看看两种调用方式的结果目录有什么区别。这个实验看似简单,却能帮你彻底搞清楚Ultralytics的工作流程。等你哪天能自己回答“为什么结果图保存在runs/detect目录下”这个问题,CPU版YOLO环境配置这关,才算真正的过了。