树莓派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
相关产品推荐
相关产品推荐

