2016-11-15 3 views
2

Ich habe eine Echtzeit-Anwendung, in der ich Bilder klassifizieren, die aus einem Feed kommen, wenn sie ankommen. Das classify_images Beispiel hat:Run Tensorflow classify_image auf numpy array

image_data = tf.gfile.FastGFile(image, 'rb').read() 
#... 
with tf.Session() as sess: 
    predictions = sess.run(softmax_tensor, 
     {'DecodeJpeg/contents:0': image_data}) 

Wo image der Pfad zur Bilddatei ist. Ich lese jedoch keine Bilder aus einer Datei, sondern empfange sie als numpige Arrays. Was ist der beste Weg, um eine Tensorflow-Sitzung auf einem zuvor erworbenen Bild auszuführen? Es ist auch die beste Vorgehensweise, eine Sitzung und ein Diagramm im Voraus zu erstellen, und wenn ein neuer Rahmen erstellt wird, führen Sie die vorhandene Sitzung für das neue Bild aus, anstatt ein neues Diagramm und eine neue Sitzung zu erstellen.

Edit:

Ich habe versucht:

images_placeholder = tensorflow.placeholder(tensorflow.int32) 
predictions = sess.run(softmax_tensor, 
         {images_placeholder: image}) 

und es funktionierte! Danke Sygi!

Edit 2:

Dieser stürzt nach einer Weile ohne Fehlermeldung, und auch hat jeder Rahmen die gleichen Etiketten vorhergesagt. Ich erstelle sogar ein neues images_place-Objekt für jeden Frame, aber ich bekomme immer noch das gleiche Label.

+0

Übrigens, es ist eine gute Übung, Platzhaltern vordefinierte Form zu geben (wenn Sie es wissen) - das Debuggen von Formen wird dann einfacher. – sygi

+0

Was ist dein Image? Sie sollten jedes Mal verschiedene (Batch-) Bilder einspeisen. – sygi

+0

Es ist ein neues Bild, das Code-Snippet wird in einer Schleife aufgerufen und jedes Bild aus dem Video-Feed wird in die Variable 'image' gesetzt. –

Antwort

1

Was ist der beste Weg, um eine Tensorflow-Sitzung auf einem zuvor erworbenen Bild zu laufen?

Ich denke, der beste Weg, um ein tf.placeholder, verwenden Sie es in Ihrem Modell zu erstellen ist und am Ende in einem Feed dict die numpy Array übergeben.

ist die beste Praxis eine Sitzung und ein Diagramm zu erstellen vorher, und wann immer ein neuer Rahmen erworben wird, laufen die bestehende Sitzung auf das neue Bild, anstatt ein neues Diagramm zu erstellen und eine neue Sitzung?

Es ist besser, ein Diagramm und eine Sitzung wiederzuverwenden. Wenn Sie ein Diagramm erstellen, wird es "kompiliert", um den Code zu ändern, den Sie in eine effiziente GPU-Implementierung schreiben. Du erstellst viele Graphen - du verlierst eine Menge Zeit mit der gleichen "Kompilierung". Wenn Sie eine Sitzung wiederverwenden, können Sie außerdem Variablen wiederverwenden und verhindern, dass sie vom RAM zum GPU-Speicher hin und her übertragen werden.

+1

Das hat funktioniert, danke! Ich habe das OP mit der mitgelieferten Lösung bearbeitet. –

+0

Eigentlich stürzt dies nach einer Weile ab. Gibt keinen Fehler und es funktioniert nicht mehr. Außerdem gibt es mir jedes Mal die gleichen Etiketten. –