标签: semantic-segmentation

多类别细分的广义骰子损失:keras实现

我刚刚在keras中实现了广义骰子损失(骰子损失的多类版本),如ref中所述

(我的目标定义为:(batch_size,image_dim1,image_dim2,image_dim3,nb_of_classes))

def generalized_dice_loss_w(y_true, y_pred): 
    # Compute weights: "the contribution of each label is corrected by the inverse of its volume"
    Ncl = y_pred.shape[-1]
    w = np.zeros((Ncl,))
    for l in range(0,Ncl): w[l] = np.sum( np.asarray(y_true[:,:,:,:,l]==1,np.int8) )
    w = 1/(w**2+0.00001)

    # Compute gen dice coef:
    numerator = y_true*y_pred
    numerator = w*K.sum(numerator,(0,1,2,3))
    numerator = K.sum(numerator)

    denominator = y_true+y_pred
    denominator = w*K.sum(denominator,(0,1,2,3))
    denominator = K.sum(denominator)

    gen_dice_coef = numerator/denominator

    return 1-2*gen_dice_coef
Run Code Online (Sandbox Code Playgroud)

但是一定有问题。我正在处理3D图像,必须将其细分为4类(1个背景类和3个对象类,我有一个不平衡的数据集)。首先奇怪的事情:当我的火车损失和准确性训练中提高(和收敛非常快),我确认损失/精度是恒定的低谷时期(见图片)。其次,在对测试数据进行预测时,仅预测了背景类:我得到了恒定的体积。

我使用了完全相同的数据和脚本,但存在分类交叉熵损失,并得到了合理的结果(对象类别已细分)。这意味着我的实现存在问题。知道会是什么吗?

另外,我认为具有通用的骰子丢失实现对keras社区很有用,因为它似乎已用于大多数最近的语义分割任务中(至少在医学图像社区中)。

PS:对我来说,如何定义权重似乎很奇怪;我得到大约10 ^ -10的值。还有其他人尝试实现吗?我也测试了我的功能,但没有权重,但是遇到了同样的问题。

machine-learning deep-learning keras loss-function semantic-segmentation

6
推荐指数
1
解决办法
2680
查看次数

如何使用 PyTorch 在语义分割中获得 top k 的准确率?

你如何计算语义分割中的 top k 准确率?在分类中,我们可以将topk准确度计算为:

correct = output.eq(gt.view(1, -1).expand_as(output))
Run Code Online (Sandbox Code Playgroud)

python computer-vision image-segmentation pytorch semantic-segmentation

6
推荐指数
1
解决办法
1153
查看次数

运行时错误 - 张量的元素 0 不需要 grad 并且没有 grad_fn

我正在使用 Unet 模型进行语义分割 - 我有一个自定义的图像数据集及其掩码,均为 .png 格式。我查看了在线论坛并尝试了一些东西,但没有多少效果?任何有关如何解决错误或改进代码的建议都会有所帮助。

model.eval()
with torch.no_grad():
    for xb, yb in val_dl:
        yb_pred = model(xb.to(device))
        # yb_pred = yb_pred["out"].cpu()
        print(yb_pred.shape)
        yb_pred = torch.argmax(yb_pred,axis = 1)     
        break
    
    print(yb_pred.shape)
    

criteron = nn.CrossEntropyLoss(reduction = 'sum')
opt = optim.Adam(model.parameters(), lr = 3e-4)

def loss_batch(loss_func, output, target, opt = None):
    loss = loss_func(output, target)
    
    if opt is not None:
        opt.zero_grad()
        loss.backward()
        opt.step()        
    return loss.item(), None

lr_scheduler = ReduceLROnPlateau(opt, mode = 'min', factor = 0.5, patience= 20, verbose = 1)

def get_lr(opt):
    for …
Run Code Online (Sandbox Code Playgroud)

python pytorch semantic-segmentation

6
推荐指数
1
解决办法
2万
查看次数

如何为deeplabV3+改进miou?

目前,我\xe2\x80\x99m正在努力使用在自己的数据集上训练的deeplabV3+来改善语义分割问题的结果。\n我\xe2\x80\x99使用来自模型动物园的不同预训练模型成功地训练了deeplabV3+几次,所有这些都基于在xception_65上,但我的结果保持在相同的miou范围内,大约在这个区间[10, 11]附近。\n我只有一个 GPU 可供使用,具有 11GB GPU 内存。\n我的数据集有8 个具有不同对象大小的,从从小到大,并且非常不平衡。\n以下是标签权重:[1, 4, 4, 17, 42, 36, 19, 20]。\n在我的数据集中,我有 757 个训练实例和100 验证实例。

\n\n

训练时的总体趋势是:前 10k 次迭代我的损失减少,但随后它只会振荡。
\n我\xe2\x80\x99已经尝试过:

\n\n
    \n
  • 调整参数,例如:学习率、last_layer_gradient_multiplier、权重衰减

  • \n
  • 对各种图像尺寸进行训练321, 513, 769

  • \n
  • 在该公式中使用上述权重进行某种加权

    \n\n

    权重 = tf.to_float(tf.equal(scaled_labels, 0)) * 1 +\n tf.to_float(tf.equal(scaled_labels, 1)) * 4 +\n tf.to_float(tf.equal(scaled_labels, 2) ) * 4 +\n tf.to_float(tf.equal(scaled_labels, 3)) * 17 +\n tf.to_float(tf.equal(scaled_labels, 4)) * 42 +\n tf.to_float(tf.equal( scaled_labels, …

deep-learning tensorflow semantic-segmentation

5
推荐指数
0
解决办法
873
查看次数

我的图像分割结果图在白色补丁中包含黑色格子

在此处输入图片说明我正在使用 Pytorch 0.4.0 使用类似 UNet 的 CNN 架构进行图像分割。它在最终分割结果中将前景标记为 1,将背景标记为 0。我使用预训练的 VGG 的特征提取器作为我的编码器,所以我需要对编码器输出进行多次上采样。但结果显示了一个奇怪的格子部分,如下所示:

我怀疑这些不同形状的黑色部分是由反卷积层引起的。官方文档中说反卷积层在输入像素之间添加了(s-1)个零。反卷积层的超参数如下:

kernel_size=3,stride=2,padding=1,output_padding=1

(output_padding 用于拟合跳过连接特征的大小,例如,输入大小为 40*30,我希望它在一个反卷积层中放大两倍,根据我的计算公式:out=s(in-1) +k-2p,我必须使用 padding 1 和 output-padding 1 来保持大小,否则可能有其他更好的选择我不知道。)

我想知道产生黑色格子的原因。它们看起来像一个网格或方形部分。如何解决它。此外,我需要将所有deconv层超参数调整为一个统一的或分别修改它们?

环境:Ubuntu 16.04、Pytorch 0.4.0、GTX 1080Ti,上采样的架构是三层deconv层,层层递进。

更新

在我修改了 deconv 超参数之后,(受图像分割结果中的噪声启发使用

kernel_size=4,stride=2,padding=1

从而避免输出填充并满足大小。但是在 100 epoch 之后我遇到了类似的问题。

又经过30个epoch的训练,看起来是这样的,在此处输入图片说明

黑点刚刚散落,看起来这些黑点只是改变了它们的部分并跳入了另一个部分,我不知道为什么会出现。我不知道如何修改我的网络超参数。
self.conv1=Basic(1024,512,kernel_size=3,stride=1,padding=1)
        self.conv2=Basic(512,512,kernel_size=3,stride=1,padding=1)
        self.deconv1=Basic(512,256,kernel_size=4,stride=2,conv=False,padding=1)
        self.deconv2=Basic(256,128,kernel_size=4,stride=2,conv=False,padding=1)
        self.deconv3=Basic(128,64,kernel_size=4,stride=2,conv=False,padding=1)
        #output  480*640 segmap
        self.conv4=Basic(64,2,kernel_size=1,stride=1)
        # self.avgpool=nn.AvgPool2d(kernel_size=2,stride=2)

    def forward(self, input):
        input=self.conv1(input)
        input=self.conv2(input)
        input=self.deconv1(input)
        input=self.deconv2(input)
        input=self.deconv3(input)
        input=self.conv4(input)
        # print(input.shape)
        #a channel-wise probability map
        raw=input
        return raw`
Run Code Online (Sandbox Code Playgroud)

python image-segmentation deconvolution pytorch semantic-segmentation

5
推荐指数
0
解决办法
375
查看次数

无法在Android应用程序中加载tflite deeplab细分模型。错误:ByteBuffer不是有效的FlatBuffer模型

在将转换后的TFLite模型加载到android应用程序时遇到问题。

型号:Deeplabv3 Mobilenetv2(在Pascal VOC上进行了培训)TFLite版本:1.10

使用tflite_convert将pb文件转换为tflite。(Tensorflow版本:1.11.0)

码:

private MappedByteBuffer loadModelFile(AssetManager assets, String modelFilename)
      throws IOException {
    AssetFileDescriptor fileDescriptor = assets.openFd(modelFilename);
    FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
    FileChannel fileChannel = inputStream.getChannel();
    long startOffset = fileDescriptor.getStartOffset();
    long declaredLength = fileDescriptor.getDeclaredLength();
    return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
  }

  /**
   * Initializes a native TensorFlow session for classifying images.
   *
   * @param assetManager The asset manager to be used to load assets.
   * @param modelFilename The filepath of the model GraphDef protocol buffer.
   */
  public static Segmentor create( …
Run Code Online (Sandbox Code Playgroud)

android semantic-segmentation tensorflow-lite deeplab

5
推荐指数
0
解决办法
888
查看次数

Plotly:如何设置热图纵横比?

我有一个单通道图像,其中每个整数像素值映射到一个字符串。例如 5 -> '人'。我正在尝试创建一个交互式图像,其中将鼠标悬停在像素上将显示其相应的字符串。

我认为使用绘图热图可能是做到这一点的方法。我遇到的问题是:

  • 真的很慢。如果我将 numpy 数组设置为偶数 (100,100) 大小,则加载需要几分钟的时间。我想这可能是因为我的代码效率不高?
  • 我不知道如何保持纵横比。因此,如果我的图像是大小为 (100,100) 的 numpy 数组,我希望绘图也为 (100,100) 像素。
  • 使用空白值z_text似乎是一个糟糕的解决方法,但设置annotation_text=None似乎不起作用。

有人可以帮我从这里出去吗?这是我所得到的:

import numpy as np
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
import plotly.figure_factory as ff

z = np.random.randint(0,6, size=(10, 10))
z_text = np.full(z.shape, '', dtype=str)

d = {0:'a', 1:'b', 2:'c', 3:'d', 4:'e', 5:'f'}
class_mat = np.vectorize(d.get)(z)

fig = ff.create_annotated_heatmap(z, annotation_text=z_text, text=class_mat, hoverinfo='text', colorscale='Viridis', )
fig.layout.title = 'Semantic Segmentation'

iplot(fig, filename='annotated_heatmap_text')
Run Code Online (Sandbox Code Playgroud)

这是它目前的样子:

在此输入图像描述

另外,如果情节热图不是解决此问题的最佳方法,我很想听到任何替代方案! …

python heatmap plotly semantic-segmentation

5
推荐指数
1
解决办法
2746
查看次数

将 COCO 数据集导入 google colaboratory

COCO 数据集非常大,我无法将其上传到 google colab。有什么办法可以直接将数据集下载到 google colab?

python computer-vision google-colaboratory semantic-segmentation

5
推荐指数
2
解决办法
7690
查看次数

keras/tensorflow 中语义图像分割的多类加权损失

给定批量 RGB 图像作为输入,shape=(batch_size, width, height, 3)

多类目标表示为 one-hot,shape=(batch_size, width, height, n_classes)

以及最后一层具有 softmax 激活的模型(Unet、DeepLab)。

我正在寻找 kera/tensorflow 中的加权分类交叉熵损失函数。

class_weight中的论点似乎fit_generator不起作用,我在这里或https://github.com/keras-team/keras/issues/2115中没有找到答案。

def weighted_categorical_crossentropy(weights):
    # weights = [0.9,0.05,0.04,0.01]
    def wcce(y_true, y_pred):
        # y_true, y_pred shape is (batch_size, width, height, n_classes)
        loos = ?...
        return loss

    return wcce
Run Code Online (Sandbox Code Playgroud)

deep-learning keras tensorflow semantic-segmentation

5
推荐指数
1
解决办法
8690
查看次数

无法减少语义分割(UNET)中的损失,平均 IOU 也没有改善

我们使用灰度眼睛图像和眼睛虹膜的真实数据来训练 CNN 来分割虹膜。我们的数据集包含大约 2000 张图像及其相应的蒙版,尺寸均为 224x224。

\n\n

我们使用了UNET架构,如下面的代码所示。为了确保我们的网络正常工作,我们尝试将网络过度拟合到数据集的 30 张图像。

\n\n

我们使用了骰子损失函数(mean_iou 约为 0.80),但在火车图像上进行测试时,结果很差。它显示的白色像素比地面实况要多得多。我们尝试了几种优化器(Adam、SGD、RMsprop),没有显着差异。

\n\n

我们删除了最后两个Conv2D层中的激活函数,这改善了mean_iou和骰子损失,但我们仍然遇到相同的白色像素污迹问题(错误地预测白色像素的存在),但比以前少了。

\n\n

然后,我们使用 Tversky 损失函数来消除误报(尝试多个 alpha 和 beta 值)。结果有所改善,但在训练图像上进行测试时,网络预测\xe2\x80\x99 并不准确。

\n\n

我们还添加了一个回调,以在损失不改变时降低学习率,这稍微改善了结果。

\n\n

在进行之前的运行时,我们尝试一次运行 50 个 epoch,我们将达到损失不再减少约 (0.1) 且mean_iou=0.9 的程度。无论多少个纪元,都不会变得更好,只会波动。学习率很低(0.00001),回调会将其降低到 1x10^-8,但损失仍然没有进一步减少。

\n\n

如果有人有这方面的经验或可以向我们提供有关如何克服此问题的任何见解,我们将不胜感激。

\n\n
\n\ndef conv2d_block(input_tensor, n_filters, kernel_size=3, batchnorm=True):\n    # first layer\n    x = Conv2D(filters=n_filters, kernel_size=(kernel_size, kernel_size), kernel_initializer="he_normal",\n               padding="same")(input_tensor)\n    if batchnorm:\n        x = BatchNormalization()(x)\n        x = Activation("relu")(x)\n    # second layer\n    x = Conv2D(filters=n_filters, kernel_size=(kernel_size, kernel_size), kernel_initializer="he_normal",\n               padding="same")(x)\n    if batchnorm:\n        x = BatchNormalization()(x)\n        x = Activation("relu")(x)\n …
Run Code Online (Sandbox Code Playgroud)

computer-vision conv-neural-network keras tensorflow semantic-segmentation

5
推荐指数
0
解决办法
2252
查看次数