Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 在具有不同地面真值和输出通道的多类分割问题中,如何计算损失?(UNET,骰子丢失)_Image Processing_Keras_Computer Vision_Conv Neural Network_Image Segmentation - Fatal编程技术网

Image processing 在具有不同地面真值和输出通道的多类分割问题中,如何计算损失?(UNET,骰子丢失)

Image processing 在具有不同地面真值和输出通道的多类分割问题中,如何计算损失?(UNET,骰子丢失),image-processing,keras,computer-vision,conv-neural-network,image-segmentation,Image Processing,Keras,Computer Vision,Conv Neural Network,Image Segmentation,我试图理解在一个有21个类的数据集(1个有21种不同颜色的掩码,每种颜色表示一个类)上训练UNET时,损失是如何计算的。因此,地面真值形状是N*M*1(灰度图像,每个像素值代表类别颜色(背景为黑色,树木为绿色等))。但输出形状是N*M*21(它返回与输入大小相同的21个图像)。我的问题是,在这种情况下如何计算损失?当目标形状为N*M*1,输出形状(预测张量)为N*M*21时 我的解释是,N*M是每个类标签的预测图像(第0个(比如说背景)标签的第一个N*M预测图像,第2个N*M预测图像,第一个标签

我试图理解在一个有21个类的数据集(1个有21种不同颜色的掩码,每种颜色表示一个类)上训练UNET时,损失是如何计算的。因此,地面真值形状是N*M*1(灰度图像,每个像素值代表类别颜色(背景为黑色,树木为绿色等))。但输出形状是N*M*21(它返回与输入大小相同的21个图像)。我的问题是,在这种情况下如何计算损失?当目标形状为N*M*1,输出形状(预测张量)为N*M*21时

我的解释是,N*M是每个类标签的预测图像(第0个(比如说背景)标签的第一个N*M预测图像,第2个N*M预测图像,第一个标签(比如树)等等。有点像一对一的方法

我正在使用这个库中实现的UNET。
我真的很困惑,请帮忙。

是的,你的口译很好

实际上,掩码(基本真相ys)的创建方式是,如果有K个类,那么就有K个维度为hxw的矩阵

假设你有一个问题,那就是对树木、行人和汽车进行分割。这里K=3,例如,树木的输入掩码是一个维数为H x W的矩阵,其中地面真实值仅在树木所在的位置标记为1,否则标记为0。然后,对于与行人对应的第二个掩码,地面真实值为mar仅在行人所在的位置使用1,否则使用0。这是我们构建数据集的方式,因为我们有多类分割,而不是多标签分割,其中不同遮罩上的1可能重叠

是的,输入图像确实像您所描述的那样是灰度的,其值介于[0,类的数量]之间,但是网络并没有像您可能怀疑的那样接收到输入的地面真相

事实上,如果您仔细查看本教程中的这些代码行(Keras和PyTorch的代码行相同),您可以看到以下代码段:

# extract certain classes from mask (e.g. cars)
masks = [(mask == v) for v in self.class_values]
mask = np.stack(masks, axis=-1).astype('float')
我上面描述的过程就是在这个过程中发生的

现在我们已经准备好了,接下来的损失函数很简单:它的工作原理就像只有一个1和0的掩码,但是它适应了hxwxk情况,而不是hxwxk

铭记:

通过检查这些代码行,您将解决您的难题:

backend = kwargs['backend']

gt, pr = gather_channels(gt, pr, indexes=class_indexes, **kwargs)
pr = round_if_needed(pr, threshold, **kwargs)
axes = get_reduce_axes(per_image, **kwargs)

# score calculation
intersection = backend.sum(gt * pr, axis=axes)
union = backend.sum(gt + pr, axis=axes) - intersection

score = (intersection + smooth) / (union + smooth)
score = average(score, per_image, class_weights, **kwargs)

您好,非常感谢您抽出时间回答我的疑问。我接受了您的答案并投了赞成票。不客气,我很久以前就遇到过这种情况,我知道有人为您指出正确的方向是多么好(我没有任何人帮助我):DHi,最后一个问题,我如何可视化预测的张量?预测将是N*M*21的形状,其中每个N*M矩阵将具有属于该类的概率分布。在我看来,我需要设置一个阈值,例如如果概率大于0.5,则该类存在,否则为0。然后我将所有21个预测进行叠加CTE图像,这是正确的方法吗?是的,实际上对于一个像素,你有一个数组1 x 1 x K,其中K=0概率为树,K=1概率为行人等。我们实际上是在谈论一个立方体,但本质上,因为它只是一个像素,它是1xk,相当于一个1D数组:D
backend = kwargs['backend']

gt, pr = gather_channels(gt, pr, indexes=class_indexes, **kwargs)
pr = round_if_needed(pr, threshold, **kwargs)
axes = get_reduce_axes(per_image, **kwargs)

# score calculation
intersection = backend.sum(gt * pr, axis=axes)
union = backend.sum(gt + pr, axis=axes) - intersection

score = (intersection + smooth) / (union + smooth)
score = average(score, per_image, class_weights, **kwargs)