如何用YOLOv8模型仅裁剪图像中Person类的边界框?
解决YOLOv8仅裁剪Person类边界框的问题
要实现只裁剪Person类的边界框,核心是过滤出Person类的检测结果,再对原图进行区域裁剪。以下是两种可行的实现方式:
方式一:预测时直接指定仅检测Person类
这种方式会让模型只输出Person类的检测结果,减少后续过滤步骤:
from ultralytics import YOLO import cv2 # 加载训练好的模型 model = YOLO('models/best.pt') # 查看模型的类别列表,确认Person对应的索引(比如COCO数据集里Person的ID是0) print("模型类别列表:", model.names) person_class_id = 0 # 根据实际输出的类别列表修改 # 预测时指定仅检测Person类 results = model.predict(frames[0], classes=[person_class_id]) # 遍历检测结果,裁剪Person区域 for result in results: # 获取Person类的边界框坐标(xyxy格式:x1, y1, x2, y2) person_boxes = result.boxes.xyxy.cpu().numpy() # 逐个裁剪并保存/处理 for idx, box in enumerate(person_boxes): x1, y1, x2, y2 = map(int, box) # 从原图中裁剪Person区域(注意图像索引是[y1:y2, x1:x2],对应高和宽) cropped_person = frames[0][y1:y2, x1:x2] # 保存裁剪后的图像 cv2.imwrite(f'cropped_person_{idx}.jpg', cropped_person)
方式二:预测后过滤Person类检测框
如果需要保留所有类的检测结果,但只裁剪Person类,用这种方式:
from ultralytics import YOLO import cv2 model = YOLO('models/best.pt') # 正常预测所有类别 results = model.predict(frames[0]) # 确认Person的类别ID person_class_id = 0 # 根据model.names的输出调整 for result in results: # 获取所有检测框的坐标和对应类别ID all_boxes = result.boxes.xyxy.cpu().numpy() all_cls_ids = result.boxes.cls.cpu().numpy() # 过滤出Person类的边界框 person_boxes = all_boxes[all_cls_ids == person_class_id] # 裁剪每个Person区域 for idx, box in enumerate(person_boxes): x1, y1, x2, y2 = map(int, box) cropped_person = frames[0][y1:y2, x1:x2] cv2.imwrite(f'person_{idx}.jpg', cropped_person)
关键注意事项
- 必须通过
model.names确认Person对应的类别ID,自定义训练的模型类别索引可能和COCO数据集不同 - 边界框坐标
xyxy是左上角(x1,y1)到右下角(x2,y2)的数值,转换为整数后才能用于图像裁剪 - 图像裁剪时的索引顺序是
[y1:y2, x1:x2],因为OpenCV/PIL的图像格式是高度(行)在前,宽度(列)在后
内容的提问来源于stack exchange,提问作者Ahsen Khan
相关产品推荐
相关产品推荐

