如何在YOLOv8中筛选置信度50%以上的交通灯检测结果
解决YOLOv8筛选置信度>50%的交通灯检测结果问题
方法1:推理时直接设置置信度阈值(最简单)
YOLOv8的model()推理方法支持直接传入conf参数,自动过滤置信度低于阈值的检测结果,无需手动处理:
修改推理行代码如下:
results = model(frame, conf=0.5) # conf=0.5表示只保留置信度≥50%的结果
之后调用r.plot()时,只会绘制符合阈值要求的检测框和分类标签。
方法2:手动获取置信度并筛选(适合自定义逻辑)
如果需要更灵活的处理(比如同时获取分类名称、置信度做额外逻辑),可以遍历检测框的属性,手动筛选:
修改循环内的代码:
for r in results: # 筛选置信度>0.5的检测框 valid_boxes = r.boxes[r.boxes.conf > 0.5] # 绘制符合条件的框到帧上 frame = r.plot(boxes=valid_boxes) # 可选:打印符合条件的检测详情 for box in valid_boxes: # 从张量中提取置信度和类别信息 conf_score = box.conf.item() # 转换为Python浮点数 cls_index = box.cls.item() cls_name = r.names[cls_index] # 根据类别索引获取颜色名称(red/green/yellow/off) print(f"交通灯颜色:{cls_name},置信度:{conf_score:.2f}")
完整修改后的脚本
import cv2 from ultralytics import YOLO # Load a pretrained YOLOv8n model model = YOLO('/Models/best_traffic_nano_yolo.pt') # open a video file or start a video stream cap = cv2.VideoCapture(0) # replace with 0 for webcam while cap.isOpened(): # Capture frame-by-frame ret, frame = cap.read() if not ret: break # flip the image # frame = cv2.flip(frame, -1) # Run inference with confidence threshold results = model(frame, conf=0.5) # 直接设置置信度阈值为0.5 for r in results: # 若需要手动筛选,替换为方法2的代码 frame = r.plot() # Display the resulting frame cv2.imshow('frame', frame) # Press 'q' on keyboard to exit if cv2.waitKey(1) & 0xFF == ord('q'): break # After the loop release the cap object and destroy all windows cap.release() cv2.destroyAllWindows()
关键属性说明
r.boxes.conf:每个检测框的置信度张量(需用.item()转换为普通浮点数)r.boxes.cls:每个检测框的类别索引张量r.names:模型的类别名称字典,对应你的[red,green,yellow,off]标签
内容的提问来源于stack exchange,提问作者Stephan Yazvinski
相关产品推荐
相关产品推荐

