caffe
Förbered data för utbildning
Sök…
Förbered bilddatasätt för bildklassificeringsuppgift
Caffe har ett inbyggt inmatningslager skräddarsytt för bildklassificeringsuppgifter (dvs en enda heltaletikett per inmatad bild) Detta input "Data" -lager bygger på en lmdb- eller leveldb- datastruktur. För att använda "Data" -lagret måste man konstruera datastrukturen med alla träningsdata.
En snabbguide till Caffe's convert_imageset
Bygga
Det första du måste göra är att bygga caffe och caffe's tools (convert_imageset är ett av dessa verktyg). Efter att ha installerat caffe och
make det så se till att du sprang också make tools . Kontrollera att en binär fil
convert_imageset skapas i $CAFFE_ROOT/build/tools . Förbered dina data
Bilder: lägg alla bilder i en mapp (jag kallar det här/path/to/jpegs/ ). Etiketter: skapa en textfil (t.ex. / path/to/
/path/to/labels/train.txt ) med en rad per ingångsbild <sökväg / till / fil>. Till exempel: img_0000.jpeg 1
img_0001.jpeg 0
img_0002.jpeg 0
I det här exemplet är den första bilden märkt 1 medan de andra två är märkta 0 .
Konvertera datasatsen
Kör det binära i skalet~$ 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
Kommandorad förklaras:
-
GLOG_logtostderrflaggan är inställd på 1 innanconvert_imagesetindikerarconvert_imagesetatt omdirigera loggmeddelanden till stderr. -
--resize_heightoch--resize_widthstorlek på alla inmatade bilder till samma storlek200x200. -
--shuffleslumpmässigt ordningen på bilder och bevarar inte ordningen i filen/path/to/labels/train.txt. - Följande är sökvägen till bildermappen, etikettens textfil och utgångsnamnet. Observera att utgångsnamnet inte bör existera innan du ringer
convert_imagesetannars får du ett läskigt felmeddelande.
Andra flaggor som kan vara användbara:
-
--backend- låter dig välja mellan ettlmdbellerlevelDB. - -
--gray- konvertera alla bilder till grå skala. -
--encodedoch--encoded_type- förvara bilddata i kodad (jpg / png) komprimerad form i databasen. -
--help- visar lite hjälp, se alla relevanta flaggor under Flaggor från verktyg / convert_imageset.cpp
Du kan kolla in $CAFFE_ROOT/examples/imagenet/convert_imagenet.sh för ett exempel på hur du använder convert_imageset .
se den här tråden för mer information.
Förbered godtyckliga data i HDF5-format
Förutom bildklassificeringsdatasätt har Caffe också "HDF5Data" för godtyckliga ingångar. Detta lager kräver att alla utbildnings- / valideringsdata lagras i hdf5- format.
Detta exempel visar hur man använder python h5py modul för att konstruera en sådan hdf5-fil och hur man ställer in caffe "HDF5Data" att läsa den filen.
Bygg den binära hdf5-filen
Förutsatt att du har en textfil'train.txt' med varje rad med ett bildfilnamn och ett enda flytande punktnummer som ska användas som regressionsmål. 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
Konfigurera "HDF5Data"
När du har alla h5 filer och motsvarande testfiler som listar dem kan du lägga till ett HDF5-inmatningslager till din 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 }
}
Du kan hitta mer information här och här .
Som visas ovan överför vi till Caffe en lista med HDF5-filer. Det beror på att i den aktuella versionen finns en storleksgräns på 2 GB för en enda HDF5-datafil. Så om träningsdata överstiger 2 GB, måste vi dela upp dem i separata filer.
Om en enda HDF5-datafil överstiger 2 GB får vi ett felmeddelande som
Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX
Om den totala datamängden är mindre än 2 GB, ska vi dela upp data i separata filer eller inte?
Enligt en kommentar i Caffes källkod skulle en enda fil vara bättre,
Om shuffle == sant, blandas beställningen av HDF5-filerna och beställningen av data inom en given HDF5-fil blandas, men data mellan olika filer är inte sammanflätade.