赞
踩
t >= 0 && t < n_classes
failed.eval_net sub_cross_entropy = F.cross_entropy(pred.unsqueeze(dim=0), true_mask.unsqueeze(dim=0).squeeze(1)).item()
最近在训练图像4分类时,为了使标签可视化,分别用了不同的像素值[0, 74, 128, 145]对图像做了mask像素分割。
在模型训练时遇到如下两个bug:
1.RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
2.[00:00<?, ?img/s]C:\actions-runner_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\native\cuda\NLLLoss2d.cu:103: block: [0,0,0], thread: [832,0,0] Assertion t >= 0 && t < n_classes
failed.
查找问题:
1.,mask对照了我自己的label种类发现都是没有问题的!(除了标签外,不能有其他多余的像素值在图中)
2,将标签图mask中像素的值为[0, 74, 128, 145]的pix,转换pix为[0,1,2,3]
附上转换代码
mask = cv2.imread(mask_path, 0)
# 创建转换后对应的标签列表
label_list = [0, 1, 2, 3]
# 使用where函数进行转换
mask2 = np.where(mask == 0, label_list[0],
np.where(mask == 74, label_list[1],
np.where(mask == 28, label_list[2],
np.where(mask == 145, label_list[3], mask))))
为何要这样编码:
在图像分割任务中,标签从0开始的连续值是一种常见的表示方式。这种表示方式的目的是方便计算机进行处理和存储。
具体来说,标签是用来标识图像中不同的分类或语义区域,例如一幅图像中可能包含人、车、树等不同的物体或者地面、天空等不同的区域。在这个问题中,我们需要为每个物体或区域分配一个唯一的标签。如果我们用不同的数字给每个物体或区域编码,那么这些数字应该是连续的,并从0开始,如0表示背景,1表示人,2表示车等。
这种编码方式的好处在于,可以用一个数组或矩阵来表示整张图像,矩阵的每个元素存储一个数字,表示对应像素的标签。例如,在语义分割任务中,我们可以使用一个尺寸与原图像相同的矩阵,每个元素存储一个数字,表示对应像素所属的物体或区域。这样的编码方式对计算和存储都非常方便。
另外,从0开始的连续值的编码方式还可以避免混淆和错误。如果我们用非连续的或重复的数字来编码,可能会使结果不可解释或者出现错误。对于计算机来说,使用连续值的编码方式也更加直观和易于处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。