Ricerca…


Preparare il set di dati immagine per l'attività di classificazione delle immagini

Caffe ha un livello di input incorporato per le attività di classificazione delle immagini (ad esempio, etichetta di un singolo numero per immagine di input). Questo livello di input "Data" è costruito su una struttura di dati o . Per utilizzare il livello "Data" è necessario costruire la struttura dati con tutti i dati di addestramento.

Una guida rapida al convert_imageset di Caffe

Costruire

La prima cosa che devi fare è costruire gli strumenti di caffe e caffe ( convert_imageset è uno di questi strumenti).
Dopo l'installazione di caffe e make ing che assicurarsi è stato eseguito make tools pure.
Verificare che un file binario convert_imageset sia stato creato in $CAFFE_ROOT/build/tools .

Prepara i tuoi dati

Immagini: metti tutte le immagini in una cartella (la chiamerò qui /path/to/jpegs/ ).
Etichette: crea un file di testo (ad esempio /path/to/labels/train.txt ) con una riga per immagine di input <percorso / su / file>. Per esempio:

img_0000.jpeg 1
img_0001.jpeg 0
img_0002.jpeg 0

In questo esempio la prima immagine è etichettata come 1 mentre le altre due sono etichettate come 0 .

Converti il ​​set di dati

Esegui il binario nella shell

~$ GLOG_logtostderr=1 $CAFFE_ROOT/build/tools/convert_imageset \
    --resize_height=200 --resize_width=200 --shuffle  \
    /path/to/jpegs/ \
    /path/to/labels/train.txt \
    /path/to/lmdb/train_lmdb

Riga di comando spiegata:

  • GLOG_logtostderr flag GLOG_logtostderr è impostato su 1 prima di chiamare convert_imageset indica il meccanismo di registrazione per reindirizzare i messaggi di registro su stderr.
  • --resize_height e --resize_width ridimensionano tutte le immagini di input alla stessa dimensione 200x200 .
  • --shuffle cambia casualmente l'ordine delle immagini e non conserva l'ordine nel file /path/to/labels/train.txt .
  • Di seguito sono riportati il ​​percorso della cartella delle immagini, il file di testo delle etichette e il nome dell'output. Si noti che il nome dell'output non dovrebbe esistere prima di chiamare convert_imageset altrimenti si otterrà un messaggio di errore spaventoso.

Altri flag che potrebbero essere utili:

  • --backend - permette di scegliere tra un lmdb set di dati o levelDB .
  • --gray - converte tutte le immagini in scala di grigi.
  • --encoded e --encoded_type - mantiene i dati dell'immagine in forma compressa codificata (jpg / png) nel database.
  • --help - mostra qualche aiuto, guarda tutti i flag rilevanti sotto Flags from tools / convert_imageset.cpp

Puoi dare un'occhiata a $CAFFE_ROOT/examples/imagenet/convert_imagenet.sh per un esempio su come usare convert_imageset .

vedere questa discussione per ulteriori informazioni.

Prepara dati arbitrari nel formato HDF5

Oltre ai set di dati di classificazione delle immagini , Caffe ha anche un livello "HDF5Data" per input arbitrari. Questo strato richiede che tutti i dati di addestramento / convalida siano memorizzati in file di formato .
Questo esempio mostra come usare il modulo python h5py per costruire tale file hdf5 e come impostare il livello caffe "HDF5Data" per leggere quel file.

Costruisci il file binario hdf5

Supponendo che tu abbia un file di testo 'train.txt' con ogni riga con un nome di file immagine e un singolo numero in virgola mobile da utilizzare come target di regressione.

import h5py, os
import caffe
import numpy as np

SIZE = 224 # fixed size to all images
with open( 'train.txt', 'r' ) as T :
    lines = T.readlines()
# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
X = np.zeros( (len(lines), 3, SIZE, SIZE), dtype='f4' ) 
y = np.zeros( (1,len(lines)), dtype='f4' )
for i,l in enumerate(lines):
    sp = l.split(' ')
    img = caffe.io.load_image( sp[0] )
    img = caffe.io.resize( img, (SIZE, SIZE, 3) ) # resize to fixed size
    # you may apply other input transformations here...
    # Note that the transformation should take img from size-by-size-by-3 and transpose it to 3-by-size-by-size
    X[i] = img
    y[i] = float(sp[1])
with h5py.File('train.h5','w') as H:
    H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
    H.create_dataset( 'y', data=y ) # note the name y given to the dataset!
with open('train_h5_list.txt','w') as L:
    L.write( 'train.h5' ) # list all h5 files you are going to use

Configurazione del livello "HDF5Data"

Una volta che hai tutti i file h5 e i file di test corrispondenti che li elencano puoi aggiungere un layer di input HDF5 al tuo train_val.prototxt :

 layer {
   type: "HDF5Data"
   top: "X" # same name as given in create_dataset!
   top: "y"
   hdf5_data_param {
     source: "train_h5_list.txt" # do not give the h5 files directly, but the list.
     batch_size: 32
   }
   include { phase:TRAIN }
 }

Puoi trovare maggiori informazioni qui e qui .


Come mostrato sopra, passiamo a Caffe una lista di file HDF5. Questo perché nella versione attuale esiste un limite di dimensione di 2 GB per un singolo file di dati HDF5. Pertanto, se i dati di allenamento superano i 2 GB, sarà necessario suddividerli in file separati.

Se un singolo file di dati HDF5 supera i 2 GB riceverai un messaggio di errore come

Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX

Se la quantità totale di dati è inferiore a 2 GB, dobbiamo suddividere i dati in file separati o no?

Secondo un commento nel codice sorgente di Caffe , un singolo file sarebbe migliore,

Se shuffle == true, l'ordine dei file HDF5 viene mischiato e l'ordine dei dati all'interno di un determinato file HDF5 viene mischiato, ma i dati tra file diversi non sono intercalati.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow