目的:如何做障碍物模型。
开集障碍物模型
开集障碍物模型 (Open-Set Obstacle Model),核心是让感知系统既能识别训练时见过的已知障碍物 (如车、人、锥桶),也能检测 / 告警训练时未定义的未知障碍物 (如掉落的纸箱、翻倒的共享单车、破损井盖),本质是分布外检测 (OOD) 与开放世界感知问题。
OOD 检测(Out-of-Distribution Detection,分布外检测);
效果:
YOLO 的 OOD(Out-of-Distribution)检测本身通常不能告诉你"这个未知障碍物具体是什么",它只能判断"这不是我训练时见过的任何类别"。
基于文本提示的开集检测:
from ultralytics import YOLOWorld
import os
# 检查图像是否存在
#img_path = '/Users/wangfeng/Downloads/1767196111.600000_1767196111.561000.webp'
img_path = '/Users/wangfeng/Downloads/dog1.webp'
if not os.path.exists(img_path):
raise FileNotFoundError(f"Image not found: {img_path}")
# 加载模型(注意:yolov8s-worldv2.pt 是正确的名称)
model = YOLOWorld('yolov8s-worldv2.pt')
# 定义你的提示词列表(顺序即类别ID)
custom_classes = ['car', 'dog', 'person', 'bicycle', 'cone', 'truck', 'unknown obstacle', 'road debris', 'fallen object']
model.set_classes(custom_classes)
# 推理
results = model(img_path, conf=0.3, imgsz=640)
# 分离已知和未知
known_set = {'car', 'person', 'bicycle', 'cone', 'truck', 'dog'} # 使用 set 提升查找效率
known_dets = []
unknown_dets = []
for box in results[0].boxes:
cls_id = int(box.cls.item()) # 获取类别索引
if cls_id >= len(custom_classes):
continue # 防御性处理(理论上不会发生)
cls_name = custom_classes[cls_id] # 正确获取类别名
bbox = box.xyxy.cpu().numpy()[0]
if cls_name in known_set:
known_dets.append((cls_name, bbox))
else:
unknown_dets.append((cls_name, bbox))
# 打印结果
print(f"已知物体: {len(known_dets)} 个")
for name, bbox in known_dets:
print(f" - {name}: {bbox}")
print(f"未知障碍物: {len(unknown_dets)} 个")
for name, bbox in unknown_dets:
print(f" - {name}: {bbox}")
# 可视化(会显示所有检测框,包括 unknown obstacle 等)
results[0].show()
输出结果:

