🍓 第十一章 AI 实验范例(一):计算机视觉+AI 识别-OpenCV+YOLO
📄 一句话概括

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,你只看一次)是物体检测模型家族:把整张图一次送进网络,同时输出所有目标的【框 + 类别 + 置信度】——不级联、不滑动窗口,一次前向计算全搞定。

三个入门必认概念:

检测 + 类别 = 比 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 平台的加速格式,官方树莓派指南推荐)——知道有这条路,项目变大再走。

五、老教程里已失效的写法(防坑清单)

  1. 从 darknet 官网下 yolov3.weights 起步 —— 权重停在老时代;新项目一律 yolo11n.pt(自动下载)。
  2. cv2.dnn 百行后处理代码 —— 原理没错但已被 results[0].plot() 取代;看得懂旧代码即可,别抄进新项目。
  3. pip install ultralytics 直接打在系统 Python —— PEP 668 拒收(6-5);必须先激活 venv。
  4. venv 没加 --system-site-packages,跑摄像头报 picamera2 找不到 —— 11-1 埋的参数在这里兑现;漏了重建环境。
  5. 硬扛 1080p 全速推理 —— 输入降到 640 级别、必要时 NCNN;树莓派是【能跑】不是【畅跑】,量入为出。

六、30 秒实验:批量检测的时间账

yolo11n 在你的树莓派上单帧推理约 0.1 秒(Pi 5 实测数量级):

  1. 处理一段 10 分钟、30 FPS 的视频(18000 帧),纯推理要多久?
  2. 想做【实时检测摄像头流】,每秒最多处理几帧?剩下的帧怎么办?

参考答案:1. 18000 × 0.1 = 1800 秒 = 30 分钟——离线分析(不在乎快)可以接受。2. 每秒最多 10 帧(1 ÷ 0.1);实时流 30 FPS 喂进来只能隔帧处理(每 3 帧取 1 帧),中间帧直接跳过或沿用上次结果——【检测不必每帧都做】是树莓派实时视觉的第一生存法则。

七、常见误区

  1. 【YOLO 能认任何东西】 —— 预训练模型只认 COCO 80 类;要认别的得自己采集数据训练模型,不是调参数的事。
  2. 【照抄 cv2.dnn 老代码】 —— darknet 三件套路线已旧;新项目走 Ultralytics,老代码当【原理图】看。
  3. 【系统 Python 直接 pip install ultralytics】 —— PEP 668 拒收;先激活 11-1 建的环境。
  4. 【置信度越低越灵敏越好】 —— 阈值调太低满屏乱框(模型【瞎猜】也报);0.25 起步,按误报/漏报实况微调。
  5. 【树莓派跑不动 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 导出与隔帧检测。
📄 第十一章读完了,回头看这条线

11-1 圈地(venv 隔离)→ 11-2 装备(apt 一条命令)→ 11-3 学刀(图=数组,BGR 与高在前)→ 11-4 首战(级联找脸:检测不是识别)→ 11-5 升级(YOLO 认万物:三行出结果)。 树莓派至此有了眼睛(第十章)也开了眼力(本章):【拍下来】与【看明白】两头都通。 回头看 11-2 埋的那句【教材旧于系统】:安装从两小时缩到五分钟、推理从百行代码缩到三行——学的是原理,跑的是当下,这条判据以后查任何资料都用得上。 下一章按教材顺序,等波仔报标题。

相关笔记