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 eller 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_logtostderr flaggan är inställd på 1 innan convert_imageset indikerar convert_imageset att omdirigera loggmeddelanden till stderr.
  • --resize_height och --resize_width storlek på alla inmatade bilder till samma storlek 200x200 .
  • --shuffle slumpmä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_imageset annars får du ett läskigt felmeddelande.

Andra flaggor som kan vara användbara:

  • --backend - låter dig välja mellan ett lmdb eller levelDB .
  • - --gray - konvertera alla bilder till grå skala.
  • --encoded och --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 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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow