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 of 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_logtostderr is ingesteld op 1 voordat convert_imageset geeft het convert_imageset aan om logboekberichten om te leiden naar stderr.
  • --resize_height en --resize_width verkleinen alle --resize_width naar dezelfde grootte 200x200 .
  • --shuffle verandert willekeurig de volgorde van afbeeldingen en behoudt de volgorde niet in het /path/to/labels/train.txt bestand.
  • Hieronder volgen het pad naar de afbeeldingenmap, het labeltekstbestand en de uitvoernaam. Merk op dat de uitvoernaam niet moet bestaan voordat convert_imageset anders krijg je een eng foutbericht.

Andere vlaggen die nuttig kunnen zijn:

  • --backend - hiermee kunt u kiezen tussen een lmdb gegevensset of levelDB .
  • --gray - converteer alle afbeeldingen naar grijsschaal.
  • --encoded en --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 -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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow