2016-04-01 5 views
13

Ich verwende Tensorflow imageNet trained model, um die Features der letzten Pooling-Layer als Darstellungsvektoren für einen neuen Datensatz von Bildern zu extrahieren.überwunden Graphdef kann nicht größer als 2 GB in Tensorflow sein

Das Modell wie prognostiziert auf ein neues Bild wie folgt:

python classify_image.py --image_file new_image.jpeg 

ich die Hauptfunktion bearbeitet, so dass ich einen Ordner mit Bildern zu nehmen und die Vorhersage auf allen Bildern auf einmal zurückzukehren und die Funktion schreiben Vektoren in einer CSV-Datei. Hier ist, wie ich tat, dass:

def main(_): 
    maybe_download_and_extract() 
    #image = (FLAGS.image_file if FLAGS.image_file else 
    #   os.path.join(FLAGS.model_dir, 'cropped_panda.jpg')) 
    #edit to take a directory of image files instead of a one file 
    if FLAGS.data_folder: 
    images_folder=FLAGS.data_folder 
    list_of_images = os.listdir(images_folder) 
    else: 
    raise ValueError("Please specify image folder") 

    with open("feature_data.csv", "wb") as f: 
    feature_writer = csv.writer(f, delimiter='|') 

    for image in list_of_images: 
     print(image) 
     current_features = run_inference_on_image(images_folder+"/"+image) 
     feature_writer.writerow([image]+current_features) 

Es ist für ganz gut arbeitete rund 21 Bilder, aber dann stürzte mit dem folgenden Fehler:

File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1912, in as_graph_def 
    raise ValueError("GraphDef cannot be larger than 2GB.") 
ValueError: GraphDef cannot be larger than 2GB. 

Ich dachte, nach dem Aufruf der Methode run_inference_on_image(images_folder+"/"+image) die vorherigen Bilddaten würden überschrieben, um nur die neuen Bilddaten zu berücksichtigen, was nicht der Fall zu sein scheint. Wie behebe ich dieses Problem?

Antwort

17

Das Problem hier ist, dass jeder Aufruf an run_inference_on_image() Knoten zu demselben Diagramm hinzufügt, das schließlich die maximale Größe überschreitet. Es gibt mindestens zwei Möglichkeiten, dieses Problem zu beheben:

  1. Die einfach, aber langsam Art und Weise ist eine andere Standarddiagramm für jeden Aufruf run_inference_on_image() zu verwenden:

    for image in list_of_images: 
        # ... 
        with tf.Graph().as_default(): 
        current_features = run_inference_on_image(images_folder+"/"+image) 
        # ... 
    
  2. Die mehr beteiligt, aber effizienter Weg ist es, run_inference_on_image() zu modifizieren, um auf mehreren Bildern zu laufen. Verschieben Sie Ihre for-Schleife in die Surround-Umgebung this sess.run() call, und Sie müssen nicht mehr das gesamte Modell bei jedem Aufruf rekonstruieren, was die Verarbeitung jedes einzelnen Bildes wesentlich beschleunigt.

+2

Ich ging mit der zweiten Option und es ist schneller. Danke für die Idee! – MedAli

+0

eine Frage obwohl, gibt es eine Möglichkeit, ein Array von Bildern statt nur einer im Vorhersageteil der sess.run '' 'Vorhersagen = sess.run (pool_3_tensor, {'DecodeJpeg/Inhalt: 0': image_data }) '' ' – MedAli

+1

Ich denke, dass bestimmte Feed-Punkt nur auf ein einzelnes Bild funktioniert. Es wäre möglich, das Diagramm so zu ändern, dass es einen Stapel von Bildern benötigt, aber dies würde das Erstellen eines Vorabruf-Threads erfordern (unter Verwendung von beispielsweise "tf.train.batch()"), um die Bilder zu einem Stapel zu kombinieren (was nötig wäre) alle haben die gleiche Größe) und fließen dann in einen etwas späteren Punkt im Netzwerk ein. Sie müssten das Argument 'input_map' für' tf.import_graph_def() 'verwenden, um den Tensor zu ändern, der als Eingabe verwendet wird. Da die Struktur dieses Graphen undokumentiert ist, könnte es schwierig sein ... – mrry

2

Sie können die create_graph() irgendwo vor dieser Schleife for image in list_of_images: bewegen (die Dateien Schleifen über).

Was es tut, ist Inferenz mehrmals in der gleichen Grafik durchzuführen.

+0

können Sie ein Beispiel für Klarheit zeigen? Vielen Dank. – Moondra

0

Der einfachste Weg ist create_graph() an der ersten der Hauptfunktion gesetzt. Dann erstellen Sie nur Grafik nur

Verwandte Themen