如何在caffe中输入多个ND阵列到网络?

Dho*_*rka 0 computer-vision neural-network image-segmentation deep-learning caffe

我想为caffe中的语义分段创建一个自定义丢失层,需要多个输入.我希望这种损失函数具有额外的输入因子,以便惩罚小物体中的未命中检测.

为此,我创建了一个图像GT,其中包含每个像素的权重.如果像素属于小物体,则重量很高.

我是caffe的新手,我不知道如何同时为我的网络提供三个2-D信号(图像,gt-mask和每像素权重).我怀疑caffe如何处理rgb数据和gt数据之间的对应关系.
我想扩展这个以便为类标签图像设置2 gt,而将另一个设置为丢失功能.

你能给出一些暗示以达到这个目的吗?

谢谢,

Sha*_*hai 6

您希望caffe为每个训练样本使用多个ND信号.您担心默认"Data"图层只能处理一个图像作为训练样本.
这种担忧有几种解决方案:

  1. 使用多个"Data"图层(如您链接到的模型中所做的那样).为了在三层之间进行同步,"Data"您需要知道caffe按顺序读取基础LMDB中的样本.因此,如果您以相同的顺序准备三个LMDB ,那么 caffe将按照每个LMDB按样本放置的顺序一次读取一个样本,因此在训练/验证期间三个输入将同步.
    请注意,convert_imageset有一个'shuffle'标志,不要使用它,因为它会在三个LMDB中的每个LMDB中以不同方式对您的样本进行洗牌,并且您将没有同步.强烈建议您在准备LMDB之前自己对样本进行洗牌,但是对所有三个输入应用相同的 "shuffle",使它们彼此同步.

  2. 使用5通道输入.caffe可以将ND数据存储在LMDB中,而不仅仅是彩色/灰色图像.您可以使用python创建LMDB,每个"图像"是一个5通道阵列,前三个通道是图像的RGB,后两个是地面实况标签和每像素丢失的权重.
    在您的模型中,您只需要在您的模型上添加一个"Slice"图层"Data":

    layer {
      name: "slice_input"
      type: "Slice"
      bottom: "raw_input" # 5-channel "image" stored in LMDB
      top: "rgb"
      top: "gt"
      top: "weight"
      slice_param { 
        axis: 1
        slice_point: 3
        slice_point: 4
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用"HDF5Data"图层(我个人最喜欢的).您可以以二进制hdf5格式存储输入,并从这些文件中读取caffe.使用"HDF5Data"在caffe中更灵活,并允许您根据需要调整输入.你的情况,你需要准备三"数据集"二进制文件HDF5: 'rgb','gt''weight'.您需要确保在创建hdf5文件时同步样本.准备就绪后,您就可以拥有一个准备好"HDF5Data"使用三个"顶部"的图层.

  4. 编写自己的"Python"输入图层.我不会在这里详述.但是你可以在python中实现自己的输入层.有关详细信息,请参阅此主题.


归档时间:

查看次数:

1129 次

最近记录:

8 年,3 月 前