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

基于Detectron2全景分割提取信息生成目标掩码报错求助

问题解决:Detectron2全景分割提取目标掩码报错及修复

问题背景

要复刻数据集生成流程,使用Detectron2的全景分割能力提取特定目标(狗)的掩码,但运行代码时出现NotImplementedError: <code>Instances</code> object is not iterable!错误,无法正确提取边界坐标、类别标签及生成掩码。

报错原因

代码中错误地将panoptic_output["instances"]传入draw_panoptic_seg_predictions作为segments_info参数。全景分割的输出里,panoptic_seg是包含掩码张量和segments_info(区域信息列表)的元组,而Instances对象不可迭代,无法被当作列表遍历生成区域信息映射,从而触发报错。

修复后的完整代码

import cv2
import numpy as np
from detectron2 import model_zoo
from detectron2.config import get_cfg
from detectron2.engine import DefaultPredictor
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog

width, height = 512, 512

# 加载全景分割模型
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml"))
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml")
predictor = DefaultPredictor(cfg)

# 读取并预处理图像
image = cv2.imread("dog.jpg")
image = cv2.resize(image, (width, height))
image_bgr = image.copy()  # 保留BGR格式用于后续保存
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 执行全景分割
panoptic_output = predictor(image_rgb)
panoptic_mask_tensor, segments_info = panoptic_output["panoptic_seg"]
panoptic_mask = panoptic_mask_tensor.numpy()

# 可视化预测结果
v = Visualizer(image_bgr, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
v = v.draw_panoptic_seg_predictions(panoptic_mask_tensor, segments_info)
output_image = v.get_image()
cv2.imwrite("panoptic_visualization.jpg", output_image)

# 创建目标掩码(狗,COCO类别ID为16)
mask_image = np.zeros(image.shape[:2], dtype=np.uint8)
dog_category_id = 16

# 遍历所有分割区域,提取狗的掩码
for seg in segments_info:
    if seg["category_id"] == dog_category_id:
        # 提取当前区域的掩码
        seg_mask = (panoptic_mask == seg["id"]).astype(np.uint8) * 255
        mask_image = np.maximum(mask_image, seg_mask)  # 合并多个狗的区域(如果有)

# 对掩码进行平移扩展
# 分别生成四个方向的平移掩码
mask_up = np.roll(mask_image, -10, axis=0)
mask_down = np.roll(mask_image, 10, axis=0)
mask_left = np.roll(mask_image, -10, axis=1)
mask_right = np.roll(mask_image, 10, axis=1)

# 合并所有平移后的掩码
mask_image = np.maximum.reduce([mask_image, mask_up, mask_down, mask_left, mask_right])
mask_image = np.clip(mask_image, 0, 255)

# 保存最终掩码
cv2.imwrite("dog_mask.jpg", mask_image)

关键修复点说明

  1. 正确获取全景分割输出:从panoptic_output["panoptic_seg"]中拆分出掩码张量和segments_info列表,后者包含每个分割区域的id、category_id等关键信息。
  2. 提取目标类别掩码:遍历segments_info,筛选出类别ID为16(狗)的区域,通过区域ID从全景掩码中提取对应区域,合并多个目标区域(如果图像中有多只狗)。
  3. 修正可视化调用:将正确的panoptic_mask_tensor和segments_info传入draw_panoptic_seg_predictions,避免传入不可迭代的Instances对象。
  4. 优化掩码平移逻辑:使用np.maximum.reduce合并平移后的掩码,避免原代码中叠加导致的像素值溢出问题,确保掩码边缘扩展正确。

内容的提问来源于stack exchange,提问作者Daniel Kolb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:47:41