caffe
Gegevens voorbereiden voor training
Zoeken…
Bereid beeldgegevensset voor op beeldclassificatietaak
Caffe heeft een ingebouwde invoerlaag op maat gemaakt voor beeldclassificatietaken (dwz een enkelvoudig geheel label per invoerafbeelding). Deze invoer "Data" -laag is gebouwd op een lmdb- of leveldb- datastructuur. Om de "Data" -laag te gebruiken, moet men de gegevensstructuur met alle trainingsgegevens construeren.
Een korte handleiding voor Caffe's convert_imageset
Bouwen
Het eerste wat je moet doen is caffe en caffe's tools bouwen (convert_imageset is een van deze tools). Nadat je caffe hebt geïnstalleerd en
make hebt gezorgd, moet je ervoor zorgen dat je make tools . Controleer of een binair bestand
convert_imageset is gemaakt in $CAFFE_ROOT/build/tools . Bereid uw gegevens voor
Afbeeldingen: plaats alle afbeeldingen in een map (ik noem het hier/path/to/jpegs/ ). Labels: maak een tekstbestand (bijv.
/path/to/labels/train.txt ) met een regel per invoerafbeelding <pad / naar / bestand>. Bijvoorbeeld: img_0000.jpeg 1
img_0001.jpeg 0
img_0002.jpeg 0
In dit voorbeeld heeft de eerste afbeelding het label 1 terwijl de andere twee het label 0 .
Converteer de gegevensset
Voer het binaire bestand in shell uit~$ 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
Opdrachtregel uitgelegd:
-
GLOG_logtostderris ingesteld op 1 voordatconvert_imagesetgeeft hetconvert_imagesetaan om logboekberichten om te leiden naar stderr. -
--resize_heighten--resize_widthverkleinen alle--resize_widthnaar dezelfde grootte200x200. -
--shuffleverandert willekeurig de volgorde van afbeeldingen en behoudt de volgorde niet in het/path/to/labels/train.txtbestand. - Hieronder volgen het pad naar de afbeeldingenmap, het labeltekstbestand en de uitvoernaam. Merk op dat de uitvoernaam niet moet bestaan voordat
convert_imagesetanders krijg je een eng foutbericht.
Andere vlaggen die nuttig kunnen zijn:
-
--backend- hiermee kunt u kiezen tussen eenlmdbgegevensset oflevelDB. -
--gray- converteer alle afbeeldingen naar grijsschaal. -
--encodeden--encoded_type- bewaar afbeeldingsgegevens in gecodeerde (jpg / png) gecomprimeerde vorm in de database. -
--help- geeft wat hulp, zie alle relevante vlaggen onder Vlaggen van tools / convert_imageset.cpp
Je kunt $CAFFE_ROOT/examples/imagenet/convert_imagenet.sh voor een voorbeeld van het gebruik van convert_imageset .
zie deze thread voor meer informatie.
Bereid willekeurige gegevens voor in HDF5-indeling
Naast datasets voor "HDF5Data" heeft Caffe ook een laag "HDF5Data" voor willekeurige invoer. Voor deze laag moeten alle trainings- / validatiegegevens worden opgeslagen in hdf5 -bestanden.
Dit voorbeeld laat zien hoe de python h5py module wordt gebruikt om een dergelijk hdf5-bestand te construeren en hoe u de caffe "HDF5Data" -laag "HDF5Data" om dat bestand te lezen.
Bouw het hdf5 binaire bestand
Ervan uitgaande dat u een tekstbestand'train.txt' met elke regel met een afbeeldingsbestandsnaam en een enkel drijvend puntnummer dat moet worden gebruikt als regressiedoel. 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
"HDF5Data" configureren
Zodra u alle h5 bestanden en de bijbehorende testbestanden hebt, kunt u een HDF5-invoerlaag toevoegen aan uw 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 }
}
U kunt hier en hier meer informatie vinden .
Zoals hierboven getoond, geven we een lijst met HDF5-bestanden door aan Caffe. Dat komt omdat er in de huidige versie een maximale grootte van 2 GB is voor een enkel HDF5-gegevensbestand. Dus als de trainingsgegevens groter zijn dan 2 GB, moeten we deze in afzonderlijke bestanden splitsen.
Als een enkel HDF5-gegevensbestand groter is dan 2 GB, krijgen we een foutmelding zoals
Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX
Als de totale hoeveelheid gegevens kleiner is dan 2 GB, zullen we de gegevens dan in afzonderlijke bestanden splitsen of niet?
Volgens een opmerking in de broncode van Caffe zou een enkel bestand beter zijn,
Als shuffle == true, wordt de volgorde van de HDF5-bestanden geschud en wordt de volgorde van de gegevens in een bepaald HDF5-bestand geschud, maar gegevens tussen verschillende bestanden worden niet doorschoten.