You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4运行YOLOv8目标检测代码报'generator'无'boxes'属性错误求助

问题解决:AttributeError: 'generator' object has no attribute 'boxes'

错误原因

你调用model(frame, show=True, stream=True)时使用了stream=True参数,这会让YOLO模型返回一个生成器对象,而supervision的Detections.from_ultralytics()方法需要接收的是Ultralytics库的Results实例,不是生成器,因此触发了该属性错误。

解决方案

有两种可行的修复方式,根据需求选择:

方式1:移除stream=True参数(推荐单帧场景)

单帧处理时不需要启用流式模式,直接去掉该参数,让模型返回单个Results对象:

修改后的核心代码段:

while True:
    ret, frame = cap.read()
    # 移除stream=True参数
    results = model(frame, show=True)
    
    detections = sv.Detections.from_ultralytics(results)
    # 后续代码保持不变

方式2:遍历生成器获取结果(保留流式模式)

如果需要保留stream=True,需要从生成器中取出实际的Results对象(单帧场景下用next()即可):

修改后的核心代码段:

while True:
    ret, frame = cap.read()
    results = model(frame, show=True, stream=True)
    # 从生成器中取出Results对象
    result = next(results)
    
    detections = sv.Detections.from_ultralytics(result)
    # 后续代码保持不变

完整修复后的代码(方式1示例)

import cv2
from ultralytics import YOLO
import argparse
import supervision as sv

def parse_argument() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description="YOLOv8 Live")
    parser.add_argument(
        "--webcam-resolution",
        default=[1280, 720],
        nargs=2, type=int
    )
    args = parser.parse_args()
    return args

def main():
    args = parse_argument()
    frame_width, frame_height = args.webcam_resolution

    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)
    model = YOLO("yolov8n.pt")
    
    box_annotator = sv.BoxAnnotator(
        thickness=2,
        text_thickness=2,
        text_scale=1
    )

    while True:
        ret, frame = cap.read()
        # 移除stream=True,返回单个Results对象
        results = model(frame, show=True)
        
        detections = sv.Detections.from_ultralytics(results)
        labels = [
            f"{model.model.names[class_id]} {confidence:0.2f}"
            for _, confidence, class_id, _
            in detections
        ]        
        frame = box_annotator.annotate(
            scene=frame,
            detections=detections,
            labels=labels
        )
        
        cv2.imshow("Object Detection and Tracking", frame)
        
        if cv2.waitKey(30) == 27:
            break

main()

内容的提问来源于stack exchange,提问作者Eme Obioh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:27:45