如何配置默认YOLOv8模型仅识别指定的5类目标?
如何配置默认YOLOv8模型仅识别指定的5类目标?
嗨,这个需求其实挺常见的~用默认的YOLOv8m.pt预训练模型只检测你需要的5类目标,有两种实用方法,我给你一步步讲清楚:
方法一:推理阶段直接过滤检测结果(最简单,无需修改模型)
这种方法不用改动预训练模型本身,直接在推理的时候筛选出你需要的类别结果,上手最快。
首先确保你安装了ultralytics库(YOLOv8的官方实现),如果没装的话先执行:
pip install ultralytics
接下来写代码实现,假设你要检测的5类是person、car、dog、cat、bicycle,对应的COCO数据集类别ID是0、2、16、17、1(你需要根据自己的需求替换成目标类别的ID):
from ultralytics import YOLO # 加载默认的yolov8m.pt预训练模型 model = YOLO('yolov8m.pt') # 定义你要检测的目标类别ID列表 target_classes = [0, 2, 16, 17, 1] # 方式1:推理时直接指定classes参数,模型只会输出这些类别的检测结果 results = model('your_image.jpg', classes=target_classes) # 方式2:推理后手动过滤结果(适合需要灵活处理结果的场景) # results = model('your_image.jpg') # for result in results: # # 筛选出属于目标类别的检测框 # filtered_boxes = result.boxes[result.boxes.cls.isin(target_classes)] # # 更新结果中的检测框为过滤后的内容 # result.boxes = filtered_boxes # # 保存过滤后的结果图片 # result.save(filename='filtered_result.jpg') # 可视化检测结果 results[0].show()
小提示:如果你是检测视频或者实时摄像头流,只需要把'your_image.jpg'换成视频路径或者摄像头ID(比如0对应电脑默认摄像头)就行。
方法二:修改模型输出层并重导出(适合部署,追求更高效率)
如果你的场景需要部署模型(比如边缘设备),想要减少模型的计算量,那就可以修改模型的输出层,让它直接只输出你需要的5类结果,不用额外过滤。
步骤如下:
from ultralytics import YOLO # 加载默认模型 model = YOLO('yolov8m.pt') # 查看原模型的输出层(YOLOv8的输出层是最后一个Detect模块) print(model.model[-1]) # 修改输出层的类别数量为5 model.model[-1].nc = 5 # 同步更新模型的类别名称列表,对应你要检测的5类 model.names = ['person', 'car', 'dog', 'cat', 'bicycle'] # 导出修改后的模型(可以选择pt、onnx等格式,按需选择) model.export(format='onnx') # 导出为ONNX格式适合部署到多数框架 # 或者导出为PyTorch格式:model.export(format='pt')
修改后的模型只会输出你指定的5类目标,推理时不需要再做过滤,效率更高。不过要注意,修改后的模型只能检测这5类,之后如果需要检测其他类别,得重新用原始的yolov8m.pt模型。
注意:一定要确认目标类别对应的COCO ID正确,你可以提前查COCO数据集的类别-ID对应表,避免搞错哦~
备注:内容来源于stack exchange,提问作者anbvy




