Edit: ho utilizzato lo strato HDF5_DATA ultimamente per questo ed è sicuramente la strada da percorrere.
HDF5 è un archivio di valori chiave, in cui ogni chiave è una stringa e ogni valore è un array multidimensionale. Pertanto, per utilizzare il livello HDF5_DATA, è sufficiente aggiungere una nuova chiave per ogni piano che si desidera utilizzare e impostare il valore per tale chiave per memorizzare l'immagine che si desidera utilizzare. Scrivendo questi file HDF5 dal pitone è facile:
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')
Poi basta impostare la sorgente del param HDF5_DATA di essere '/tmp/filelist.txt', e impostare le cime di essere "dati1" e "data2".
Sto lasciando la risposta originale di seguito:
================================= ===================
Ci sono due buoni modi per farlo. Il più semplice è probabilmente quello di utilizzare due livelli IMAGE_DATA separati, uno con la prima immagine ed etichetta e un secondo con la seconda immagine. Caffe recupera le immagini da LMDB o LEVELDB, che sono negozi di valore chiave, e assumendo che tu crei i tuoi due database con immagini corrispondenti con lo stesso codice id intero, Caffe caricherà le immagini correttamente, e puoi procedere a costruire la tua rete con dati/etichette di entrambi i livelli.
Il problema con questo approccio è che avere due livelli di dati non è davvero molto soddisfacente, e non si adatta molto bene se si vogliono fare cose più avanzate come avere etichette non intere per cose come scatole di delimitazione, ecc. Se sei pronto a investire un po 'di tempo in questo, puoi fare un lavoro migliore modificando il file tools/convert_imageset.cpp per impilare immagini o altri dati attraverso i canali. Ad esempio è possibile creare un riferimento con 6 canali: i primi 3 per l'RGB della prima immagine e il secondo 3 per l'RGB della seconda immagine. Dopo aver letto questo nel livello IMAGE_DATA, puoi dividere il flusso in due immagini usando un livello SLICE con un punto_sunto all'indice 3 lungo lo slice_dim = 1 dimensione. Se sei in fondo alla strada, decidi che vuoi caricare anche più complessi assortimenti di dati, capirai lo schema di codifica e potrai scrivere il tuo livello di decodifica basato su src/caffe/layers/data_layer.cpp per ottenere il pieno controllo della pipeline.
Avete capito questo fuori? Se è così, si prega di inviare una risposta. – Shai
Hai considerato 2 immagini come canali raddoppiati? – Frazer
@ james-sergeant Forse potresti accettare una risposta? La risposta di RusellStewart è fantastica. – Jonathan