YOLO 一次看全图、直接报【这是什么、在哪、多少把握】——老教程的 cv2.dnn+darknet 三件套已成对照文物,当下正路是 Ultralytics YOLO11:三行代码,yolo11n 在树莓派 5 上约 8~12 FPS。
11-4 用级联找【脸】这一种东西;本节升级到 COCO 80 类万物(人、车、猫、狗、手机……)。11-1 的 venv 在这里从【好习惯】升级成【必需品】——YOLO 的发动机 PyTorch 上 GB 且版本挑剔,必须隔离。10-4 的 capture_array 继续供帧;OpenCV 在本节退居【画框与显示】的配角——这正是【OpenCV+YOLO】标题的真实分工。
一、YOLO 是什么:只看一眼的全图侦探
YOLO(You Only Look Once,你只看一次)是物体检测模型家族:把整张图一次送进网络,同时输出所有目标的【框 + 类别 + 置信度】——不级联、不滑动窗口,一次前向计算全搞定。
三个入门必认概念:
- COCO 80 类:官方预训练模型认 80 种常见物体(person、car、cat、dog、bottle、cell phone……),开箱即用;要认别的东西得自己训练(另一个世界)
- 型号后缀 n/s/m/l/x:n=nano 最小最快、精度最低;x 最大最准最慢。树莓派从 yolo11n(nano)起步
- 置信度:模型对自己判断的把握(0~1);输出时按阈值过滤,0.25 是常用起点
检测 + 类别 = 比 11-4 又进一步:级联只会说【这里有个东西】,YOLO 还能说【那是个 phone,把握 0.87】。
二、换代史:老教程在干什么 vs 现在怎么干
| 老教程路线 | 当下正路(本节主线) | |
|---|---|---|
| 技术栈 | cv2.dnn 读 darknet 模型 |
Ultralytics YOLO11 |
| 模型文件 | cfg + weights + names 三件套手工下载(yolov3 时代) | yolo11n.pt 首次运行自动下载 |
| 代码量 | 百行级:blob 前处理、逐层取输出、按置信度筛框、NMS 去重、画框全手写 | 三行:建模型 → 喂帧 → results[0].plot() |
| 维护状态 | darknet 原项目已不活跃,权重停在老版本 | Ultralytics 持续更新(YOLO11 是当前主推) |
老教程没写错,只是旧:cv2.dnn.readNetFromDarknet 那套流程在原理上依然成立(OpenCV 的 dnn 模块就是【通用推理器】,能读多种框架的模型),网上资料也最多——见到时能看懂它在干什么即可,新项目别再从那条路起步。
为什么标题还叫【OpenCV+YOLO】:分工变了——OpenCV 负责【前后勤】(读图、画框、显示、视频流),YOLO 负责【动脑】(检测)。老教程里 OpenCV 连推理都包了,现在只当勤务兵,但一样不可少。
三、当下正路:三行代码跑通
装(必须先按 11-1 建好并激活 venv):
source ~/aienv/bin/activate
pip install ultralytics # 会连带装 PyTorch(上 GB,耐心等)
跑静态图片:
from ultralytics import YOLO
model = YOLO("yolo11n.pt") # 首次运行自动下载权重(约 5 MB)
results = model("test.jpg") # 推理一张图
print(results[0].boxes) # 框、类别、置信度都在这
annotated = results[0].plot() # 画好框的图(NumPy 数组,BGR)
import cv2
cv2.imwrite("test_yolo.jpg", annotated) # 无头环境:存盘验收
看懂输出:boxes 里每个目标有 xyxy(框坐标)、cls(类别号,对应 results[0].names 的 80 类名单)、conf(置信度)。plot() 把这些自动画到图上——老教程手写一百行后处理,现在一个方法。
四、动手 Demo:摄像头实时检测——三路旧知识合流
# yolo_live.py(先 source ~/aienv/bin/activate)
import cv2
from picamera2 import Picamera2
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
picam2 = Picamera2()
picam2.configure(picam2.create_video_configuration())
picam2.start()
for i in range(10): # 无头环境:跑 10 帧看结果
frame = picam2.capture_array() # 10-4:画面变数组
results = model(frame, verbose=False) # YOLO 推理这一帧
r = results[0]
for box in r.boxes:
cls = r.names[int(box.cls)] # 类别名,如 person
conf = float(box.conf) # 置信度,如 0.87
print("第", i, "帧:", cls, round(conf, 2))
if len(r.boxes) == 0:
print("第", i, "帧: 没认出东西")
picam2.stop()
看到什么算成功:对着镜头(或屏幕上的物体检素材),每帧打印【person 0.82】这类行;person 通常最容易出(COCO 里训练样本最多),手机、杯子、水壶都值得举到镜头前试试。
读结果:帧率感受一下——树莓派 5 上 yolo11n 约 8~12 FPS(720p 输入),树莓派 4 约 2~4 FPS;打印节奏明显慢于 11-4 的级联是正常的,精度涨的代价就是算力。发热明显属正常,长跑加散热(1-4 的采购单该兑现了)。
提速两条正路:① 喂小图(capture 前把配置降到 640×320,输入越小越快);② 导出 NCNN 格式(model.export(format="ncnn"),ARM 平台的加速格式,官方树莓派指南推荐)——知道有这条路,项目变大再走。
五、老教程里已失效的写法(防坑清单)
- 从 darknet 官网下 yolov3.weights 起步 —— 权重停在老时代;新项目一律
yolo11n.pt(自动下载)。 cv2.dnn百行后处理代码 —— 原理没错但已被results[0].plot()取代;看得懂旧代码即可,别抄进新项目。pip install ultralytics直接打在系统 Python —— PEP 668 拒收(6-5);必须先激活 venv。- venv 没加
--system-site-packages,跑摄像头报 picamera2 找不到 —— 11-1 埋的参数在这里兑现;漏了重建环境。 - 硬扛 1080p 全速推理 —— 输入降到 640 级别、必要时 NCNN;树莓派是【能跑】不是【畅跑】,量入为出。
六、30 秒实验:批量检测的时间账
yolo11n 在你的树莓派上单帧推理约 0.1 秒(Pi 5 实测数量级):
- 处理一段 10 分钟、30 FPS 的视频(18000 帧),纯推理要多久?
- 想做【实时检测摄像头流】,每秒最多处理几帧?剩下的帧怎么办?
参考答案:1. 18000 × 0.1 = 1800 秒 = 30 分钟——离线分析(不在乎快)可以接受。2. 每秒最多 10 帧(1 ÷ 0.1);实时流 30 FPS 喂进来只能隔帧处理(每 3 帧取 1 帧),中间帧直接跳过或沿用上次结果——【检测不必每帧都做】是树莓派实时视觉的第一生存法则。
七、常见误区
- 【YOLO 能认任何东西】 —— 预训练模型只认 COCO 80 类;要认别的得自己采集数据训练模型,不是调参数的事。
- 【照抄 cv2.dnn 老代码】 —— darknet 三件套路线已旧;新项目走 Ultralytics,老代码当【原理图】看。
- 【系统 Python 直接 pip install ultralytics】 —— PEP 668 拒收;先激活 11-1 建的环境。
- 【置信度越低越灵敏越好】 —— 阈值调太低满屏乱框(模型【瞎猜】也报);0.25 起步,按误报/漏报实况微调。
- 【树莓派跑不动 AI】 —— yolo11n 在 Pi 5 有 8~12 FPS,【有人经过】【杯子被拿走】这类判断完全够用;树莓派定位是【够用的边缘推理】,不是训练场(训练用电脑/云,部署放树莓派)。
自测三问(点开对答案)
1. 老教程的 cv2.dnn 路线和 Ultralytics 路线,本质分工有什么不同? 2. `results[0].boxes` 里一个框的三要素是什么? 3. 树莓派做实时检测,算力不够的第一招是什么? **参考答案** 1. 老路线 OpenCV 包办【推理+后处理+画框】;新路线 **YOLO 负责动脑、OpenCV 只当勤务兵**(画框显示),分工更清晰、代码更少。 2. `xyxy` 框坐标、`cls` 类别(对着 `names` 查名字)、`conf` 置信度。 3. **缩小输入分辨率**(配置降到 640 级别)——最立竿见影;再往上是 NCNN 导出与隔帧检测。- ☑ 第十一章 完结 —— 教材这一章已读完五节:用 venv 给 AI 实验圈出独立地盘、一条命令装好 OpenCV、把图认成数组练熟基本功,再用 Haar 级联完成第一个检测实验,最后以 Ultralytics YOLO11 认出 80 类万物——树莓派第一次真正【看懂】了世界
- ☑ 第十二章 AI 实验范例(二):进阶计算机视觉+AI 识别-TensorFlow+MediaPipe+CVZone —— 已完结:AI 实验范例:TensorFlow Lite+Webcam 实时物体识别(隔帧检测收官:MediaPipe 积木+LiteRT 裸接口,AI 篇【认得出】【跟得上】齐了)
11-1 圈地(venv 隔离)→ 11-2 装备(apt 一条命令)→ 11-3 学刀(图=数组,BGR 与高在前)→ 11-4 首战(级联找脸:检测不是识别)→ 11-5 升级(YOLO 认万物:三行出结果)。 树莓派至此有了眼睛(第十章)也开了眼力(本章):【拍下来】与【看明白】两头都通。 回头看 11-2 埋的那句【教材旧于系统】:安装从两小时缩到五分钟、推理从百行代码缩到三行——学的是原理,跑的是当下,这条判据以后查任何资料都用得上。 下一章按教材顺序,等波仔报标题。
相关笔记
- AI 实验范例:OpenCV 人脸识别 —— 上一节:检测思维的起点(级联版)
- 建立与管理 Python 虚拟环境 —— venv:本章地基,本节成为必需品
- Google MediaPipe 机器学习框架 —— 下一章起点:与 YOLO 分工的另一派(专精认手脸姿态)
- AI 实验范例:TensorFlow Lite+Webcam 实时物体识别 —— 章末收官:隔帧检测法则在此再落地
- 使用 Python 操作相机模块 —— capture_array:本节帧的来源
- 认识树莓派的相机模块 —— AI Camera:把检测做进传感器的另一条路
- 🍓 树莓派 · 索引 —— 全课路线图