Caffe多输入图像

Jam*_*ant 15 image machine-learning neural-network deep-learning caffe

我正在考虑实现一个接受两个输入图像和一个标签(后来可能是其他数据)的Caffe CNN,并且想知道是否有人知道prototxt文件中的正确语法是为了做到这一点?它只是一个带有额外顶部的IMAGE_DATA图层吗?或者我应该为每个使用单独的IMAGE_DATA图层?

谢谢,詹姆斯

Rus*_*art 12

编辑:我最近一直在使用HDF5_DATA层,这绝对是可行的方法.

HDF5是一个键值存储,其中每个键都是一个字符串,每个值都是一个多维数组.因此,要使用HDF5_DATA图层,只需为要使用的每个顶部添加一个新键,并设置该键的值以存储您要使用的图像.从python编写这些HDF5文件很简单:

import h5py
import numpy as np

filelist = []
for i in range(100):
    image1 = get_some_image(i)
    image2 = get_another_image(i)
    filename = '/tmp/my_hdf5%d.h5' % i
    with hypy.File(filename, 'w') as f:
        f['data1'] = np.transpose(image1, (2, 0, 1))
        f['data2'] = np.transpose(image2, (2, 0, 1))
    filelist.append(filename)
with open('/tmp/filelist.txt', 'w') as f:
    for filename in filelist:
        f.write(filename + '\n')
Run Code Online (Sandbox Code Playgroud)

然后只需将HDF5_DATA参数的源设置为'/tmp/filelist.txt',并将tops设置为"data1"和"data2".

我将在下面留下原始回复:

================================================== ==

有两种很好的方法可以做到这一点.最简单的可能是使用两个单独的IMAGE_DATA图层,一个是第一个图像和标签,另一个是第二个图像.Caffe从LMDB或LEVELDB中检索图像,这些图像是键值存储,假设您使用具有相同整数id键的相应图像创建两个数据库,Caffe实际上将正确加载图像,并且您可以继续使用两个层的数据/标签.

这种方法的问题在于拥有两个数据层并不是非常令人满意,如果你想做更高级的事情,例如对于边界框之类的东西使用非整数标签等,它就不能很好地扩展.如果你'为了节省时间投入,你可以通过修改工具/ convert_imageset.cpp文件来跨渠道堆叠图像或其他数据做得更好.例如,您可以创建一个包含6个通道的基准面 - 第一个图像的RGB为前三个,第二个图像的RGB为第二个3.在使用IMAGE_DATA图层读取此内容后,您可以使用SLICE图层将流分割为两个图像,其中slice_point位于slice_dim = 1维度的索引3处.如果你想继续下去,你决定要加载更复杂的数据分类,你就会理解编码方案,并且可以根据src/caffe/layers/data_layer.cpp编写你自己的解码层来获得完全的控制权.管道.