ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

无GPU也能跑:CPU上使用Ultralytics运行YOLO目标检测

无GPU也能跑:CPU上使用Ultralytics运行YOLO目标检测 如果你现在手头只有一台普通办公电脑CPU 是几年前的酷睿或锐龙没有独立显卡又想跑通 YOLO 目标检测这篇文章就是写给你的。YOLO26、YOLO11、YOLOv8 都来自 Ultralytics 官方仓库它们共享同一套 Python 包、几乎一样的调用方式对 Python 3.11 的支持也比较成熟。配置好的环境下用 CPU 直接加载官方预训练权重就能完成图片检测、视频检测、文件夹批量推理不需要折腾 CUDA、cuDNN 和显卡驱动。本文不会去讲太多模型原理重点是先让你的环境“能跑”。我会从 Python 3.11 虚拟环境创建开始到安装 Ultralytics再到跑通第一次预测、对比 YOLOv8n / YOLO11n / YOLO26n 在 CPU 上的耗时最后给出批量目录处理、简单 Web API 调用示例和常见问题排查清单。全程使用 CPU操作步骤按 Windows 为主Linux 与 macOS 基本通用。1. 核心能力速览先看一张总表把关键信息一次性说清。项目类型目标检测 / 实例分割 / 姿态估计 / 图像分类取决于权重开源来源Ultralytics 官方仓库本文涉及模型YOLOv8、YOLO11、YOLO26 系列运行设备纯 CPU 可运行有 NVIDIA GPU 也可自动加速Python 版本3.10 至 3.11 兼容性最好本文使用 Python 3.11主要功能图片检测、视频检测、摄像头实时检测、批量目录检测启动方式Python 脚本、命令行 yolo 指令、Python API是否支持 API原生 Python API不内置 HTTP 服务需自行封装是否支持批量任务支持单张图片、文件夹、视频流、摄像头源批量推理适合场景入门学习、小规模检测任务、边缘端原型验证、后续接 Web 后端从这张表能看出CPU 不是 YOLO 的拦路虎。真正影响体验的通常是两个环节一是环境依赖没装对二是模型选得太大。前者靠虚拟环境解决后者按任务复杂度选择 n/s 级模型即可。2. 适用场景与使用边界CPU 跑 YOLO 什么情况下最合适在我看来有三类场景。第一类是学习验证。你刚接触目标检测想了解模型输入输出格式、推理结果如何解析这时候没必要上 GPU。n 系列模型在 640×640 输入下单张图往往只需要几十到几百毫秒完全够用。第二类是边缘端原型开发。比如在嵌入式板卡或旧电脑上先验证算法流程CPU 推理能跑通说明流程没有硬伤后续再迁移到 GPU 设备。第三类是批量任务不敏感场景。离线处理一批图片不需要实时响应CPU 慢慢跑也没有问题。但 CPU 也有明显边界。训练模型尤其是大模型不建议用 CPU。YOLO 在训练阶段涉及大量矩阵运算和梯度回传CPU 训练时间会非常久。视频实时检测同样不建议 CPU 硬扛如果视频分辨率是 1080P 且需要 30FPS 实时输出CPU 通常很难跟上应直接考虑 GPU 或专用推理设备。使用边界方面需要特别强调合规问题。YOLO 是通用目标检测模型你可以用它识别常见物体但如果要检测人脸、车辆牌照、个人影像等数据必须事先获得合法授权遵守数据隐私和肖像权相关规定。用网络图片、监控画面或他人作品做测试时不要公开发布敏感内容。本文所有示例仅用于本地技术验证请勿将检测能力用于未授权场景。3. 环境准备与前置条件开始配置前先确认三件事操作系统、Python 版本、磁盘空间。操作系统Windows 10/11 64 位最省心Linux 发行版也可以。Python建议 3.11这也是本文的基准版本。3.10 也可以3.12 在多数情况下可用但如果你想少踩坑就固定 3.11。磁盘空间安装依赖和下载官方预训练权重至少留 5GB 空间权重比较小主要是依赖包和临时文件占用空间。网络安装 pip 包和下载模型权重时需要用网络建议保证能正常访问公共软件源。如果你已经装了 Python先在终端确认版本。python --version pip --versionWindows 如果提示python 不是内部或外部命令大概率是安装时没有勾选Add Python to PATH。最简单的处理是重新运行 Python 安装包在自定义界面把Add Python to PATH勾选上然后重新打开终端。这里我建议使用虚拟环境不要直接把 YOLO 依赖装进系统全局 Python。虚拟环境可以隔离不同项目的包版本以后卸载也方便只需删除整个文件夹。创建并激活虚拟环境的命令如下。Windows PowerShell 或 CMDpython -m venv yolo_env yolo_env\Scripts\activateLinux / macOSpython3 -m venv yolo_env source yolo_env/bin/activate激活成功后终端前面会出现(yolo_env)前缀。后面所有 pip 安装命令都在这同一个终端里执行。如果你习惯用 Anaconda也可以这样创建环境。conda create -n yolo python3.11 -y conda activate yoloAnaconda 方案的好处是后续如果要在 PyCharm、Jupyter 里切换解释器直接选 conda 环境即可。两种方式二选一不需要同时用。4. 安装部署与依赖版本确认虚拟环境激活后开始安装 Ultralytics。最直接的命令是pip install ultralytics这条命令会自动安装 ultralytics 包及其依赖包括 torch、torchvision、opencv-python、numpy、matplotlib、pandas 等。如果你是纯 CPU 机器pip 装出来的 torch 在推理时默认走 CPU 路径不需要额外的显卡配置。不过有个细节值得注意。默认 PyPI 源在下载 torch 这类大体积包时可能很慢国内网络环境下经常卡在下载阶段。如果遇到下载慢可以先配置一个镜像源但这里建议分两步处理。先安装基础依赖再安装 ultralyticspip install torch torchvision pip install ultralytics如果需要指定 CPU 版 torch可以用 PyTorch 官方 CPU 索引pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu pip install ultralytics如果下载仍然很慢可以临时使用国内镜像安装 ultralyticspip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后先做一次环境自检。在终端里输入 python 进入交互模式python然后执行import torch print(torch.__version__) print(torch.cuda.is_available())CPU 机器上torch.cuda.is_available()返回 False 是正常的不表示出错。继续验证 ultralytics 是否能正常导入from ultralytics import YOLO print(YOLO.__name__)能打印出YOLO说明基础环境已经通了。如果在这个阶段就报错不要急着去跑模型先回到依赖安装环节检查版本冲突。5. 零基础首次预测用 CPU 跑通第一张图环境就绪后第一次预测从最简单的单张图片开始。找一个测试图片建议路径使用纯英文例如D:/yolo_test/test.jpg。如果你还没有测试图可以从官网文档或开源示例图库下载一张包含行人的标准测试图。在与yolo_env同级目录下新建一个 Python 文件命名为first_predict.py内容如下from ultralytics import YOLO model YOLO(yolo11n.pt) results model.predict( sourceD:/yolo_test/test.jpg, conf0.25, saveTrue, devicecpu ) print(results[0].boxes)其中yolo11n.pt是 YOLO11 的 n 系列官方预训练权重第一次执行时程序会自动从官方仓库下载权重文件。如果下载失败或速度很慢可以采用手动方式先在浏览器中打开 Ultralytics 官方发布页面下载对应名称的.pt文件放到项目目录下再把代码中的yolo11n.pt改成完整路径。这里不能省略说明如果你用的是 YOLO26就把文件名换为官方仓库中实际发布的对应权重名称例如yolo26n.pt。运行脚本python first_predict.py运行过程中会有进度条输出。检测完成后默认会在当前目录下生成runs/detect/predict子目录里面保存了绘制了检测框的结果图。打开结果图能看到目标物体被框选出来并且每个框都有类别名称和置信度分数。判断首次预测是否成功的标准有三个终端没有报错进程正常退出输出结果中能看到检测框坐标数据runs/detect/predict目录下生成了一张带框的结果图。如果结果图生成了但没有任何检测框最常见的阈值问题是置信度设得太高。可以把conf调低到 0.1 再试一次确认测试图片中是否真的包含目标物体。6. CPU 下 YOLOv8n / YOLO11n / YOLO26n 对比思路三款模型在 CPU 上哪个更适合你直接对比一下最直观。下面这段代码可以依次加载三个模型对同一张图片做预测并统计推理耗时。from ultralytics import YOLO import time configs [ (YOLOv8n, yolov8n.pt), (YOLO11n, yolo11n.pt), # 如果官方仓库给出了 YOLO26 权重把下面的文件名改成实际发布名称 (YOLO26n, yolo26n.pt), ] for name, weights in configs: model YOLO(weights) start time.perf_counter() results model.predict( sourceD:/yolo_test/test.jpg, imgsz640, conf0.25, verboseFalse, devicecpu ) elapsed time.perf_counter() - start print(f{name} 耗时{elapsed:.3f} s目标数{len(results[0].boxes)})注意这个脚本会依次下载三个权重文件磁盘空间和网络带宽都要留足。首次运行时不建议一次性跑三个先把第一个模型跑通再注释掉前两个配置单独测试后面模型。从使用经验上看选择模型时不必只盯检测精度要先看你的任务复杂度。如果只检测少数几类常见物体n 系列已经够用如果要检测小目标或者密集场景可以试试 s 系列但 CPU 推理时间会明显上升。m、l、x 系列在 CPU 上通常不划算除非你对精度要求非常高且不关心速度。另外imgsz参数对 CPU 推理速度影响很大。默认 640×640如果测试图片非常大模型会先缩放再推理。你可以在代码里手动调低到 320速度会快不少代价是远距离小目标可能漏检。实际项目中可以用一组测试图片对比imgsz320、imgsz640、imgsz1280的精度与耗时找到平衡点。7. 批量目录处理与接口 API 调用示例第一次预测跑通后下一步就是把能力接到实际业务里。Ultralytics 提供两种常用方式命令行批量推理和 Python API 批量处理。7.1 命令行批量推理如果你只是临时处理一个文件夹里的所有图片没必要写代码。激活虚拟环境后直接使用yolo命令yolo predict modelyolo11n.pt sourceD:/yolo_test/input_images saveTrue这个命令会对input_images目录下的所有图片进行检测并把结果保存到默认的runs/detect/predict目录中。命令行方式适合快速验证、临时跑批缺点是可定制性较弱。7.2 Python 批量目录处理如果需要给每张图自定义输出目录或者把检测结果汇总成 CSV、JSON就用 Python API。下面这个脚本会遍历输入目录下的所有 jpg 图片输出检测框数量和标注结果图。from pathlib import Path from ultralytics import YOLO model YOLO(yolo11n.pt) input_dir Path(D:/yolo_test/input_images) output_dir Path(D:/yolo_test/output_images) output_dir.mkdir(exist_okTrue) for img_path in input_dir.glob(*.jpg): results model.predict( sourcestr(img_path), conf0.25, saveTrue, projectstr(output_dir), namerun, exist_okTrue, devicecpu ) count len(results[0].boxes) print(f完成{img_path.name}检测到 {count} 个目标)这段代码有一个值得注意的点project和name决定了输出目录结构。连续多次运行可能产生重复目录所以加了exist_okTrue这样第二次运行会直接覆盖同名目录不会因为目录已存在而报错。如果有上百张图片建议在循环里增加日志输出和异常捕获而不是像上面这样一行 print 到底。批量任务最忌讳跑了一半崩了却不知道中断在哪张图。7.3 简单 Web API 封装Ultralytics 本身不提供 HTTP 接口但你可以用 Flask 快速封装一个检测服务把 YOLO 推理能力暴露给前端或其他后端程序。先安装 Flaskpip install flask然后创建app.pyfrom flask import Flask, request, jsonify from ultralytics import YOLO import numpy as np from PIL import Image app Flask(__name__) model YOLO(yolo11n.pt) app.post(/detect) def detect(): file request.files.get(image) if file is None: return jsonify({error: no image}), 400 image Image.open(file.stream).convert(RGB) results model.predict(sourceimage, conf0.25, devicecpu) boxes results[0].boxes.xyxy.cpu().numpy().tolist() labels [results[0].names[int(cls)] for cls in results[0].boxes.cls.cpu().numpy()] scores results[0].boxes.conf.cpu().numpy().tolist() return jsonify({boxes: boxes, labels: labels, scores: scores}) if __name__ __main__: app.run(host127.0.0.1, port8000, debugFalse)启动服务python app.py然后用 curl 测试接口curl -X POST -F imageD:/yolo_test/test.jpg http://127.0.0.1:8000/detect接口会返回检测框坐标、类别名称和置信度。这种封装方式在实际项目中非常常见前端上传图片给 Flask 后端后端调用 YOLO 推理并返回 JSON前端再渲染检测框。如果你后续要接 MySQL 保存检测结果只需要在detect函数里增加数据库写入逻辑即可。需要提醒的是Flask 自带的开发服务器只适合内网和小并发测试不能直接用在高并发生产环境。如果接口会被频繁调用建议用 Gunicorn 或 uWSGI 部署并在模型加载时做单例化避免每个请求都重复加载权重。8. 资源占用与性能观察CPU 推理时资源占用主要集中在三个地方CPU 使用率、内存使用量、磁盘和网络等待时间。观察资源占用不需要额外安装工具。Windows 下打开任务管理器找到 Python 进程就能实时看到 CPU 和内存变化。推理过程中 CPU 使用率会明显上升推理结束后回落这是正常现象。如果内存持续暴涨通常是测试图片分辨率太大或批量推理时把多个大图同时加载进了内存。代码层面可以用time模块记录推理耗时前面已经演示过了。更细致的做法是分别记录“模型加载时间”和“单张图片推理时间”两者不能混为一谈。模型加载只需要一次后续推理时间才是真正影响业务体验的部分。举一个极端情况如果你在循环里反复调用YOLO(yolo11n.pt)每次循环都会重新加载权重耗时会成倍增加。正确做法是把模型加载放在循环外面。如果你想更严谨地评估 CPU 性能建议写一个压力测试脚本固定同一张图片分别设置imgsz320、imgsz640、imgsz1280每个参数跑 10 次取平均值。这样能大致摸清自己的 CPU 在哪个分辨率区间表现最好。另外conf阈值不会明显影响推理速度只影响最终输出的目标数量所以调阈值不能作为提速手段。CPU 上不要使用halfTrue因为大多数 CPU 对半精度浮点的加速并不明显甚至可能因为不支持而报错。保持默认的 FP32 精度即可。9. 常见问题与排查方法零基础配置 YOLO 会遇到不少问题这里整理一份高频排查清单。问题现象可能原因排查方式解决方案python 不是内部或外部命令Python 未加入 PATH重新运行安装包勾选 Add Python to PATH重新打开终端后验证python --versionpip 安装超时或较慢默认软件源下载缓慢观察终端卡在哪个包使用国内镜像源或分段安装依赖模型权重下载失败网络无法访问官方下载地址终端卡在Downloading阶段手动下载 .pt 文件后改用本地路径torch.cuda.is_available()返回 False机器没有 NVIDIA GPU或没有安装 CUDA 驱动确认是否真的需要 GPUCPU 推理不依赖该返回值直接忽略OMP: Error #15OpenMP 运行时库冲突查看完整错误信息安装系统级 libomp或设置环境变量KMP_DUPLICATE_LIB_OKTRUE检测结果为空阈值过高或目标太小将 conf 调低到 0.1 测试调低阈值或调高 imgsz 重新推理中文路径读取失败图片路径含中文或特殊字符用Path.exists()检查路径统一使用纯英文目录视频检测卡顿严重CPU 处理速度跟不上视频帧率观察视频 FPS 输出降低 imgsz、跳帧处理或改用 GPU端口被占用Flask 8000 端口已被其他服务占用netstat -anofindstr 800010. 最佳实践与使用建议最后给几条工程建议能帮你少走弯路。第一固定的虚拟环境是底线。不管用 venv 还是 conda都不要把 YOLO 装到系统全局 Python。项目迁移时只需要重建环境重新安装依赖不用全局变量搅在一起。第二显式指定devicecpu或device0。即使在 CPU 机器上不写这个参数也能跑通但代码一旦换到有 GPU 的机器行为可能不符合预期。在推理代码中显式指定设备能让日志和输出更具可预测性。第三官方权重文件、图片输入、检测输出分目录存放。建议项目结构如下yolo_project/ ├── weights/ │ └── yolo11n.pt ├── input_images/ ├── output_images/ ├── scripts/ │ └── predict_batch.py └── yolo_env/第四批量任务一定要加日志。如果你一次跑 1000 张图片建议把每张图的文件名、耗时、检测数量写入 CSV 或日志文件而不是只 print 到终端。这样任务中断后能快速定位到具体位置。第五接口服务要限制访问范围。Web API 默认只绑定127.0.0.1不要改成0.0.0.0就顺手发到公网。如果你部署在云服务器上还需要配合鉴权、限流和访问白名单避免 YOLO 服务被当成免费检测接口滥用。第六涉及到人脸、车辆、个人数据等敏感检测场景必须先确认授权和隐私边界。无论是训练自己的数据还是部署到业务系统都要遵守相关法律法规不要在未授权场景下用目标检测能力采集或处理他人数据。最后建议先用一张测试图跑通最小流程再逐步增加批量、视频和 API 能力。后续你可以继续探索的方向包括用同一套环境做自定义数据集训练、把模型导出为 ONNX 后用 OpenCV 推理、或者结合 Flask 和 MySQL 做完整的检测记录系统。先把这篇里的环境配置和首次预测跑通剩下的大多数问题都能靠日志定位解决。建议收藏备用遇到配置问题回来对照排查表。
返回列表