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

语义分割训练:如何下采样One-Hot编码真值标签并保持0/1值?

语义分割独热标签下采样解决方案(保持0/1离散值)

针对你的独热编码分割标签(3通道,每个通道仅含0/1)下采样需求,必须使用最近邻插值——它直接复制原图像中最近的像素值,不会生成中间过渡值,完美保证输出仅含0和1。以下是不同库的实现方案:

OpenCV 实现

OpenCV默认resize用双线性插值,需手动指定INTER_NEAREST,同时注意通道格式转换(OpenCV默认(H,W,C),你的标签是(C,H,W)):

import cv2
import numpy as np

# 示例输入:shape (3, 512, 512)的独热标签
label = np.random.randint(0, 2, size=(3, 512, 512)).astype(np.uint8)

# 转置为OpenCV兼容的(H, W, C)格式
label_cv = label.transpose(1, 2, 0)
# 下采样至256×256,指定最近邻插值
downsampled_cv = cv2.resize(label_cv, (256, 256), interpolation=cv2.INTER_NEAREST)
# 转回原(C, H, W)格式
downsampled_label = downsampled_cv.transpose(2, 0, 1)

# 验证输出值范围
print(np.unique(downsampled_label))  # 输出:[0 1]

NumPy 实现

针对2倍整数倍下采样,直接通过切片取原图像步长为2的像素,本质是最近邻插值的高效简化实现:

import numpy as np

# 示例输入:shape (3, 512, 512)的独热标签
label = np.random.randint(0, 2, size=(3, 512, 512)).astype(np.uint8)

# 下采样2倍:沿高度和宽度维度每隔1个像素取点
downsampled_label = label[:, ::2, ::2]

print(downsampled_label.shape)  # 输出:(3, 256, 256)
print(np.unique(downsampled_label))  # 输出:[0 1]

注:此方法仅适用于整数倍下采样,若需任意倍数下采样,可使用scipy.ndimage.zoom并指定order=0(最近邻)。

PyTorch 实现

适合训练流程中的批量处理,使用F.interpolate并指定mode='nearest':

import torch
import torch.nn.functional as F

# 示例输入:shape (3, 512, 512)的Tensor标签
label = torch.randint(0, 2, (3, 512, 512)).float()

# 增加batch维度(PyTorch插值函数要求输入为(B, C, H, W))
label_batch = label.unsqueeze(0)
# 下采样至256×256,最近邻插值
downsampled_batch = F.interpolate(label_batch, size=(256, 256), mode='nearest')
# 移除batch维度,转回原格式
downsampled_label = downsampled_batch.squeeze(0).int()

print(downsampled_label.shape)  # 输出:torch.Size([3, 256, 256])
print(torch.unique(downsampled_label))  # 输出:tensor([0, 1], dtype=torch.int32)

关键注意事项

  • 禁止使用双线性、双三次等插值方法:这类方法会计算像素加权平均,生成0和1之间的中间值,破坏独热编码的类别标识结构。
  • 最近邻插值是唯一能严格保留标签离散值特性的插值方式,完全适配语义分割标签的下采样需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:07:42