Ответ 1
Изменить: я использовал слой HDF5_DATA в последнее время для этого, и это определенно путь.
HDF5 - это хранилище ключевых значений, где каждый ключ является строкой, и каждое значение представляет собой многомерный массив. Таким образом, чтобы использовать слой HDF5_DATA, просто добавьте новый ключ для каждой вершины, которую вы хотите использовать, и установите для этого ключа значение для хранения изображения, которое вы хотите использовать. Написание этих файлов HDF5 из python очень просто:
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, которые являются хранилищами ключевых значений, и предполагая, что вы создаете свои две базы данных с соответствующими изображениями, имеющими один и тот же ключ с целым числом, Caffe фактически загрузит изображения правильно, и вы можете приступить к построению своей сети с помощью данные/метки обоих слоев.
Проблема с этим подходом заключается в том, что наличие двух слоев данных на самом деле не очень удовлетворительно и не очень хорошо масштабируется, если вы хотите делать более продвинутые вещи, такие как наличие нецелых меток для таких вещей, как ограничивающие поля и т.д. Если вы готовы инвестировать в это время, вы можете сделать лучшую работу, изменив файл tools/convert_imageset.cpp для складывания изображений или других данных по каналам. Например, вы можете создать базу данных с 6 каналами - первые 3 для вашего первого изображения RGB, а второе 3 для вашего второго изображения RGB. Прочитав это при использовании слоя IMAGE_DATA, вы можете разделить поток на два изображения, используя слой SLICE с slice_point с индексом 3 по размеру slice_dim = 1. Если вы продвигаетесь дальше по дороге, вы решаете, что хотите загрузить еще более сложные подборки данных, вы поймете схему кодирования и можете написать свой собственный уровень декодирования на основе src/caffe/layers/data_layer.cpp, чтобы получить полный контроль трубопровода.