【问题标题】:Data augmentation on-the-fly for semantic segmentation, Is my python layer definition correct?用于语义分割的动态数据增强,我的 python 层定义是否正确?
【发布时间】:2017-12-16 03:26:05
【问题描述】:

我不是caffePython 方面的专家,但我正在逐步学习。我有点困惑,所以如果专家能看看我的问题,我将不胜感激。

我正在研究图像分割。我正在尝试通过添加 python 层来进行on-the-fly 数据增强。对于我的数据集,我想在 x 轴和 y 轴(另外 4 个平移)上进行 (+10,-10) 的平移,添加高斯噪声和水平翻转。

我的问题是:

  1. caffe 是如何同步图片和标签的?例如,如果我通过data 层向网络和侧面发送图像,则label 被发送到SoftmaxWithLoss(例如)。 我已经(手动)绘制了数据增强和正常流动的示意图,我不确定我的理解是否正确!

    从图中可以看出,对于翻译,我们必须以同步的方式翻译图像和ground truth(或者对于翻转,我们也必须翻转标签);例如,如果我将图像分别在 x 轴和 y 轴上移动 -10 和 -10 像素,则地面真实图像也需要相应地重新定位。如何在 caffe Python 层中做到这一点。我的理解是否正确(基于该图)?我写了python层如下:

import caffe
import numpy as np
from skimage import transform as tf
from skimage.transform import AffineTransform

class ShiftLayer(caffe.Layer):

    def setup(self,bottom,top):
        assert len(bottom)==2,  #requires two inputs bottom(1:image, 2:label)
        assert len(top)==2      #requires two layer top

    def reshape(self,bottom,top):
        top[0].reshape(*bottom[0].data.shape)   #HOW CAN WE KNOW LABEL or DATA is GOING TO "bottom[0]" or "bottom[1]"?????
        top[1].reshape(*bottom[1].data.shape)

    def forward(self,bottom,top):
        x_trans=-10 
        y_trans=-10
        top[0].data[...]=tf.warp(bottom[0].data, AffineTransform(translation=(x_trans,y_trans)))
        top[1].data[...]=tf.warp(bottom[1].data, AffineTransform(translation=(x_trans,y_trans)))


    def backward(self,top,propagate_down,bottom):
        pass

这是层定义:

layer {
  name: "shift_layer"
  type: "Python"
  bottom: "data"
  bottom: "label"
  top: "data"
  top: "label"
  include {
  phase: TRAIN
  }
  python_param {
    module: "myshift_layer"
    layer: "ShiftLayer"
  }
}
  1. 如果我要向网络中添加其他增强技术,我应该为它们中的每一个编写单独的模块吗?或者我可以编写一个包含许多bottoms 和相应的tops 的python 层吗?如果是,我怎么知道哪个顶部与哪个底部相关?

  2. 在添加高斯噪声的情况下,我们确实有与输入图像相同的标签,这个层的定义如何?

【问题讨论】:

    标签: python caffe pycaffe matcaffe


    【解决方案1】:

    总的来说,您的理解似乎是正确的。但是:

    1. Caffe blob(顶部,底部)将图像存储为(通道 * 行 * 列)形式,这与通常的形式(行 * 列 * 通道)不同。它在 1 通道图像(如标签)的情况下没有区别,但在彩色图像的情况下却有区别。我怀疑 tf.warp 在这种情况下是否能正常工作。

    2. 我认为没有理由为各种增强(移位、翻转等)制作单独的层。在一个 python 层中完成所有这些是没有问题的。但我不明白你想在这种情况下有很多底部和顶部。此外,您实际展示的 python 层并没有进行任何增强,因为它只是生成一组相似移位的图像来代替原始图像。它不会改善训练过程。动态增强的常用方法是一种转换,它不会影响网络形状,而是将随机(!)转换后的数据放置在原始数据的位置。那么网络在不同的训练时期处理相同的输入图像,它实际上处理不同的图像,这些图像是通过随机变换从这个输入图像产生的。因此,您必须通过随机选择 x_trans、y_trans 来完成您的示例。在一般情况下,您还可以添加随机翻转和随机高斯噪声等。这种变换可以同时应用,也可以随机选择其中一种。无论如何,图层必须只有一对数据+标签作为底部和顶部。

    【讨论】:

    • 同样应用变换可能会导致标签边缘模糊。如果是多类标签,它可能会成为问题。
    • Ilya Ovodov 感谢您的有用评论
    猜你喜欢
    • 2022-08-04
    • 2020-11-04
    • 2016-11-04
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2020-01-22
    • 2015-08-03
    • 2020-01-07
    相关资源
    最近更新 更多