0

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

我正在研究图像分割。我正在尝试on-the-fly通过添加 python 层来进行数据扩充。对于我的数据集,我想在 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和相应的python 层tops吗?如果是,我怎么知道哪个顶部与哪个底部相关?

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

4

1 回答 1

1

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

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

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

于 2017-12-18T09:36:30.737 回答