caffe
Daten für das Training vorbereiten
Suche…
Bereiten Sie das Bild-Dataset für die Bildklassifizierungsaufgabe vor
Caffe verfügt über eine integrierte Eingabeebene, die auf Bildklassifizierungsaufgaben zugeschnitten ist (z. B. eine ganzzahlige Beschriftung pro Eingabebild). Diese Eingabe "Data" -Schicht basiert auf einer lmdb- oder leveldb- Datenstruktur. Um die "Data" -Schicht zu verwenden, muss die Datenstruktur mit allen Trainingsdaten erstellt werden.
Eine convert_imageset zu convert_imageset von Caffe
Bauen
Als erstes müssen Sie die Tools fürconvert_imageset und convert_imageset ( convert_imageset ist eines dieser Tools). Nach caffe Installation und
make ing es sicherstellen , dass Sie lief make tools auch. convert_imageset , dass in $CAFFE_ROOT/build/tools eine Binärdatei convert_imageset erstellt wird. Bereiten Sie Ihre Daten vor
Bilder: Alle Bilder in einem Ordner/path/to/jpegs/ (ich werde es hier /path/to/jpegs/ ). Labels: Erstellen Sie eine Textdatei (z. B.
/path/to/labels/train.txt ) mit einer Zeile pro Eingabebild <path / to / file>. Zum Beispiel: img_0000.jpeg 1
img_0001.jpeg 0
img_0002.jpeg 0
In diesem Beispiel wird das erste Bild mit 1 und die beiden anderen mit 0 .
Konvertieren Sie den Datensatz
Führen Sie die Binärdatei in der Shell aus~$ 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
Befehlszeile erklärt:
-
GLOG_logtostderrFlagGLOG_logtostderrwird auf 1 gesetzt, bevor der Aufruf vonconvert_imagesetden Protokollierungsmechanismus zum Umleiten von Protokollnachrichten an stderr angibt. -
--resize_heightund--resize_widthändern die Größe aller Eingabebilder auf die gleiche Größe von200x200. -
--shuffleändert zufällig die Reihenfolge der Bilder und/path/to/labels/train.txtdie Reihenfolge in der Datei/path/to/labels/train.txt. - Im Folgenden finden Sie den Pfad zum Bilderordner, die Textdatei der Beschriftungen und den Namen der Ausgabe. Beachten Sie, dass der Ausgabename vor dem Aufruf von
convert_imagesetnicht vorhanden seinconvert_imagesetAndernfalls erhalten Sie eine unheimliche Fehlermeldung.
Andere Flags, die nützlich sein könnten:
-
--backend- Mit dieser--backendkönnen Sie zwischen einemlmdbDataset oder einerlmdblevelDB. -
--gray- Konvertiert alle Bilder in Graustufen. -
--encodedund--encoded_type---encoded_typeBilddaten in codierter (jpg / png) komprimierter Form in der Datenbank auf. -
--help- Zeigt Hilfe an, alle relevanten Flags finden Sie unter Flags aus tools / convert_imageset.cpp
In $CAFFE_ROOT/examples/imagenet/convert_imagenet.sh ein Beispiel für die Verwendung von convert_imageset .
Weitere Informationen finden Sie in diesem Thread .
Bereiten Sie beliebige Daten im HDF5-Format vor
Zusätzlich zur Bildklassifizierung Datensätze haben Caffe auch "HDF5Data" Schicht für beliebige Eingänge. Diese Schicht erfordert, dass alle Trainings- / Validierungsdaten in Dateien im Format hdf5 gespeichert werden.
Dieses Beispiel zeigt, wie Sie mit dem python h5py Modul eine solche hdf5-Datei erstellen und wie der "HDF5Data" Layer "HDF5Data" zum Lesen dieser Datei eingerichtet wird.
Erstellen Sie die hdf5-Binärdatei
Angenommen, Sie haben eine Textdatei'train.txt' mit jeder Zeile mit einem Bilddateinamen und einer einzelnen Gleitkommazahl, die als Regressionsziel verwendet werden soll. 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
Layer "HDF5Data" konfigurieren
Wenn Sie alle h5 Dateien und die entsprechenden Testdateien train_val.prototxt haben, können Sie Ihrer train_val.prototxt eine HDF5-Eingabeebene 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 }
}
Weitere Informationen finden Sie hier und hier .
Wie oben gezeigt, übergeben wir eine Liste von HDF5-Dateien an Caffe. Dies liegt daran, dass in der aktuellen Version für eine einzelne HDF5-Datendatei eine Größenbeschränkung von 2 GB gilt. Wenn die Trainingsdaten also 2 GB überschreiten, müssen wir sie in separate Dateien aufteilen.
Wenn eine einzelne HDF5-Datei 2 GB überschreitet, erhalten Sie eine Fehlermeldung wie
Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX
Wenn die Gesamtdatenmenge weniger als 2 GB beträgt, teilen wir die Daten in separate Dateien auf oder nicht?
Laut einem Kommentar in Caffes Quellcode wäre eine einzelne Datei besser,
Wenn shuffle == true ist, wird die Reihenfolge der HDF5-Dateien gemischt, und die Reihenfolge der Daten innerhalb einer bestimmten HDF5-Datei wird gemischt, aber die Daten zwischen verschiedenen Dateien werden nicht verschachtelt.