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 oder 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ür convert_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_logtostderr Flag GLOG_logtostderr wird auf 1 gesetzt, bevor der Aufruf von convert_imageset den Protokollierungsmechanismus zum Umleiten von Protokollnachrichten an stderr angibt.
  • --resize_height und --resize_width ändern die Größe aller Eingabebilder auf die gleiche Größe von 200x200 .
  • --shuffle ändert zufällig die Reihenfolge der Bilder und /path/to/labels/train.txt die 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_imageset nicht vorhanden sein convert_imageset Andernfalls erhalten Sie eine unheimliche Fehlermeldung.

Andere Flags, die nützlich sein könnten:

  • --backend - Mit dieser --backend können Sie zwischen einem lmdb Dataset oder einer lmdb levelDB .
  • --gray - Konvertiert alle Bilder in Graustufen.
  • --encoded und --encoded_type - --encoded_type Bilddaten 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 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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow