基于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)
关键修复点说明
- 正确获取全景分割输出:从
panoptic_output["panoptic_seg"]中拆分出掩码张量和segments_info列表,后者包含每个分割区域的id、category_id等关键信息。 - 提取目标类别掩码:遍历
segments_info,筛选出类别ID为16(狗)的区域,通过区域ID从全景掩码中提取对应区域,合并多个目标区域(如果图像中有多只狗)。 - 修正可视化调用:将正确的
panoptic_mask_tensor和segments_info传入draw_panoptic_seg_predictions,避免传入不可迭代的Instances对象。 - 优化掩码平移逻辑:使用
np.maximum.reduce合并平移后的掩码,避免原代码中叠加导致的像素值溢出问题,确保掩码边缘扩展正确。
内容的提问来源于stack exchange,提问作者Daniel Kolb
相关产品推荐
相关产品推荐

