☰
CPU跑YOLO目标检测:从零搭建环境与推理提速实战手册
2026/10/3 3:06:25 网站建设 项目流程

先说个会劝退新人的现实: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 -y

yolo_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 postprocess

5.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 torch

Windows下用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环境配置这关,才算真正的过了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询