Szukaj…


Przygotuj zestaw danych obrazu do zadania klasyfikacji obrazu

Caffe ma wbudowaną warstwę wejściową dostosowaną do zadań klasyfikacji obrazów (tj. Pojedynczą etykietę całkowitą na obraz wejściowy). Ta wejściowa warstwa "Data" jest zbudowana na strukturze danych lub . Aby użyć warstwy "Data" należy zbudować strukturę danych ze wszystkimi danymi szkoleniowymi.

Krótki przewodnik po Caffe's convert_imageset

Budować

Pierwszą rzeczą, którą musisz zrobić, to zbudować caffe i narzędzia caffe ( convert_imageset jest jednym z tych narzędzi).
Po zainstalowaniu caffe i make ing to upewnij się, że prowadził make tools , jak również.
Sprawdź, czy w pliku $CAFFE_ROOT/build/tools utworzono plik binarny convert_imageset

Przygotuj swoje dane

Obrazy: umieść wszystkie obrazy w folderze (nazywam to tutaj /path/to/jpegs/ ).
Etykiety: utwórz plik tekstowy (np. /path/to/labels/train.txt ) z linią na obraz wejściowy <ścieżka / do / pliku>. Na przykład:

img_0000.jpeg 1
img_0001.jpeg 0
img_0002.jpeg 0

W tym przykładzie pierwszy obraz jest oznaczony 1 a pozostałe dwa - 0 .

Konwertuj zestaw danych

Uruchom plik binarny w powłoce

~$ 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

Objaśnienie wiersza poleceń:

  • Flaga GLOG_logtostderr jest ustawiona na 1 przed wywołaniem metody convert_imageset wskazuje, że mechanizm rejestrowania przekierowuje komunikaty dziennika do stderr.
  • --resize_height i --resize_width rozmiar wszystkich obrazów wejściowych do tego samego rozmiaru 200x200 .
  • --shuffle losowo zmienia losowo kolejność obrazów i nie zachowuje kolejności w /path/to/labels/train.txt .
  • Poniżej znajduje się ścieżka do folderu obrazów, pliku tekstowego etykiet i nazwy wyjściowej. Zauważ, że nazwa wyjściowa nie powinna istnieć przed wywołaniem programu convert_imageset przeciwnym razie pojawi się straszny komunikat o błędzie.

Inne flagi, które mogą być przydatne:

  • --backend - pozwala wybrać pomiędzy lmdb danych levelDB a levelDB .
  • --gray - konwertuje wszystkie obrazy na skalę szarości.
  • --encoded i --encoded_type - przechowuj dane obrazu w postaci skompresowanej (jpg / png) w bazie danych.
  • --help - pokazuje pomoc, zobacz wszystkie odpowiednie flagi pod Flagi z tools / convert_imageset.cpp

Możesz sprawdzić $CAFFE_ROOT/examples/imagenet/convert_imagenet.sh aby dowiedzieć się, jak korzystać z convert_imageset .

zobacz ten wątek, aby uzyskać więcej informacji.

Przygotuj dowolne dane w formacie HDF5

Oprócz zestawów danych klasyfikacji obrazów , Caffe ma również warstwę "HDF5Data" do dowolnych danych wejściowych. Ta warstwa wymaga przechowywania wszystkich danych szkoleniowych / walidacyjnych w formacie .
W tym przykładzie pokazano, jak użyć modułu h5py Pythona do skonstruowania takiego pliku hdf5 i jak skonfigurować warstwę "HDF5Data" caffe do odczytu tego pliku.

Zbuduj plik binarny hdf5

Zakładając, że masz plik tekstowy 'train.txt' z każdą linią z nazwą pliku obrazu i pojedynczą liczbą zmiennoprzecinkową, która ma być używana jako cel regresji.

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

Konfigurowanie warstwy "HDF5Data"

Po utworzeniu wszystkich plików h5 i odpowiednich plików testowych, możesz dodać warstwę wejściową HDF5 do 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 }
 }

Możesz znaleźć więcej informacji tutaj i tutaj .


Jak pokazano powyżej, przekazujemy do Caffe listę plików HDF5. Jest tak, ponieważ w obecnej wersji istnieje limit wielkości 2 GB na pojedynczy plik danych HDF5. Jeśli więc dane szkolenia przekroczą 2 GB, będziemy musieli podzielić je na osobne pliki.

Jeśli pojedynczy plik danych HDF5 przekroczy 2 GB, otrzymamy komunikat o błędzie, taki jak

Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX

Jeśli łączna ilość danych jest mniejsza niż 2 GB, czy podzielimy dane na osobne pliki, czy nie?

Zgodnie z komentarzem w kodzie źródłowym Caffe , jeden plik byłby lepszy,

Jeśli shuffle == true, kolejność plików HDF5 jest tasowana, a kolejność danych w danym pliku HDF5 jest tasowana, ale dane między różnymi plikami nie są przeplatane.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow