Keras语义分割数据增强生成全黑掩码问题排查
语义分割数据增强输出全黑掩码问题排查
我在使用Keras开展语义分割任务时,需要对图像与对应掩码同步执行数据增强。所用输入掩码为黑白格式,但增强后输出的掩码完全为黑色,无法定位代码问题,现提出两点疑问:
- 若处理的掩码为黑白格式,使用
cv2.IMREAD_GRAYSCALE参数读取是否正确? - 哪些原因会导致增强后输出全黑掩码?
示例素材
- 输入图像:

- 输出异常掩码:

复现代码
img_augmented_path = PATH+'\\new_data\images' mask_augmented_path = PATH+'\\new_data\masks' aug = A.Compose([ A.VerticalFlip(p=0.5), A.HorizontalFlip(p=0.5), ]) i = 1 random.seed = 42 while i < 5: number = random.randint(0, len(imageset)-1) image = imageset[number] mask = maskset[number] print(image,mask) org_image = cv2.cvtColor(cv2.imread(image), cv2.COLOR_BGR2RGB) org_mask = cv2.imread(mask, cv2.IMREAD_GRAYSCALE) agumented = aug(image=org_image, mask=org_mask) transformed_image = augmented['image'] transformed_mask = augmented['mask'] new_image_path = '%s\\augemented_image_%s.png'%(img_augmented_path,i) new_mask_path = '%s\\augemented_mask_%s.png'%(mask_augmented_path,i) io.imsave(new_image_path,transformed_image) io.imsave(new_mask_path,transformed_mask) i = i+1
问题解答
1. 灰度模式读取黑白掩码的正确性
该读取方式完全正确。黑白二值掩码属于单通道图像,像素值仅包含0(黑色,对应背景)、255(白色,对应前景)两类,使用cv2.IMREAD_GRAYSCALE读取会直接返回shape为(H,W)的单通道数组,完全匹配语义分割任务的掩码输入格式,无需额外转换为RGB/BGR三通道格式。
2. 输出全黑掩码的常见原因
结合代码,有3个直接/间接导致问题的点:
- 核心错误:变量名拼写不一致:调用增强pipeline返回值时写的变量名是
agumented(正确拼写为augmented,漏写了字母n),但后续提取增强结果时调用的是augmented字典。如果之前运行代码时内存中残留了其他全0/全黑值的augmented变量,代码不会触发NameError报错,会直接读取旧的全黑数据保存,最终得到全黑掩码。 - 次要错误:随机种子设置失效:
random.seed是函数,固定种子的正确写法为random.seed(42),现有写法是将seed函数直接赋值为整数42,完全没有起到固定随机结果的作用,该问题不会直接导致全黑掩码,但会让增强结果无法复现。 - 隐性保存坑:数值范围/类型不匹配:如果读取的掩码在流程中被意外归一化到0-1浮点范围,直接调用
io.imsave保存时,会将所有小于1的像素值识别为0(黑色),最终输出全黑图。保存前可打印transformed_mask.min()、transformed_mask.max()和transformed_mask.dtype确认:正常掩码应为uint8类型,数值范围在0-255区间,如果是0-1浮点范围,需要先乘255再转uint8类型后保存。
修复顺序:先统一增强返回值的变量名拼写,修正随机种子写法,保存掩码前校验数组类型和数值范围,即可解决全黑问题。
内容的提问来源于stack exchange,提问作者dspeanut
相关产品推荐
相关产品推荐

