0

J'essayais de faire des prédictions sur gcloud ml-engine avec l'exemple tensorflow de détection d'objets d'animaux, mais cela ne fonctionne pas.tensorflow servant la prédiction ne fonctionnant pas avec la détection d'objets animaux de compagnie exemple

J'ai créé un poste de contrôle en utilisant cet exemple: https://github.com/tensorflow/models/blob/master/object_detection/g3doc/running_pets.md

Avec l'aide de l'équipe de tensorflow, j'ai pu créer un saved_model à télécharger sur le gcloud ml moteur: https://github.com/tensorflow/models/issues/1811

Maintenant, je peut télécharger le modèle sur le moteur ml gcloud. Mais malheureusement, je ne suis pas capable de faire des requêtes de prédiction correctes au modèle. Chaque fois que j'essaie une prédiction, je reçois la même erreur:

Input instances are not in JSON format. 

Je tentais de faire des prédictions en ligne avec

gcloud ml-engine predict --model od_test --version v1 --json-instances prediction_test.json 

et je tentais de faire des prévisions de lots avec

gcloud ml-engine jobs submit prediction "prediction7" 
    --model od_test 
    --version v1 
    --data-format TEXT 
    --input-paths gs://ml_engine_test1/prediction_test.json 
    --output-path gs://ml_engine_test1/prediction_output 
    --region europe-west1 

Je veux soumettre une liste d'images comme unit8-matrices, donc pour l'exportation j'utilisais le type d'entrée image_tensor.

Comme indiqué dans la documentation ici: https://cloud.google.com/ml-engine/docs/concepts/prediction-overview#prediction_input_data, l'entrée json devrait avoir un format particulier. Mais pas de format pour les prédictions en ligne, ni de format pour les prédictions par lots. Mes derniers tests étaient un seul fichier avec le contenu:

{"instances": [{"values": [1, 2, 3, 4], "key": 1}]} 

et le contenu:

{"images": [0.0, 0.3, 0.1], "key": 3} 
{"images": [0.0, 0.7, 0.1], "key": 2} 

aucun d'entre eux travaillaient. Quelqu'un peut-il m'aider, comment le format d'entrée devrait être?

modifier

L'erreur de traitement par lots est

{ 
    insertId: "1a26yhdg2wpxvg6" 
    jsonPayload: { 
     @type: "type.googleapis.com/google.cloud.ml.api.v1beta1.PredictionLogEntry"  
     error_detail: { 
      detail: "No JSON object could be decoded"  
      input_snippet: "Input snippet is unavailable."  
     } 
     message: "No JSON object could be decoded"  
    } 
    logName: "projects/tensorflow-test-1-168615/logs/worker" 
    payload: { 
     @type: "type.googleapis.com/google.cloud.ml.api.v1beta1.PredictionLogEntry"  
     error_detail: { 
      detail: "No JSON object could be decoded"  
      input_snippet: "Input snippet is unavailable."  
     } 
     message: "No JSON object could be decoded"  
    } 
    receiveTimestamp: "2017-07-28T12:31:23.377623911Z" 
    resource: { 
     labels: { 
      job_id: "prediction10"  
      project_id: "tensorflow-test-1-168615"  
      task_name: ""  
     } 
     type: "ml_job"  
    } 
    severity: "ERROR" 
    timestamp: "2017-07-28T12:31:23.377623911Z" 
} 
+0

Le message d'erreur que vous signalez semble provenir de 'gcloud ml-engine local predict', pouvez-vous confirmer? Si oui, quel est le message d'erreur renvoyé par le service? – rhaertel80

+0

vous avez raison, l'erreur semble provenir de gcloud, pas le modèle. –

+0

Ce message d'erreur se produit lorsque 'json.loads' déclenche un' ValueError'. Cela vous dérangerait-il de fournir une copie à un lien de notre fichier d'entrée? – rhaertel80

Répondre

1

Le modèle exporté accepte l'entrée comme suit pour la prédiction si vous utilisez gcloud pour soumettre vos demandes de gcloud ml-engine local predict ainsi que la prédiction par lots.

{"inputs": [[[242, 240, 239], [242, 240, 239], [242, 240, 239], [242, 240, 239], [242, 240, 23]]]} 
{"inputs": [[[232, 242, 219], [242, 240, 239], [242, 240, 239], [242, 242, 239], [242, 240, 123]]]} 
... 

Si vous envoyez les demandes directement au service (c.-à ne pas utiliser gcloud), le corps de la demande ressemblerait à ceci:

{"instances": [{"inputs": [[[242, 240, 239], [242, 240, 239], [242, 240, 239], [242, 240, 239], [242, 240, 23]]]}]} 
{"instances": [{"inputs": [[[232, 242, 219], [242, 240, 239], [242, 240, 239], [242, 242, 239], [242, 240, 123]]]}]} 

Le nom de tenseur d'entrée doit être « entrées "parce que c'est what we've specified dans les signatures.inputs.La valeur de chaque objet JSON est un tableau à trois dimensions comme vous pouvez le voir à partir de here. La dimension externe est None pour prendre en charge l'entrée par lot. Aucune "instance" n'est nécessaire (sauf si vous utilisez l'API http directement). Notez que vous ne pouvez pas spécifier "clé" dans l'entrée, sauf si vous modifiez le graphique pour inclure un espace réservé supplémentaire et le sortir intact à l'aide de tf.identity.

De même que mentionné dans the github issue, le service en ligne peut ne pas fonctionner en raison de la grande mémoire dont le modèle a besoin. Nous y travaillons.

+0

Malheureusement, cela ne fonctionne toujours pas. L'erreur est toujours 'Les instances d'entrée ne sont pas au format JSON. Voir "gcloud ml-engine predict --help" pour plus de détails. L'erreur est affichée très rapidement, il semble donc que le moteur ml donne cette erreur avant même que le modèle ne soit chargé. –

+0

Avez-vous des caractères cachés/invisibles dans les fichiers d'entrée? Pouvez-vous lancer json validator pour vous assurer qu'il est légitime json? – yxshi

+0

en ligne json validateurs dire que le fichier est correct –

0

je crois que le modèle particulier attend les données d'image binaires pour la prédiction.

J'attends votre demande serait quelque chose le long des lignes de:

{ 
    instances: [ 
    { "images": { "b64": "image-bytes-base64-encoded" }, "key": 1 }, 
    ... 
    ] 
} 

espoir qui aide à trouver une solution de travail. Faites-nous savoir si ce n'est pas le cas et je vais essayer de vous obtenir quelque chose de plus définitif.