18

Ich habe einen Datensatz von Bildern, die mehrere Etiketten haben; Es gibt 100 Klassen im Datensatz und jedem Bild sind 1 bis 5 Beschriftungen zugeordnet.caffe mit Multi-Label-Bildern

Ich folge den Anweisungen in der folgenden URL:

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

Es sagt, dass ich eine Textdatei zeigt die Bilder und ihre Etiketten wie in

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

In meinem Fall, da ich Multi-Label-Bilder habe, funktioniert es, einfach Etiketten wie folgt hinzuzufügen?

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

Ich habe das Gefühl, dass es wahrscheinlich nicht so einfach sein würde, und wenn ich Recht habe, in welchem ​​Schritt und wie soll ich die Multi-Label-ness des Datensatz integriere in der Prozess der Einrichtung von Caffe?

Antwort

19

Ich glaube, Shais Antwort ist nicht mehr aktuell. Caffe supports multi-label/matrix ground truth für HDF5 und LMDB Formate. Das Python-Snippet in this GitHub-Kommentar demonstriert, wie Multi-Label-LMDB-Grundwahrheit zu erstellen (siehe Shai's answer für HDF5-Format). Anders als bei der Konstruktion von Single-Label-Bilddatensätzen wird für die Bilder eine lmdb-Datei erstellt, während für die Multi-Label-Ground-Truth-Daten eine zweite separate lmdb-Datei erstellt wird. Das Snippet befasst sich mit der räumlichen Multi-Label-Grundwahrheit, die für die pixelweise Beschriftung von Bildern nützlich ist.

Die Reihenfolge, in der Daten in die lmdb geschrieben werden, ist entscheidend. Die Reihenfolge der Grundwahrheit muss der Reihenfolge der Bilder entsprechen.

Verlustschichten wie SOFTMAX_LOSS, EUCLIDEAN_LOSS, SIGMOID_CROSS_ENTROPY_LOSS unterstützen auch Multi-Label-Daten. Der Genauigkeits-Layer ist jedoch weiterhin auf Single-Label-Daten beschränkt. Vielleicht möchten Sie this github issue verfolgen, um zu verfolgen, wann diese Funktion zu Caffe hinzugefügt wird.

+5

Da ich 100 Klassen habe, und jedes Bild wird 1 bis 5 Klassen von denen bezeichnet 100, würde ich wahrscheinlich eine 1x100-Matrix mit Eintrag 1 benötigen, wenn das Bild diese Klasse als Label hat und sonst 0, zum Beispiel. Python-Snippet in Ihrem Code behandelt die pixelweise Beschriftung, aber was, wenn Sie mehrere Labels für jedes Bild als Ganzes möchten? – ytrewq

3

AFAIK, aktuelle Caffe-Version unterstützt keine lmdb/leveldb-Datasets für Bilder mit Multilabels. Sie können (und sollten wahrscheinlich) Ihre Eingaben im HDF5-Format vorbereiten. Caffe HDF5-Eingabeschicht ist viel flexibler und ermöglicht Ihnen, mehrere Etiketten pro Eingabe zu haben.
This answer gibt eine kurze Beschreibung der Erstellung von HDF5-Eingang für Caffe.

Ein weiteres Problem, das Sie ansprechen müssen, ist die Tatsache, dass Sie daran interessiert sind, nicht nur in Multi -label pro Bild, sondern auch mit Anzahl von Etiketten pro Bild variiert. Wie definieren Sie Ihren Verlust pro Bild, pro Etikett? Es könnte sein, dass Sie Ihre eigene Verlustschicht schreiben müssten.
Es gibt einige Verlust-Layer, die "ignore label" unterstützen: Wenn dem Bild ein bestimmtes Eingabe-Label zugewiesen wird, wird für das jeweilige Bild kein Verlust berechnet. Siehe z. AccuracyLayer und SoftmaxWithLossLayer.

+2

möglicherweise veraltete Antwort verwenden. [Caffe unterstützt Multi-Label-Daten] (https://github.com/BVLC/caffe/issues/1698#issue-53768814) für mehrere Formate. Loss-Layer unterstützen auch Multi-Label-Daten. Genauigkeit ist jedoch immer noch auf Single-Label-Daten beschränkt. – ypx

+1

@ypx 'convert_imageset' unterstützt keine Fließkomma-Beschriftungen. Siehe [hier] (https://github.com/BVLC/caffe/blob/master/tools/convert_imageset.cpp#L76). – Shai

+1

stimmt es nicht. Caffe unterstützt das Laden von Float-Labels von lmdb, leveldb, hdf5, die über Python generiert wurden. Keine Notwendigkeit für convert_imageset. – ypx

4

caffe unterstützt multilabel. Sie können die Markierungen in n-heiße Vektoren, z.B. [0,1,1,0,0,1, ...].Sie müssen die Etiketten zu n * k * 1 * 1 Tensoren umformen und Sigmoid-Kreuz-Entropie oder euklidische, nicht Softmax (die Kräfte Summe (Ausgänge) = 1)

+0

eigentlich die Neufassung nach n * k * 1 * 1 ist uncert, mein Schlechter. n * k ist genug (Label und Nettoausgabe sollten in der Dimension übereinstimmen) –