18

Mam zbiór danych obrazów, które mają wiele etykiet; W zestawie danych znajduje się 100 klas, a każdy obraz ma przypisane od 1 do 5 etykiet.caffe ze zdjęciami z wieloma etykietami

Obserwuję dyspozycję w następującym adresem URL:

https://github.com/BVLC/caffe/issues/550

Mówi, że muszę wygenerować plik tekstowy z listą obrazów i jego etykiety jak w

/home/my_test_dir/picture-foo.jpg 0 
/home/my_test_dir/picture-foo1.jpg 1 

w moim przypadku, ponieważ mam obrazów multi-label, to działa po prostu dodać etykiety jak w następujących?

/home/my_test_dir/picture-foo.jpg 0 2 5 
/home/my_test_dir/picture-foo1.jpg 1 4 

Mam wrażenie, że to chyba nie będzie takie proste, a jeśli mam rację, w jakim etapie iw jaki sposób należy zintegrować multi-label-ności zbioru danych w proces zakładania Caffe?

Odpowiedz

19

Wierzę odpowiedź Shai nie up-to-date jest. Caffe supports multi-label/matrix ground truth dla formatów HDF5 i LMDB. Fragment pyton w this github komentarzu pokazuje jak zbudować multi-label LMDB gruntowych prawdy (patrz Shai's answer dla formatu HDF5). W odróżnieniu od konstrukcji zestawów danych obrazu pojedynczych etykiet, dla obrazów tworzony jest plik lmdb, natomiast drugi plik LMDB jest tworzony dla danych z wielu podstawowych danych o ziemi. Fragment zajmuje się przestrzenną prawdą opartą na wielu etykietach, przydatną do oznaczania obrazów w pikselach.

Kolejność, w którym dane są zapisywane do lmdb ma kluczowe znaczenie. Porządek ziemskiej prawdy musi być zgodny z kolejnością obrazów.

Warstwy strat, takie jak SOFTMAX_LOSS, EUCLIDEAN_LOSS, SIGMOID_CROSS_ENTROPY_LOSS, również obsługują dane z wieloma etykietami. Jednak warstwa dokładności jest nadal ograniczona do danych pojedynczych etykiet. Możesz obserwować numer this github issue, aby śledzić, kiedy ta funkcja zostanie dodana do Caffe.

+5

Ponieważ mam 100 klas, a każdy obraz jest oznaczony od 1 do 5 klas od tych 100, prawdopodobnie potrzebowałbym matrycy 1x100 z wpisem 1, jeśli obraz ma tę klasę jako swoją etykietę i 0 w przeciwnym razie, na przykład. Fragment kodu Pythona w kodzie zajmuje się etykietowaniem w pikselach, ale co jeśli chcesz mieć wiele etykiet na każdym obrazie jako całości? – ytrewq

3

AFAIK, obecna wersja Caffe nie obsługuje zestawy danych lmdb/leveldb dla obrazów z multilabels. Możesz jednak (i ​​prawdopodobnie powinieneś) przygotować swoje dane wejściowe w formacie HDF5. Warstwa wejściowa Caffe HDF5 jest znacznie bardziej elastyczna i pozwala na umieszczenie wielu etykiet na jednym wejściu.
This answer zawiera krótki opis tworzenia danych wejściowych HDF5 dla caffe.

Kolejną kwestią należy rozwiązać, jest fakt, że jesteś zainteresowany nie tylko w wielu -label za obrazem, ale także z różnym liczbę etykiet na obrazie. Jak definiujesz stratę na obraz, na etykietę? może się zdarzyć, że będziesz musiał napisać własną warstwę strat.
Istnieje kilka warstw strat, które obsługują "ignorowanie etykiety": to znaczy, że do obrazu przypisana jest określona etykieta wejściowa, nie jest obliczana strata dla danego obrazu. Zobacz, np. AccuracyLayer i SoftmaxWithLossLayer.

+2

Prawdopodobnie nieaktualna odpowiedź. [Caffe obsługuje dane wielu etykiet] (https://github.com/BVLC/caffe/issues/1698#issue-53768814) dla wielu formatów. Warstwy strat również obsługują dane z wieloma etykietami. Jednak dokładność jest nadal ograniczona do danych pojedynczych etykiet. – ypx

+1

@ypx 'convert_imageset' nie obsługuje etykiet zmiennoprzecinkowych. Zobacz [tutaj] (https://github.com/BVLC/caffe/blob/master/tools/convert_imageset.cpp#L76). – Shai

+1

prawda, że ​​tak nie jest. Caffe obsługuje ładowanie etykiet float z lmdb, leveldb, hdf5 generowanych przez pythona. Nie ma potrzeby użycia pliku convert_imageset. – ypx

4

caffe obsługuje wielokategorialnym. Możesz umieścić etykiety w gorących wektorach np. [0,1,1,0,0,1, ...].Musisz przekształcić etykiety na tensory n * k * 1 * 1 i użyć sigmoidalnej entropii krzyżowej lub euklidesowej, a nie softmax (która wymusza sumę (wyniki) = 1)

+0

W rzeczywistości przekształcenie na n * k * 1 * 1 jest nieprzyzwoite, moje złe. n * k wystarcza (etykieta i wynik netto powinny zgadzać się w wymiarze) –

Powiązane problemy