2016-11-22 4 views
0

Ich versuche zu sehen, ob ich Dask für blockweise Parallelisierung der Erkennung und Segmentierung von Objekten in massiven 2D-Bildern (~ 20-50 GB) nutzen kann ein Cluster.Wie man mit Dask die Objekterkennung auf einem massiven Bild auf dem Cluster parallelisiert

Meine Logik zum Erkennen/Segmentieren von Objekten in einem Bildblock wird in einer Funktion gekapselt.

Ich stieß auf eine Dask-Funktion namens map_blocks, die mich eine benutzerdefinierte Funktion auf jeden Block/Chunk eines DASK-Arrays anwenden kann.

Allerdings sehe ich, dass der Ausgabetyp der Funktion, die ich an map_blocks weitergeben kann, auch ein Array sein sollte.

Für Objekterkennung/-segmentierung möchte ich, dass meine Funktion in der Lage ist, die Koordinaten der Begrenzungskontur jedes im Block gefundenen/erkannten Objekts zurückzugeben. Beachten Sie, dass die Anzahl der Objekte in einem Block unbekannt ist und vom Bild abhängt.

Wie kann ich diesen Anwendungsfall mit map_blocks oder etwas anderem in Dask lösen?

Antwort

1

Für mehr benutzerdefinierte Berechnungen empfehle ich dask.delayed verwenden, die Sie ziemlich generischen Python-Code parallelisieren können.

Wenn Sie eine dask.array haben Sie können es in einen Haufen von verzögerten Objekte drehen mit dem .to_delayed() Methode

blocks = x.to_delayed() 

Sie dann beliebige Funktionen auf dieser Blöcke ausgeführt werden können, wie Sie wollen.

+0

Danke für die Antwort. In der von Ihnen vorgeschlagenen Lösung ist process_block frei, um irgendeinen Objekttyp zurückzugeben? Und ist es möglich, dass die Funktion process_block die block_id kennt? – cdeepakroy

+0

block_id würde benötigt, damit ich meine Objekterkennungsfunktion erzeugen kann, um die begrenzenden Konturkoordinaten der erkannten Objekte im globalen Raum anstelle von Blockraum zu erzeugen. – cdeepakroy

1

Sie könnten ein Objektarray als Ausgabe verwenden, mit einer Chunkshape von (1,1). Achten Sie darauf, "dtype = 'object'" zu Ihrem Aufruf map_blocks hinzuzufügen. Innerhalb der abgebildeten Funktion instanziieren Sie dann ein (1,1) großes Objekt-Array mit einer Liste von Koordinaten bei (0,0). Gefällt mir:

def find_objects(): 
    # do logic 
    result = np.empty((1,1), dtype='object') 
    result[0,0] = coordinate_list 
    return result 

da_coords = da.map_blocks(find_objects, da_image, dtype='object') 
+0

Danke für den Vorschlag. Werde das versuchen und zurückkommen. – cdeepakroy

Verwandte Themen