2014-12-12 18 views
14

Sto cercando di implementare un Caffe CNN che accetta due immagini di input e un'etichetta (più tardi forse altri dati) e chiedevo se qualcuno fosse a conoscenza della sintassi corretta nel file di prototipo per fare ciò? È semplicemente un livello IMAGE_DATA con piani aggiuntivi? O dovrei usare livelli IMAGE_DATA separati per ciascuno?Caffe Immagini multiple di input

Grazie, James

+1

Avete capito questo fuori? Se è così, si prega di inviare una risposta. – Shai

+0

Hai considerato 2 immagini come canali raddoppiati? – Frazer

+0

@ james-sergeant Forse potresti accettare una risposta? La risposta di RusellStewart è fantastica. – Jonathan

risposta

12

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.

+0

Grazie! Sono d'accordo con gli approcci. Per il 2 °, e se avessi immagini di dimensioni diverse? E quindi non posso impilarli in canali diversi, giusto? – RockTheStar

+0

I dati hdf5 con dimensioni superiori a 2 GB non possono essere caricati! – curio1729

2

Si può anche considerare l'utilizzo di strati HDF5_DATA con più "top" s