You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:55:15