2014-12-12 5 views
14

Ich bin dabei, ein Caffe CNN zu implementieren, das zwei Eingabebilder und ein Label (später vielleicht andere Daten) akzeptiert und sich fragte, ob jemand die korrekte Syntax in der Prototxtdatei dafür kannte? Ist es einfach eine IMAGE_DATA-Ebene mit zusätzlichen Oberseiten? Oder sollte ich separate IMAGE_DATA Ebenen für jedes verwenden?Caffe Multiple Input Images

Danke, James

+1

Haben Sie das herausgefunden? Wenn ja, bitte posten Sie eine Antwort. – Shai

+0

Haben Sie 2 Bilder als doppelte Kanäle betrachtet? – Frazer

+0

@ James-Sergeant Vielleicht könnten Sie eine Antwort akzeptieren? RusellStewarts Antwort sieht gut aus. – Jonathan

Antwort

12

Edit: Ich habe für diese die HDF5_DATA Schicht in letzter Zeit mit und es ist definitiv der Weg zu gehen.

HDF5 ist ein Schlüsselwertspeicher, bei dem jeder Schlüssel eine Zeichenfolge und jeder Wert ein mehrdimensionales Array ist. Um die HDF5_DATA-Ebene zu verwenden, fügen Sie einfach einen neuen Schlüssel für jeden zu verwendenden Anfang hinzu und legen den Wert für diesen Schlüssel fest, um das Bild zu speichern, das Sie verwenden möchten. Beim Schreiben dieser HDF5 Dateien von Python ist einfach:

import h5py 
import numpy as np 

filelist = [] 
for i in range(100): 
    image1 = get_some_image(i) 
    image2 = get_another_image(i) 
    filename = '/tmp/my_hdf5%d.h5' % i 
    with hypy.File(filename, 'w') as f: 
     f['data1'] = np.transpose(image1, (2, 0, 1)) 
     f['data2'] = np.transpose(image2, (2, 0, 1)) 
    filelist.append(filename) 
with open('/tmp/filelist.txt', 'w') as f: 
    for filename in filelist: 
     f.write(filename + '\n') 

Dann stellen Sie einfach die Quelle des HDF5_DATA param sein ‚/tmp/filelist.txt‘, und legen Sie die Spitzen sein „data1“ und „Data2“.

Ich verlasse die ursprüngliche Antwort unter:

================================= ==================

Es gibt zwei gute Möglichkeiten, dies zu tun. Am einfachsten ist es wahrscheinlich, zwei separate IMAGE_DATA-Ebenen zu verwenden, eine mit dem ersten Bild und der ersten und eine zweite mit dem zweiten Bild. Caffe ruft Bilder aus LMDB oder LEVELDB ab, bei denen es sich um Schlüsselwertspeicher handelt. Wenn Sie Ihre beiden Datenbanken mit entsprechenden Bildern mit demselben Integer-ID-Schlüssel erstellen, lädt Caffe die Bilder tatsächlich und Sie können mit dem Erstellen des Netzes fortfahren Daten/Labels beider Ebenen. Das Problem mit diesem Ansatz ist, dass zwei Datenebenen nicht wirklich sehr befriedigend sind, und es skaliert nicht sehr gut, wenn Sie fortgeschrittenere Dinge wie nicht ganzzahlige Beschriftungen für Dinge wie Bounding Boxes, etc. Tun wollen Wenn Sie bereit sind, sich Zeit dafür zu nehmen, können Sie einen besseren Job machen, indem Sie die Datei tools/convert_imageset.cpp so ändern, dass Bilder oder andere Daten kanalübergreifend gestapelt werden. Zum Beispiel könnten Sie ein Datum mit 6 Kanälen erstellen - die ersten 3 für das RGB Ihres ersten Bildes und die zweiten 3 für das RGB Ihres zweiten Bildes. Nachdem Sie dies mit der IMAGE_DATA-Ebene gelesen haben, können Sie den Stream in zwei Bilder aufteilen, indem Sie eine SLICE-Ebene mit einem Schnittpunkt bei Index 3 entlang der Dimension slice_dim = 1 verwenden. Wenn Sie im weiteren Verlauf entscheiden, dass Sie noch komplexere Sortimente laden möchten, werden Sie das Codierungsschema verstehen und können Ihre eigene Decodierungsschicht basierend auf src/caffe/layers/data_layer.cpp schreiben, um die volle Kontrolle zu erhalten der Pipeline.

+0

Danke! Ich stimme den Ansätzen zu. Für die zweite, was ist, wenn ich Bilder mit unterschiedlicher Größe habe? Und ich kann sie deshalb nicht in verschiedene Kanäle stapeln, richtig? – RockTheStar

+0

hdf5 Daten mit Größen größer als 2GB können nicht geladen werden! – curio1729

2

Sie können auch HDF5_DATA-Layer mit mehreren "Top" s verwenden