如何在YOLOv8代码中获取检测到的目标对象?
如何在YOLOv8代码中获取检测到的目标对象?
嘿,我来帮你搞定这个问题!你现在用的是YOLOv8的追踪功能,其实results变量里已经藏着所有检测/追踪到的目标信息了,只是你还没把它提取出来而已~
你当前的代码里,model.track()返回的results是包含每帧检测结果的对象集合,咱们可以直接从里面提取目标的各类信息,比如追踪ID、类别、置信度、坐标这些。下面给你调整代码,顺便讲讲怎么用:
from ultralytics import YOLO model = YOLO("/media/aceryohan/_Yohan/Pycharm projects/myfirstproject/computer vision/best.pt") # 用stream=True开启逐帧处理,适配实时摄像头的场景 for result in model.track(source=2, show=True, tracker="bytetrack.yaml", stream=True): # 先判断当前帧是否检测到目标(且开启追踪后有track_id) if result.boxes.id is not None: # 把GPU上的张量转到CPU,再转成numpy数组方便后续处理 track_ids = result.boxes.id.cpu().numpy().astype(int) class_ids = result.boxes.cls.cpu().numpy().astype(int) confidences = result.boxes.conf.cpu().numpy() # xyxy格式是左上角+右下角坐标,需要中心坐标+宽高的话可以用xywh boxes = result.boxes.xyxy.cpu().numpy() # 逐个遍历目标,输出详细信息 for track_id, class_id, conf, box in zip(track_ids, class_ids, confidences, boxes): # 通过类别ID获取对应的类别名称 class_name = result.names[class_id] print(f"追踪ID: {track_id}, 类别: {class_name}, 置信度: {conf:.2f}, 坐标: {box}") else: # 没检测到目标时的提示(可选) print("当前帧未检测到目标")
给你划几个关键细节:
- 加
stream=True:这样能逐帧处理摄像头画面,而不是只返回最后一帧的结果,更适合实时场景 result.boxes是核心:里面包含所有检测框的关键数据——id是追踪ID(仅track模式有),cls是类别ID,conf是置信度,xyxy是坐标.cpu()的作用:YOLOv8默认用GPU计算,张量存在GPU内存里,得转到CPU才能转成numpy数组方便后续操作- 如果不需要追踪,只是单纯检测目标:去掉
tracker参数,忽略track_ids部分即可,其他提取逻辑完全通用
这样你就能拿到每个检测目标的详细信息,不管是存数据还是做后续处理都没问题~
备注:内容来源于stack exchange,提问作者ubuntu_is_life




