15

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

谢谢,詹姆斯

4

2 回答 2

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')

然后只需将 HDF5_DATA 参数的来源设置为“/tmp/filelist.txt”,并将顶部设置为“data1”和“data2”。

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

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

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

这种方法的问题在于,拥有两个数据层并不是很令人满意,而且如果你想做更高级的事情,比如为边界框等设置非整数标签,它的扩展性就不是很好。如果你重新准备在这方面投入时间,您可以通过修改 tools/convert_imageset.cpp 文件以跨通道堆叠图像或其他数据来做得更好。例如,您可以创建一个具有 6 个通道的数据——前 3 个用于您的第一个图像的 RGB,第二个 3 个用于您的第二个图像的 RGB。在使用 IMAGE_DATA 层阅读此内容后,您可以使用 SLICE 层将流分成两个图像,其中 slice_point 位于 slice_dim = 1 维度的索引 3。如果再往前走,你决定要加载更复杂的数据分类,你'

于 2015-03-20T08:39:14.340 回答
3

您也可以考虑使用具有多个“顶部”的 HDF5_DATA 层

于 2015-05-31T08:01:14.683 回答