如何基于Mask-RCNN生成的掩码裁剪所有检测到的实例对象
实例分割多目标裁剪调整方法
你使用的实例分割框架返回的r2['masks']是形状为(图像高度, 图像宽度, 实例数量)的三维数组,最后一维对应所有检测到的实例的二值掩码,仅裁剪出单个目标的核心原因是没有遍历最后一维的所有实例,仅读取了索引为0的第一个掩码。
完整修改代码示例
import numpy as np import cv2 # 原有检测逻辑保持不变 image2 = mpimg.imread(path_to_new_image) results = model.detect([image2], verbose=1) r2 = results[0] # 新增遍历所有实例的裁剪逻辑 masks = r2['masks'] rois = r2['rois'] # 每个实例对应边界框,格式为[y1, x1, y2, x2] instance_count = masks.shape[-1] # 读取检测到的实例总数 all_cropped = [] for i in range(instance_count): # 取出当前实例的掩码和边界框 single_mask = masks[:, :, i].astype(np.uint8) y1, x1, y2, x2 = rois[i] # 掩码抠图:仅保留实例区域,其他区域置为黑色 masked_img = cv2.bitwise_and(image2, image2, mask=single_mask) # 按边界框裁剪,去除冗余背景 cropped_instance = masked_img[y1:y2, x1:x2] all_cropped.append(cropped_instance) # 若需保存到本地,可添加以下代码 # cv2.imwrite(f"实例_{i+1}.png", cropped_instance[...,::-1])
常见异常排查
- 若运行后依然只输出单个实例,先打印
instance_count确认数值,如果数值为1,说明检测环节仅识别到一个实例,可下调检测置信度阈值,修改配置中DETECTION_MIN_CONFIDENCE参数(默认值为0.7)到0.5或更低即可。 - 处理掩码时不要直接对三维
masks数组做运算,否则会默认取第一个通道的掩码,仅输出第一个实例的裁剪结果。
内容的提问来源于stack exchange,提问作者user17260797
相关产品推荐
相关产品推荐

