2016-12-21 3 views
1

Ich möchte ein JPEG-Bild in Cloud-ml vorhersagen.Wie richtige Vorhersagen von JPEG-Bild in Cloud-ml machen

Mein Trainingsmodell ist das Anfangsmodell, und ich möchte die Eingabe an die erste Ebene des Graphen senden: 'DecodeJpeg/contents:0' (wo ich ein JPEG-Bild senden muss). Ich habe diese Schicht wie möglich Eingang eingestellt durch Zugabe in retrain.py:

inputs = {'image_bytes': 'DecodeJpeg/contents:0'} 
tf.add_to_collection('inputs', json.dumps(inputs)) 

Dann speichere ich die Ergebnisse der Ausbildung in zwei Dateien (Export und export.meta) mit:

saver.save(sess, os.path.join(output_directory,'export')) 

und ich schaffen Ein Modell in Cloud-ml mit diesen Dateien.

Wie in einigen Stellen vorgeschlagen (here, here und here von Google offiziellen Blog Wolke) Ich versuche, die Vorhersage mit

gcloud beta ml predict --json-instances=request.json --model=MODEL 

wo die Instanz ist das JPEG-Bild mit in base64 zu machen Format dekodiert :

python -c 'import base64, sys, json; img = base64.b64encode(open(sys.argv[1], "rb").read()); print json.dumps({"key":"0", "image_bytes": {"b64": img}})' image.jpg &> request.json 

jedoch die Anforderung mich zurück:

error: 'Prediction failed: ' 

Was ist das Problem meines Verfahrens? Hast du irgendwelche Vorschläge? ich insbesondere von this post Ich gehe davon aus, dass Cloud-ml automatisch das Base64-Bild im JPEG-Format konvertieren, wenn es eine Anfrage mit image_bytes liest. Ist es richtig? Sonst wie kann ich tun?

+0

Ich könnte weitere Informationen benötigen, um Ihnen besser zu helfen. Könnten Sie mir bitte Ihre Projektnummer, Modell- und Versionsnamen an [email protected] senden? – rhaertel80

Antwort

0

CloudML erfordert, dass Sie das Diagramm mit einem Stapel von Bildern einspeisen.

Ich bin mir ziemlich sicher, dass dies das Problem mit der Wiederverwendung von retrain.py ist. Siehe diesen Code sess.run line; es füttert ein einzelnes Bild auf einmal. Vergleichen Sie mit dem gebündelten JPEG-Platzhalter in flowers sample.

0

Beachten Sie, dass drei leicht unterschiedliche TF-Diagramme erstellt werden müssen: Training, Auswertung und Vorhersage. Details siehe this recent blog post. Die Trainings- und Vorhersagendiagramme verbrauchen direkt die Einbettung aus der Vorverarbeitung, so dass sie kein Inception-Diagramm enthalten. Für die Vorhersage müssen wir Bildbytes als Eingabe nehmen und Inception verwenden, um Einbettungen zu extrahieren.

Für die Online-Vorhersage müssen Sie das Vorhersagediagramm exportieren. Sie sollten auch die Ausgaben und einen Schlüssel für die Eingaben angeben.

Um die Vorhersage Graph (the code) zu bauen:

def build_prediction_graph(self): 
    """Builds prediction graph and registers appropriate endpoints.""" 
    tensors = self.build_graph(None, 1, GraphMod.PREDICT) 
    keys_placeholder = tf.placeholder(tf.string, shape=[None]) 
    inputs = { 
     'key': keys_placeholder.name, 
     'image_bytes': tensors.input_jpeg.name 
    } 

    tf.add_to_collection('inputs', json.dumps(inputs)) 

    # To extract the id, we need to add the identity function. 
    keys = tf.identity(keys_placeholder) 
    outputs = { 
     'key': keys.name, 
     'prediction': tensors.predictions[0].name, 
     'scores': tensors.predictions[1].name 
    } 
    tf.add_to_collection('outputs', json.dumps(outputs)) 

die preciction Diagramm zu exportieren:

self.model.export(tf.train.latest_checkpoint(self.train_path), self.model_path) 
0
:

def export(self, last_checkpoint, output_dir): 
    # Build and save prediction meta graph and trained variable values. 
    with tf.Session(graph=tf.Graph()) as sess:   
    self.build_prediction_graph() 
    init_op = tf.global_variables_initializer() 
    sess.run(init_op) 
    self.restore_from_checkpoint(sess, self.inception_checkpoint_file, 
           last_checkpoint) 
    saver = tf.train.Saver() 
    saver.export_meta_graph(filename=os.path.join(output_dir, 'export.meta')) 
    saver.save(sess, os.path.join(output_dir, 'export'), write_meta_graph=False) 

last_checkpoint auf die neueste Prüfpunktdatei von der Ausbildung zeigen muss

In Ihrem Beitrag haben Sie angegeben, dass Ihre Eingabensammlung nur "image" enthält _bytes "tensor alias. In dem Code, in dem Sie die Anfrage einrahmen, enthalten Sie jedoch zwei Eingaben: Einer ist "Schlüssel" und der andere ist "image_bytes".Also, mein Vorschlag wäre, "Schlüssel" aus der Anfrage zu entfernen oder "Schlüssel" zur Inputs-Sammlung hinzuzufügen.

Das zweite Problem ist, dass die Form von DecodeJpeg/Inhalt: 0 'ist(). Für Cloud ML müssen Sie eine Form wie (None,) haben, damit Sie diese einspeisen können.

Es gibt einige Vorschläge in anderen Antworten auf Ihre Frage hier, wie Sie den öffentlichen Posts folgen können um den Graphen zu ändern, aber ich kann diese beiden Probleme kurz erkennen.

Lassen Sie uns wissen, wenn Sie weitere Probleme auftreten.

Verwandte Themen