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

YOLOv8预测结果无boxes等属性,如何获取分割多边形几何数据?

问题解答

1. 为何返回结果与文档描述差异较大?

核心原因有两个:

  • 返回值是Results对象列表而非单个对象:model.predict()默认返回一个Results对象的列表(对应每张输入图像的推理结果),你直接对整个列表操作,自然找不到boxes、masks这类属于单个Results对象的属性。
  • 潜在环境干扰(次要):如果你的Python环境中同时安装了TensorFlow和PyTorch,可能存在模型加载时的格式混淆,但你加载的是.pt格式的PyTorch模型,这种概率极低,最可能的还是第一个原因。

2. 是否需要进行转换步骤?

不需要额外的格式转换,但需要正确提取推理结果并处理掩码数据。以下是修改后的代码,包含多边形数据提取与保存逻辑:

import argparse
import cv2
import numpy as np
from pathlib import Path
from ultralytics.yolo.engine.model import YOLO    

# Parse command line arguments
parser = argparse.ArgumentParser()
parser.add_argument('--source', type=str, required=True, help='Source image directory or file')
parser.add_argument('--output', type=str, default='output', help='Output directory')
args = parser.parse_args()

# Create output directory if it doesn't exist
output_dir = Path(args.output)
output_dir.mkdir(parents=True, exist_ok=True)

# Model path
model_path = r'C:\_Projects\best_100img.pt'

# Load your model directly
model = YOLO(model_path)
model.fuse()

# Load image(s)
if Path(args.source).is_dir():
    image_paths = list(Path(args.source).rglob('*.tiff'))
else:
    image_paths = [Path(args.source)]

# Process each image
for image_path in image_paths:
    img = cv2.imread(str(image_path))
    if img is None:
        print(f"Failed to load image: {image_path}")
        continue

    # Perform inference
    predictions = model.predict(image_path, save=True, save_txt=True)
    # 提取单张图像的Results对象
    pred = predictions[0]

    # 处理分割掩码,提取多边形数据
    if pred.masks is not None:
        # 将掩码张量转为CPU上的numpy数组,形状为(掩码数量, 图像高度, 图像宽度)
        masks = pred.masks.data.cpu().numpy()
        # 获取对应目标的类别ID
        class_ids = pred.boxes.cls.cpu().numpy().astype(int)
        
        # 准备输出的TXT文件路径
        txt_path = output_dir / f"{image_path.stem}_seg.txt"
        with open(txt_path, "w", encoding="utf-8") as f:
            for idx, mask in enumerate(masks):
                # 将二值掩码转为8位灰度图,用于提取轮廓
                mask_8bit = (mask * 255).astype(np.uint8)
                # 提取掩码的外部轮廓
                contours, _ = cv2.findContours(mask_8bit, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
                
                for contour in contours:
                    # 将轮廓转为一维坐标列表(格式:x1 y1 x2 y2 ...)
                    polygon = contour.reshape(-1).tolist()
                    # 写入类别ID和多边形坐标
                    f.write(f"{class_ids[idx]} {' '.join(map(str, polygon))}\n")

print("Processing complete.")

关键步骤说明:

  • 提取Results对象:从predict()返回的列表中取第一个元素,得到对应单张图像的完整推理结果。
  • 掩码转numpy数组:将pred.masks.data从CUDA张量转为CPU上的numpy数组,方便后续处理。
  • 轮廓提取:用OpenCV的findContours从二值掩码中提取外部轮廓,这就是你需要的多边形几何数据。
  • 格式保存:将类别ID和多边形坐标按指定格式写入TXT文件。

内容的提问来源于stack exchange,提问作者Paulo Henrique PH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:43:10