7.3 Python 节点接入 YOLO
摄像头就位后,下一步是让小莫"看懂"画面中的内容。本节我们自己写一个 Python 节点来调用 YOLO——用 ultralytics 库直接加载 YOLOv8 模型,在数据流中做实时物体检测。
学习目标
学完本节,你将能够:
- 安装并加载 YOLOv8 模型
- 写一个 Python 节点接收图像、调用 YOLO 检测、输出结果
- 理解 YOLO 检测结果的结构化数据格式(边界框)
- 用
pyarrow创建 StructArray 发送结构化数据
前置要求
- 完成 7.2 图像在数据流中传递,理解图像的发送和接收
- 有可用的摄像头(如无可使用图片文件替代)
- 安装了 Python 依赖:
ultralytics、opencv-python、pyarrow
准备工作:安装依赖
安装 ultralytics
ultralytics 是一个开源的计算机视觉库,提供了 YOLOv8 模型的加载和推理接口。
首次运行时会自动下载 yolov8n.pt 模型文件(约 6MB),保存在 ~/.cache/ultralytics/ 目录下。如果网络慢,可以手动下载并放到该目录。
直接调用 YOLO 的节点
我们写一个 Python 节点,它接收 image 输入(摄像头画面)、调用 YOLO 推理、输出 bbox(检测到的物体列表)。
新建 yolo_node.py:
代码详解
加载模型:
"yolov8n.pt" 是预训练模型文件名。n 表示 nano(最小版本),约 6MB,CPU 上每秒可处理 10-30 帧。也可替换为 yolov8s.pt(small,精度更高但更慢)。
执行推理:
frame 是 NumPy 数组(形状 H×W×3),verbose=False 关闭控制台输出。返回一个 Results 对象列表(每张图一个结果,这里只有一张)。
解析结果:
每个 box 包含:
发送 StructArray:
detections 是一个字典列表,pa.array(detections) 会自动转换为 Arrow StructArray——每个字典的键成为字段名,值成为字段值。接收方用 .to_pylist() 可以一键转回字典列表。
连接摄像头和 YOLO 节点
dataflow.yml:
消费检测结果:打印识别内容
新建 detection_printer.py:
完整数据流
运行:
将摄像头对准人或物体:
按 Ctrl+C 停止。
动手练习
改造 yolo_node.py,在 detections 列表添加之前过滤掉置信度低于 0.8 的检测结果。
参考答案
常见问题 FAQ
ModuleNotFoundError: No module named 'ultralytics'
未安装 ultralytics 库。执行 uv pip install ultralytics。
YOLOv8n 在 CPU 上每帧约 50-200ms。如果觉得慢,可以降低摄像头帧率到 millis/100(约 10fps),或使用更低分辨率。
YOLOv8n 首次运行时自动从 GitHub Releases 下载。如果网络慢,可手动下载 yolov8n.pt:https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt,放到 ~/.cache/ultralytics/。
小结
- 用
ultralytics.YOLO("yolov8n.pt")直接加载 YOLO 模型进行推理。 - 检测结果包含边界框(
xywh)、置信度(conf)、类别(cls)。 - 用
pa.array(detections)将字典列表转为 Arrow StructArray 发送。 - 接收方用
.to_pylist()转回字典列表。
下一节是本章实战——把摄像头、YOLO 检测、结果绘制串成一条完整的实时视觉流水线。