目前,我\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已经尝试过:
调整参数,例如:学习率、last_layer_gradient_multiplier、权重衰减
对各种图像尺寸进行训练321, 513, 769
在该公式中使用上述权重进行某种加权
\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, …
在将转换后的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) 给定批量 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) 我们使用灰度眼睛图像和眼睛虹膜的真实数据来训练 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
我正在做一个图像分割任务。总共有 7 个类,所以最终输出是一个像 [batch, 7, height, width] 这样的张量,它是一个 softmax 输出。现在直觉上我想使用 CrossEntropy 损失,但 pytorch 实现不适用于通道明智的单热编码向量
所以我打算自己做一个功能。在一些 stackoverflow 的帮助下,我的代码到目前为止看起来像这样
from torch.autograd import Variable
import torch
import torch.nn.functional as F
def cross_entropy2d(input, target, weight=None, size_average=True):
# input: (n, c, w, z), target: (n, w, z)
n, c, w, z = input.size()
# log_p: (n, c, w, z)
log_p = F.log_softmax(input, dim=1)
# log_p: (n*w*z, c)
log_p = log_p.permute(0, 3, 2, 1).contiguous().view(-1, c) # make class dimension last dimension
log_p = log_p[
target.view(n, w, …Run Code Online (Sandbox Code Playgroud) image-segmentation cross-entropy pytorch loss-function semantic-segmentation
我有一个不平衡的小数据集,其中包含 4116 张 224x224x3 (RGB) 航拍图像。由于数据集不够大,我很可能会遇到过拟合问题。图像预处理和数据增强有助于解决这个问题,如下所述。
“过度拟合是由于可供学习的样本太少导致您无法训练可以泛化到新数据的模型。如果数据无限,您的模型将暴露于手头数据分布的每个可能方面:您永远不会过拟合。数据增强采用从现有训练样本生成更多训练数据的方法,通过大量随机变换来增强样本,从而产生看起来可信的图像。”
使用 Python 进行深度学习,作者 François Chollet,第 138-139 页,5.2.5 使用数据增强。
我已经阅读了Medium - Image Data Preprocessing for Neural Networks并检查了斯坦福的CS230 - Data Preprocessing和 CS231 - Data Preprocessing课程。它在SO 问题中再次突出显示,我知道没有“一刀切”的解决方案。这是迫使我提出这个问题的原因:
“因为我们想要实现高空间分辨率,所以没有使用翻译增强。”
我知道我将使用Keras - ImageDataGenerator Class,但不知道使用哪些技术和哪些参数来对小对象任务进行语义分割。有人可以启发我吗?提前致谢。:)
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range=20, # is a value in degrees (0–180)
width_shift_range=0.2, # is a range within which to randomly translate pictures horizontally.
height_shift_range=0.2, # is …Run Code Online (Sandbox Code Playgroud) 我想知道如何计算多类分割的骰子系数。
这是计算二元分割任务的骰子系数的脚本。如何循环每个类并计算每个类的骰子?
先感谢您
import numpy
def dice_coeff(im1, im2, empty_score=1.0):
im1 = numpy.asarray(im1).astype(numpy.bool)
im2 = numpy.asarray(im2).astype(numpy.bool)
if im1.shape != im2.shape:
raise ValueError("Shape mismatch: im1 and im2 must have the same shape.")
im_sum = im1.sum() + im2.sum()
if im_sum == 0:
return empty_score
# Compute Dice coefficient
intersection = numpy.logical_and(im1, im2)
return (2. * intersection.sum() / im_sum)
Run Code Online (Sandbox Code Playgroud) 我有语义分割掩码的结果(值在 0-1 之间,需要 otsu 阈值来确定什么是阳性),我想直接在 RGB 图像上绘制,每个预测类在 RGB 图像上具有不同的随机颜色。
我使用以下内容绘制具有单一颜色的单个蒙版。是否有一个包或简单的策略可以为多类做到这一点?
fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=(5, 5))
ax.imshow(image, cmap='gray')
ax.axis('off')
mask = (fused_mosaic[..., channel]*255).astype('uint8')
ret3,th3 = cv2.threshold(mask,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
fig, ax = image_show(full_im)
ax.imshow(mask>ret3, alpha=0.3)
Run Code Online (Sandbox Code Playgroud)
我正在寻找这样的东西,只是没有盒子和标签的简单。我尝试使用detectron2(在示例中生成此注释的包,但它们需要一些我无法弄清楚的奇怪元数据对象)。

谢谢
python opencv image-processing computer-vision semantic-segmentation
我正在使用 UNet 进行多类分割。我对模型的输入是HxWxC,我的输出是,
outputs = layers.Conv2D(n_classes, (1, 1), activation='sigmoid')(decoder0)
Run Code Online (Sandbox Code Playgroud)
使用SparseCategoricalCrossentropy我可以很好地训练网络。现在我还想尝试骰子系数作为损失函数。实施如下,
def dice_loss(y_true, y_pred, smooth=1e-6):
y_true = tf.cast(y_true, tf.float32)
y_pred = tf.math.sigmoid(y_pred)
numerator = 2 * tf.reduce_sum(y_true * y_pred) + smooth
denominator = tf.reduce_sum(y_true + y_pred) + smooth
return 1 - numerator / denominator
Run Code Online (Sandbox Code Playgroud)
然而,我实际上得到的是越来越多的损失,而不是减少的损失。我检查了多个来源,但我找到的所有材料都使用骰子损失进行二元分类而不是多类分类。所以我的问题是实施有问题。
我\xe2\x80\x99m 是分割模型的新手。\n我想使用deeplabv3_resnet50模型。\n我的图像具有 shape (256, 256, 3),我的标签具有 shape (256, 256)。我的标签中的每个像素都有一个类值(0-4)。DataLoader 中设置的批量大小为 32。\n因此,我输入批量的形状为[32, 3, 256, 256],对应目标的形状为[32, 256, 256]。我相信这是正确的。
我试图使用nn.BCEWithLogitsLoss().
CrossEntropy代替?[32, 5, 256, 256]. 每个图像预测的形状为[5,256, 256],第 0 层是否表示第 0 类的未归一化概率?为了使[32, 256, 256]张量与输入的目标相匹配BCEWithLogitsLoss,我是否需要将未归一化的概率转换为类?CrossEntropy,我的输出和标签的大小应该是多少?谢谢大家。
\nimage-segmentation conv-neural-network pytorch semantic-segmentation