caffe
Przygotuj dane do szkolenia
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 lmdb lub leveldb . 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_logtostderrjest ustawiona na 1 przed wywołaniem metodyconvert_imagesetwskazuje, że mechanizm rejestrowania przekierowuje komunikaty dziennika do stderr. -
--resize_heighti--resize_widthrozmiar wszystkich obrazów wejściowych do tego samego rozmiaru200x200. -
--shufflelosowo 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_imagesetprzeciwnym razie pojawi się straszny komunikat o błędzie.
Inne flagi, które mogą być przydatne:
-
--backend- pozwala wybrać pomiędzylmdbdanychlevelDBalevelDB. -
--gray- konwertuje wszystkie obrazy na skalę szarości. -
--encodedi--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 plikach w formacie hdf5 .
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.